PHPではstring型やint型などのスカラー値を配列にキャストできることは知っていたが、先日、object型の値を配列にキャストすると妙な変換をされることを知った。 integer型、float型、string型、boolean型、resource型はそれぞれ、そのキャストされるスカラー値を持つ要素数1の配列になるだけだが、object型だけはそうならない。


例えばstring型では以下のようになる。

<?php
$var = 'この文字列が変換されます。';

$array = (array)$var;
var_dump($array);
?>
array(1) {
	[0]=>
	string(39) "この文字列が変換されます。"
}

integer型、float型、boolean型、resource型は同じように変換されるのだが、object型では以下のようにメンバ変数を要素に持つ配列に変換される。

<?php
class TestClass {
	public $MEMBER_A;
	private $MEMBER_B;
	protected $MEMBER_C;
}

$var = new TestClass();
$array = (array)$var;
var_dump($array);
?>
array(3) {
	["MEMBER_A"]=>
	NULL
	["\0TestClass\0MEMBER_B"]=>
	NULL
	["\0*\0MEMBER_C"]=>
	NULL
}

「\0」となっている部分はNULLで、通常、ブラウザでは表示されない。

それぞれのメンバ変数はアクセス権ごと違った名前を付けられる。

アクセス権名前
public"メンバ変数名"
private"\0クラス名\0メンバ変数名"
protected"\0*\0メンバ変数名"

各ブラウザで<pre>タグの中に表示してみると以下のようになる。

IE
Firefox
Safari
Opera

IE、Safariでは'\0'を無視して表示するが、Firefox、Operaではおかしな表示になっている。 もしobject型の値を配列にキャストしたものを表示したいということがあれば、以下のようにNULLを別の文字列に置換してから表示すると良い。

<?php
class TestClass {
	public $MEMBER_A;
	private $MEMBER_B;
	protected $MEMBER_C;
}

$var = new TestClass();
$array = (array)$var;
//出力をキャッシュ
ob_start();
var_dump($array);
$str = ob_get_clean();

//NULLを変換して出力
print str_replace("\0", '\\0', $str);
?>

しかし、このobject型の値を配列にキャストする際の動作はいったいどんなときに役に立つのだろう? 配列にキャストすることで配列の関数が使えたり、配列にキャストしたものをobject型にキャストし直すことで、何か役に立つことがあるのかもしれないが、具体的にどういうときに使えるのかわからない。