Я проводил некоторые тесты (чтобы заменить старый код) магическим методом __invoke, и я не уверен, что это ошибка или нет:
Предположим, у нас есть класс:
class Calc {
function __invoke($a,$b){
return $a*$b;
}
}
Следующее возможно и работает без проблем:
$c = new Calc;
$k = $c;
echo $k(4,5); //outputs 20
Однако если я хочу иметь другой класс для хранения экземпляра этого объекта, это не сработает:
class Test {
public $k;
function __construct() {
$c = new Calc;
$this->k = $c; //Just to show a similar situation than before
// $this-k = new Calc; produces the same error.
}
}
Ошибка возникает, когда мы пытаемся вызвать ее следующим образом:
$t = new Test;
echo $t->k(4,5); //Error: Call to undefined method Test::k()
Я знаю, что «решением» может быть использование функции внутри класса Test (с именем k) для «forward»вызов с использованием call_user_func_array, но это не элегантно.
Мне нужно хранить этот экземпляр внутри общего класса (для целей проектирования) и иметь возможность вызывать его как функцию из других классов ... есть предложения?
Обновление:
Я нашел что-то интересное (по крайней мере, для моих целей):
Если мы присвоим «переменную класса» локальной переменной, она будет работать:
$t = new Test;
$m = $t->k;
echo $m(4,5);