以下のページでは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 を行えば 各テーブルクラスのインスタンスからカラム名のプロパティでカラムデータが取得できる様になると思います。
 
  
コメント