こんにちは!
ナビゲータのEVEです。
本日は、先週データベース接続するクラスを作ったので、そのデータベース接続するクラスに、検索メソッドを作ろうと、文字通り 悪戦苦闘 していました。いろいろやること数時間・・・。やっと動作しない原因が分かりました。悪戦苦闘した理由は、public function connectDb():PDO内のメソッドから、 returnで渡していた値 を、クラス内の publicプロパティへ設定しよう としたところからこの苦労が始まりました。下記プログラムに取り消し線付きのreturnがありますが、まさにそれがそのreturn(※1)です。
<?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;
}
}
}
?>
[どんなエラー]
エラーメッセージは以下の通り。
Fatal error: Uncaught TypeError: getDB::connectDb(): Return value must be of type PDO, none returned
よく見ると「Return value must be of type PDO」って書いてありましたね・・・。そうです。このエラーメッセージを見落としたため、プログラミングに数時間余計な時間をかけてしまいました。
ただ、言い訳をさせていただくと、returnが必須の関数なんて今までありませんでしたから・・・。そして、このエラーが出るまでは、いろいろなエラーメッセージが表示され、何がなんだか分からない状態・・・。そのため、このエラーもそのものズバリのエラーと言うことに気づくのにかなり時間がかかってしまいました。
[今日目指したモノ]
前回は、ドライバからデータベース接続メソッド、connectDb()を呼びだしてみたのですが、このconnectDb()はSQL文を発行する場合必ず使います。それを、ドライバにいちいち記述するのは、 処理が冗長的 になってしまいます。そのため、Select、Insert、Update、Deleteのそれぞれの頭で実施しようと考えました。ただ、ブログを書いていて気づきましたが、connectDb()において、返却値を正しく返すように記述すれば、connectDb()を コンストラクタ に書いてもエラーにならないことが分かりました。
[あとがき]
本日作ったプログラムは、明日、きれいにして、具体的に解説します。やはり、PHPでオブジェクト指向のプログラムを作るには、慣れるまでに時間がかかりそうです。
では、また!
※1)今回は、きれいなプログラムができていないので、前回掲載したプログラムを流用しています。
タグ: コンストラクタ