配列とオブジェクトは相互変換が可能です。
たまに忘れそうになるので、メモっておきます。
キャストでobject に変換する。
連想配列(assoc array とか ハッシュ)を stcClass に変換する。
$obj = (object) $arr;
キャストでArrayに変換する。
$arr = (array) $obj;
実行例です。
array() → object
こちらがソース
<?php $arr = [ "name" => "takuya" ]; $obj = (object)$arr; var_dump( $arr ) ; var_dump( $obj ) ; echo "Hello {$obj->name} san.\n";
実行結果
array(1) { ["name"]=> string(6) "takuya" } object(stdClass)#1 (1) { ["name"]=> string(6) "takuya" } Hello takuya san.
うん、チャント変換されてる。
object → array もできる。ただし。プロパティだけ。
いくら、メソッドや関数がClosure対応になったと言っても、メソッドまでは取れませんね。
<?php class A { public $name = "takuya"; public function greeting(){ echo "Hello {$obj->name} san.\n"; } } $obj = new A(); var_dump( (array) $obj );
実行結果はコレ
takuya@~/Desktop$ php test.php array(1) { ["name"]=> string(6) "takuya" }
作ったクラスにはキャスト出来ない
ただし、自分で作ったクラスにはキャスト出来ない。
<?php class Test { public $name = "takuya"; public function greeting(){ echo "Hello {$obj->name} san.\n"; } } $arr = array("name" => "takuya") ; $obj = (Test)$arr; //=> syntax error
キャスト出来るのは、object や array int float と言った、言語定義の基本の「型」だけ。
PDOのfetch object でクラス指定できるんだから、出来てもイイようなもんだけど。出来ない。
使い所。
PDOでsqlite にアクセスしたり、json_decode/simpleXML でjson/XMLの結果をクラスに見せかけたり、配列に見せかけたりするのに便利。
stdClass と array は相互変換が可能なので、好みに応じて使い分ければいいと思う。
他にも
ArrayObjectだのSPLのArray Interfaceだの、get_object_vars だの色々使えば、クラスのメンバ変数を配列としてぶん回せて便利。
で、foreach 消し過ぎて読みにくいとdisられた悲しい思い出が蘇ったので、この辺で筆を置くことにする。