Разрешено ли вызывать метод вызова в PHP?

например, у меня есть следующее:

class A{
__invoke(){
// return an instance of class A itself
}
}

так я могу сделать следующее?

new A()()()()... or (new A())()()()...

а какое здесь объяснение?
предположим, что версия PHP новее, чем 5.4

Хорошо, я могу дать немного больше объяснения, почему я спрашиваю:
Я использовал ganon.php, который является html dom-парсером с открытым исходным кодом.
Он использует синтаксис, такой как $ html_node (‘child_tag’), для возврата другого дочернего $ html_node, где $ html_node является экземпляром объекта класса HTML_NODE. Поэтому я подумал, смогу ли я использовать цепочку, чтобы сделать выборку во вложенной html структуре dom.

6

Решение

Я не думаю, что описанное вами поведение действительно работает, даже в PHP / 7:

class A{
public function __invoke($arg){
echo __METHOD__ . "($arg) called" . PHP_EOL;
}
}

$a = new A();
$a(0);
$a(1)(2)(3);
A::__invoke(0) called
A::__invoke(1) called
Fatal error: Function name must be a string

(демонстрация)

Вы, вероятно, смущены переменные функции особенность. Если foo() возвращает строку ‘bar’, затем foo()() равняется bar():

class A{
public function __invoke(){
return 'hello';
}
}

function hello($name) {
echo "Hello, $name!" . PHP_EOL;
}

$a = new A();
$a()('Jim');
Hello, Jim!

(демонстрация)

Вы можете связать это, пока ваши функции возвращают больше строк с допустимыми именами функций, но ни __invoke ни классы не играют никакой соответствующей роли:

function one() {
return 'two';
}

function two() {
return 'three';
}

function three() {
return 'four';
}

function four() {
echo 'Done!';
}

$a = one()()()();
Done!

(демонстрация)

Примечание: все приведенные выше фрагменты кода требуют PHP / 7, но их можно эмулировать с более ранними версиями, просто используя соответствующие скобки и промежуточные переменные.


Обновление на основе комментария Ульриха Экхардта: Я упустил из виду вернуть экземпляр класса А комментарий. Если вы действительно делаете это, код делает Работа:

class A{
public function __invoke($arg){
echo __METHOD__ . "($arg) called" . PHP_EOL;
return $this;
}
}

$a = new A();
$a(0);
$a(1)(2)(3);

class A{
public function __invoke($arg){
echo __METHOD__ . "($arg) called" . PHP_EOL;
return $this;
}
}

$a = new A();
$a(0);
$a(1)(2)(3);

(демонстрация)

Конечно, это синтаксис PHP / 7. Для более старых версий вам нужны вспомогательные переменные, которые разрушают магию:

$a = new A();
$b = $a(1);
$c = $b(2);
$d = $c(3);
$d(4);
4

Другие решения

Для версий PHP 7.0.0 - 7.0.4 вы можете использовать его как

class A{
public function __invoke($x){
return __FUNCTION__."$x";
}
}

echo (new A())(2);

Выход:

__invoke2
4

По вопросам рекламы [email protected]