忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP クラス(Class)のプロパティの使い方についてその2(__get(), __set(), __isset(), __unset())


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












PR

コメント

コメントを書く