TECHBLOG

PHP > PHP一般

php の object != class

Create:

Update:

Category:PHPPHP一般

概要

php のオブジェクト型は便利なのでよく使用しますが、php object型 の説明で class を用いて説明しておられるサイトがよくありますが、class = object型 では、ありません。

object は string や int 、booolen のような型で、classでなくても使用できます。また、配列とも違います。

phpの配列とオブジェクト

違いますが、ほぼ同じです。

// 配列
$arr = [
	'a' => 'A',
	'b' => 'B',
	'bb' => 'BB',
];
// オブジェクト
$obj = (object) [
	'a' => 'A',
	'b' => 'B',
	'bb' => 'BB',
];

それぞれを表示する場合

// 配列
echo $arr['a'];
// オブジェクト
echo $obj->a;

配列とオブジェクトの違い

上記を array_column する場合も array_keys する場合も記述は同じで、同じ値が返ってきます。。

$res1 = array_keys($arr);
$res2 = array_keys($obj);

ループしたときの違い

foreach($arr as $k => $v) {
	$v = 'add_' . $v;
}
var_dump($arr);
foreach($obj as $k => $v) {
	$v = 'add_' . $v;
}
var_dump($obj);

上記の dump した結果は異なります。

$arr は、もとの値が返ってくるのに対し、$obj->a は、add_A、$obj->b は、add_B が返ってきます。

class のインスタンスを作成したとき、プロパティも同じ挙動ですので納得です。

動的に配列やオブジェクトの値を取得する場合の違い

下記のように記述すると $res3、$res4 は同じ値が返ってきます。

$b = 'b';
$res3 = $arr[$b];
var_dump($res3);
$res4 = $obj->{$b};
var_dump($res4);

下記の $res6 は正しい値がとれません。エラーなります。

$res5 と $res7 は同じ値です。

$b = 'b';
$res5 = $arr['b' . $b];
var_dump($res3);
$res6 = $obj->b . {$b};
var_dump($res6);
$res7 = $obj->{'b' . $b};
var_dump($res7);

View 側での表示

twig(symfony系)、blade(Larabel)、php(WordPress)とViewの形式は色々ありますが、できるだけ View を統一したいという思いから、弊社では、オブジェクト型で統一しています。

twigとblade
{{ $res->a }}
wordpress テンプレート
<?= $res->a ?>

PHP(WordPress)でも <?php echo $res->a; ?> とは記述せずに、上記を使用しています。

loading