Örnekleme yapmak ve PHP bir lokma bir yöntemi çağırmak nasıl?

4 Cevap

Ben bu iki yolu denedim:

(new NewsForm())->getWidgetSchema();

{new NewsForm()}->getWidgetSchema();

Hayır şans ile ...

4 Cevap

Bir instanciation ve bir öğretim yılında bir yöntem çağrısı yapamaz ... Ama "hile" için bir yolu ile çalışıyoruz sınıfının bir örneğini döndürür bir işlev oluşturmak için - ve sonra, bir yöntem çağrısı bir nesne döndüren fonksiyonu:

function my_function() {
    return new MyClass();
}
my_function()->myMethod();

Ve durum bu tür, yararlı bir hile vardır: sınıflar ve işlevler isimleri isimleri aynı ad ait değil - you can have a class and a function that have the same name anlamına gelir: onlar değil çatışma olacak!

Yani, siz, bir sınıf olarak aynı ada sahip bunu instanciates ve bu örneği döndüren bir işlev oluşturabilirsiniz:

class MyClass {
    public function myMethod() {
        echo 'glop';
    }
}

function MyClass() {
    return new MyClass();
}

MyClass()->myMethod();

(Yeah, the name of the function is not that pretty, in this example -- but you see the point ;-) )

PHP bunu yapmak için izin vermez. Deneyin:

function giveback($class)
{
    return $class;
}

giveback(new NewsForm())->getWidgetSchema();

Bu dil ile oldukça garip cilvesi.

Bu sadece bu yapabileceğiniz statik bir yöntem ise:

NewsForm::getWidgetSchema();

Bence daha iyi bir seçenek factory yöntemini kullanmak olacaktır:

class factory_demo {
    public static function factory()
    {
        return new self;
    }
    public function getWidgetSchema()
    { }
}

o zaman

factory_demo::factory()->getWidgetSchema()

Tabii ki, siz de fabrika deseni tüm faydaları olsun. Eğer kod erişimi var ve bunu değiştirmek için istekli ise ne yazık ki bu sadece çalışır.