それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

stdClass と array の変換と object から arrayへの変換

配列とオブジェクトは相互変換が可能です。

たまに忘れそうになるので、メモっておきます。

キャストで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られた悲しい思い出が蘇ったので、この辺で筆を置くことにする。

関連資料

phpのクラスを連想配列に変える。 - それマグで!