無名クラス
即時的なクラス宣言からオブジェクト(インスタンスオブジェクト)を実行時に動的に生成する機能
http://php.net/manual/ja/language.oop5.anonymous.php
PHP 7で追加された
stdClassとは完全に別物 ←重要
利用目的もまったく異なる
名前空間を占有せずに即時的に利用できるクラスを定義できる
プロダクションコードでのメリットはさしてないが、テストコードなどでは有用
内部的には無名クラスは特殊な構文から定義されるだけの普通のクラスなのだけど、気にしなくてもいいです
そのおかげで、後述するget_class()を使ったハックもできるしね
生成されるごとに別のクラスのインスタンスになる
code:php
<?php
$os = [];
foreach (range(1, 3) as $i) {
$os[] = new class{};
}
var_dump($os);
var_dump($os0 === $os1); // => false
var_dump($os0 === $os2); // => false
var_dump($os1 === $os2); // => false
クロージャのような変数スコープの仕組みはないので、動的に必要な値はコンストラクタから渡す
new class の直後に () を書くとコンストラクタ呼び出しの引数になる
code:php
$hoge = new class ("hoge") {
private $val;
public function __construct($val)
{
$this->val = $val;
}
public function getValue()
{
return $this->val;
}
};
$hoge->getValue() //=> "hoge"
では新しいインスタンスを作る方法がないのかと言ったらそんなこともなく、get_class()を使った裏技がある。
code:php
$class = get_class($hoge)
$piyo = new $class("piyo" => "piyopiyo")
$piyo->getValue()
// => [
// "piyo" => "piyopiyo",
// ]
実際には無名なのではなく、アクセスしにくいランダムな名前が動的に発行される