無名クラス
PHP 7で追加された
利用目的もまったく異なる
名前空間を占有せずに即時的に利用できるクラスを定義できる 内部的には無名クラスは特殊な構文から定義されるだけの普通のクラスなのだけど、気にしなくてもいいです そのおかげで、後述する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 クロージャのような変数スコープの仕組みはないので、動的に必要な値はコンストラクタから渡す 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->getValue()
// => [
// "piyo" => "piyopiyo",
// ]
実際には無名なのではなく、アクセスしにくいランダムな名前が動的に発行される