например, у меня есть следующее:
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.
Я не думаю, что описанное вами поведение действительно работает, даже в 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);
Для версий PHP 7.0.0 - 7.0.4
вы можете использовать его как
class A{
public function __invoke($x){
return __FUNCTION__."$x";
}
}
echo (new A())(2);
Выход:
__invoke2