以下のページではPHPのクラス(Class)に存在しない プロパティ へのアクセスが可能になる様に マジックメソッド の __get(), __set(), __isset(), __unset() を宣言してクラスを拡張しました。
⇒PHP クラス(Class)のプロパティの使い方について(__get(), __set())
さて、このクラスに配列データをそのままプロパティとして設定する関数を追加します。
この関数では、配列データの キー をプロパティ名、 データ をプロパティの値として設定します。 (処理の実体は自分の中の __set() メソッドを利用します。)
<?php class test { // 宣言していないプロパティ退避用配列 private $arrProp = array(); public function __get($name) { // 退避配列にデータが存在するか? if (isset($this->arrProp[$name])) { // データを返す return $this->arrProp[$name]; } else { return NULL; } } public function __set($name, $value) { // 退避配列にデータを設定 $this->arrProp[$name] = $value; } public function __isset($name) { // 退避配列内の存在チェック return isset($this->arrProp[$name]); } public function __unset($name) { if (isset($this->arrProp[$name]) == true) { // 退避配列内のunset unset($this->arrProp[$name]); } } // 配列のデータをプロパティ的に退避 public function setArray($arr) { if (is_array($arr)) { foreach ($arr as $key => $val) { $this->__set($key, $val); } } } } // クラス生成 $obj = new test(); // テスト用配列 $arrTest = array("prop1" => 100, "prop2" => "ABCDE", "prop3" => array("111", "222", "333")); // テスト用配列をプロパティ的に退避 $obj->setArray($arrTest); // プロパティとして取得 echo "<pre>"; var_dump($obj->prop1); var_dump($obj->prop2); var_dump($obj->prop3); echo "</pre>"; ?>
これを実行するとブラウザに以下の様に表示されます。 プロパティ「$prop1」「$prop2」「$prop3」の値が設定されていることが分かります。
int(100) string(5) "ABCDE" array(3) { [0]=> string(3) "111" [1]=> string(3) "222" [2]=> string(3) "333" }
配列をプロパティ的に使う例としては、データベースのテーブルの1レコードの内容をプロパティとして退避する場合があると思います。 以下にその例を示します。
あるデータベースに「test」テーブルが存在し、主キーとして「id」があるとします。その「id = 1」の1行データを取得することにします。 このソースの前にはデータベースへの接続が在りますが、今回は割愛してあります。 (ソース上は「$db」に接続後のPDOインスタンスが生成されたとしています)
<?php ... // クラス生成(クラスのソースはこの前で読込済みとする) $obj = new test(); // SQL文を準備:「:id」がプレースホルダー $sql = 'SELECT * FROM test WHERE id = :id'; // PDOStatementクラスのインスタンス生成 $pre = $db->prepare($sql); // SQL文の「:id」を「1」に置き換え $pre->bindValue(':id', 3, PDO::PARAM_INT); // プリペアドステートメントを実行する $pre->execute(); // PDO::FETCH_ASSOCは、テーブルカラム名をキーとして連想配列にデータを取得 $row = $pre->fetch(PDO::FETCH_ASSOC); if ($row) { // テーブル行データ配列をプロパティ的に退避 $obj->setArray($arrTest); // この後でカラム名でプロパティとしてアクセスできる $w = $obj->XXXXXX; // XXXXXX:カラム名 } ... ?>
この結果 $obj->XXXXXX の様にしてテーブルのカラム名でデータが取得できる様になります。
各テーブルごとにこの「test」クラスを基底としたクラスを作成し、その中でレコード取得関数を作り setArray を行えば 各テーブルクラスのインスタンスからカラム名のプロパティでカラムデータが取得できる様になると思います。
コメント