こんにちは!
ナビゲータの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)今回は、きれいなプログラムができていないので、前回掲載したプログラムを流用しています。
タグ:コンストラクタ