Я проводил некоторые тесты (для замены старого кода) с помощью магического метода __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) для «переадресации» вызова с использованием call_user_func_array, но это не элегантно.
Мне нужно сохранить этот экземпляр внутри общего класса (для целей дизайна) и иметь возможность вызывать его как функцию из других классов... есть предложения?
Обновлять:
Я нашел кое-что интересное (по крайней мере, для моих целей):
Если мы назначим «переменную класса» в локальную переменную, это сработает:
$t = new Test;
$m = $t->k;
echo $m(4,5);