こんにちは!
ナビゲータのEVEです。
EVEシステムの最初のプログラムとして、DBの接続処理をコンストラクタに仕込もうとしていますが、最初っから悩んでいます。30分ぐらいで簡単に作ろうとしたのですが・・・。
[なんで悩んでいる]
データベースを検索、更新、削除、追加などデータベースを操作するには、必ず、データベースに接続すると言う行為が発生します。その条件だけを聞くと、コンストラクタに処理を入れればいいや!っと単純に考えるのですが、それが意外と難しいことに気づきました。
今回、EVEシステムへ接続するためには、以下の条件があります。
●データベース名、ホスト名などは可変としたい(場合によっては、文字コードも・・・)。
条件は、一点だけなのですが、コンストラクタの制約でこれが難しいことが分かります。
コンストラクタとは、インスタンス作成時に自動で起動するメソッドです。そのため、引数も戻り値も設定できません。その条件を考えると、どうしても、可変として設定したい変数は、どこかに事前に定義しなくてはいけません。
困ったな〜♪っと思いながら、サンプルプログラムを見たら、インスタンス作成する時に、引数を指定できることに気づきました・・・。思い込みって恐ろしい・・・。
[コンストラクタでデータベースに接続できない]
コンストラクタで、データベースに接続できないかやってみたのですが、無理ですね・・・。結局、データベースに接続する処理は、コンストラクタの外に出しました。こんな感じです。コンストラクタって、変数を定義ぐらいしかできませんでしたっけ?
<?php
class getDB {
//プライベート変数定義
private $setDb; //データベース名
private $setHost; //ホスト名
private $setChar; //文字コード
private $setUser; //ユーザ名
private $setPass; //パスワード
private $setPara; //接続条件を編集する
//パブリック変数定義
public $getDbConnect;
public function __construct(string $selectDb,string $selectHost,string $selectChar,string $selectUser,string $selectPass) {
//取得した変数を変数として再定義する
$this->setDb = $selectDb; //データベース名
$this->setHost = $selectHost; //ホスト名
$this->setChar = $selectChar; //文字コード
$this->setUser = $selectUser; //ユーザー名
$this->setPass = $selectPass; //パスワード
//接続条件を編集する
$this->setPara = "mysql:dbname=".$this->setDb."; host=".$this->setHost."; charset=".$this->setChar.";";
}
//データベースへ接続する
public function connectDb():PDO {
//データベースへ接続する
try {
static $getDbConnect; //接続コネクタ
return $getDbConnect;
} catch (PDOException $e) {
return $e->getMessage();
} finally {
$getDbConnect = null;
}
}
}
?>
できないと判断したのは、public function connectDb():PDO の「:PDO」をコンストラクタに指定するとエラーになります。これを指定しないと、データベースへ接続できませんし・・・。ということで、本日のところは、こんな感じで作ってみました。まだまだ、改良の余地はあるようです。
[分からないことだらけ]
まず、作ったクラスのメソッドをどう呼ぶんだっけっというところから始まっています。 これは、インターネットで調べればすぐにわかるのですが、次に、メソッド内での変数の定義ができない???確か、変数ってスコープがあって、あるメソッドから見える変数が別のメソッドで見ることができないなどあったと思いましたが、メソッドの中に変数定義できませんでしたっけ?いろいろ調べてみると、privateとpublicでは定義できませんでしたが、staticとglobalで定義できます。globalっていう識別子ってあったっけ???っと疑問を持ちながら、試行錯誤しています。
それと、PDOで接続する時MySQLってクローズする必要がないって知っていました???データベース接続時に作成したオブジェクトにnullを設定すれば、それで、データベースがクローズされるようです。ほんまかいな???
[簡単に作るはずが・・・]
簡単に作るはずが、これだけのプログラムに、2時間以上時間がかかってしまいました。そして、まだ、「独習PHP」を読み終えていないので、多分知らないこと満載なんだと思います。とりあえず、1週間ぐらいかけて、オブジェクト指向のPHPに慣れていきたいと思います。
価格:3,740円 |
これから、出かける準備をします!
では、また!!!