Как назначить метод экземпляра класса переменной?

Скажи, что я здесь:

class Foo
{
    public function test()
    {
        // I'm here!
    }

    private function pow() {}
}

Я хочу объявить локальную переменную, которая ссылается на метод $this->pow. Я попробую:

$pow = $this->pow;

Это не работает:

Notice: Undefined property: Foo::$pow

Как сослаться на метод экземпляра класса в PHP?


Мне это нужно, потому что мне нужно передать функцию анонимной функции внутри test. Я не могу передать $this анонимной функции, потому что использую PHP 5.3, а это стало возможным только в PHP 5.4. Кроме того, функция pow не является общедоступной, поэтому я не могу назначить $this промежуточной переменной и передать ее анонимной функции.


person Hubro    schedule 29.04.2013    source источник
comment
Вы должны попробовать call_user_func   -  person Rakesh Sankar    schedule 29.04.2013
comment
По крайней мере, верните число или строку в функцию pow(), чтобы она что-то делала :)   -  person Jimbo    schedule 29.04.2013
comment
pow не является свойством вашего кода, это метод класса   -  person Mark Baker    schedule 29.04.2013


Ответы (1)


Если pow равно public, как в вашем примере, вы можете просто сделать это:

$self = $this;
$invokePow = function() use ($self) { $self->pow(); };

// ... some time later ...
$invokePow(); // calls pow()

Вы также можете сделать то же самое, передав array($this, 'pow') как вызываемый и вызывая его с помощью call_user_func.

Если pow не public, вам просто не повезло.

Однако, если у вас есть возможность обновиться до 5.4, все становится намного проще:

$invokePow = function() { $this->pow(); };

Вам не нужно явно захватывать $this, и вы можете вызывать $invokePow из любого контекста (даже вне класса).

person Jon    schedule 29.04.2013