Nesne Üyesi olarak PHP Callable Nesne

3 Cevap php

I have a class Logger which, among other things has a method Log.
As Log is the most common use of the Logger instance, I have wired __invoke to call Log

Başka bir sınıf, "Site" üyesi "Giriş", Logger bir örneğini içerir.

Neden bu iş olur:

$Log = $this->Log;  
$Log("Message");

Ama bu:

$this->Log("Message");

The former fails with "PHP Fatal error: Call to undefined method Site::Log()"
Is this a limitation of the callable object implementation, or am I misunderstanding something?

3 Cevap

Bunu yapamazsınız aynı nedenler:

$value = $this->getArray()["key"];

ya da bu

$value = getArray()["key"];

PHP sözdizimi çok iyi kısa eli yapmaz çünkü.

Ne yazık ki, bu (hala) PHP bir sınırlama olduğunu, ama bunu düşünmek zaman bir sınıf özelliklerini ve adlarını paylaşabilirsiniz yöntemler içerebilir gibi mantıklı. Örneğin:

<?php
class Test {
    public $log;

    public function __construct() {
        $this->log = function() {
            echo 'In Test::log property';
        };
    }

    public function log() {
        echo 'In Test::log() method';
    }
}

$test = new Test;
$test->log(); // In Test::log() method
call_user_func($test->log); // In Test::log property
?>

PHP arzu sözdizimi izin olsaydı, hangi işlevi çağrılır olurdu? Ne yazık ki, sadece call_user_func[_array]() (veya kopyalama $this->log başka bir değişkene ve bu çağırarak) bize bırakır.

Aşağıdaki sözdizimi kabul edilebilir Ancak, bu güzel olurdu:

<?php
{$test->log}();
?>

Ama ne yazık ki, öyle değil.

Bu işe yarayabilir:

${this->Log}("Message");

Ama belki de tam aramayı kullanmak için sadece daha kolay ve daha iyi? Eğer bir satır üzerinde çalışmak istediklerini almak için bir yol olarak orada görünmüyor.

Sorunuzu hata o yok sınıfında tanımlanan bir işlev arıyor gösterir. Bir Invokable nesne bir fonksiyon değildir, ve bu durumda biri olarak kabul edilemez görünüyor.