Anonim sınıflar için destek PHP7'de eklendi. Anonim sınıflar basit, tek seferlik nesnelerin oluşturulması gerektiğinde kullanışlıdır.
<?php
// PHP 7 öncesi kod
class Logger
{
public function log($msg)
{
echo $msg;
}
}
$util->setLogger(new Logger());
// PHP 7 sonrası kod
$util->setLogger(new class {
public function log($msg)
{
echo $msg;
}
});
Değiştirgelerini kurucularına iletebilir, diğer sınıfları genişletebilir, arayüzleri gerçekleyebilir ve normal bir sınıf gibi nitelikleri kullanabilirler:
<?php
class SomeClass {}
interface SomeInterface {}
trait SomeTrait {}
var_dump(new class(10) extends SomeClass implements SomeInterface {
private $num;
public function __construct($num)
{
$this->num = $num;
}
use SomeTrait;
});
Yukarıdaki örneğin çıktısı:
object(class@anonymous)#1 (1) { ["Command line code0x104c5b612":"class@anonymous":private]=> int(10) }
Anonim bir sınıfı başka bir sınıfta yerleştirmek, herhangi bir özel veya korunan yönteme veya bu dış sınıfın özelliklerine erişim sağlamaz. Dış sınıfın korumalı özelliklerini veya yöntemlerini kullanabilmek için, anonim sınıf dış sınıfı genişletebilir. Dış sınıfın anonim sınıftaki özel özelliklerini kullanmak için kurucusundan geçirilmesi gerekir:
<?php
class Outer
{
private $prop = 1;
protected $prop2 = 2;
protected function func1()
{
return 3;
}
public function func2()
{
return new class($this->prop) extends Outer {
private $prop3;
public function __construct($prop)
{
$this->prop3 = $prop;
}
public function func3()
{
return $this->prop2 + $this->prop3 + $this->func1();
}
};
}
}
echo (new Outer)->func2()->func3();
Yukarıdaki örneğin çıktısı:
6
Aynı anonim sınıf bildirimiyle oluşturulan tüm nesneler, bu sınıfın örnekleridir.
<?php
function anonymous_class()
{
return new class {};
}
if (get_class(anonymous_class()) === get_class(anonymous_class())) {
echo 'aynı sınıf';
} else {
echo 'farklı sınıf';
}
Yukarıdaki örneğin çıktısı:
aynı sınıf
Bilginize:
Aşağıdaki örnekte gösterildiği gibi, anonim sınıflara motor tarafından bir ad verildiğini unutmayın. Bu isim, güvenilmemesi gereken bir gerçekleme ayrıntısı olarak görülmelidir.
<?php
echo get_class(new class {});Yukarıdaki örnek şuna benzer bir çıktı üretir:
class@anonymous/in/oNi1A0x7f8636ad2021