Anonim Sınıflar

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