Как связать методы в PHP?

jQuery позволяет мне связывать методы. Я также помню, что видел то же самое в PHP, поэтому я написал это:

class cat {
 function meow() {
 echo "meow!";
 }

function purr() {
 echo "purr!";
 }
}

$kitty = new cat;

$kitty->meow()->purr();

Не могу заставить цепь работать. Выдает фатальную ошибку сразу после мяу.


person netrox    schedule 25.09.2011    source источник
comment
Пример с котенком гораздо нагляднее ;-)   -  person sumid    schedule 31.01.2013


Ответы (4)


Чтобы ответить на ваш пример с кошкой, методы вашей кошки должны возвращать $this, который является текущим экземпляром объекта. Затем вы можете связать свои методы:

class cat {
 function meow() {
  echo "meow!";
  return $this;
 }

 function purr() {
  echo "purr!";
  return $this;
 }
}

Теперь вы можете сделать:

$kitty = new cat;
$kitty->meow()->purr();

Очень полезную статью по этой теме см. здесь: http://www.talkphp.com/advanced-php-programming/1163-php5-method-chaining.html

person Zachary Murray    schedule 25.09.2011
comment
Статья пропала. Вот последний рабочий архив. - person Majid Fouladpour; 01.12.2015

Поместите следующее в конце каждого метода, который вы хотите сделать «цепным»:

return $this;
person Tim Cooper    schedule 25.09.2011

Просто верните $this из вашего метода, т.е. (ссылку на) сам объект:

class Foo()
{
  function f()
  {
    // ...
    return $this;
  }
}

Теперь можно цеплять сколько душе угодно:

$x = new Foo;
$x->f()->f()->f();
person Kerrek SB    schedule 25.09.2011

да, используя php 5, вы можете вернуть объект из метода. Таким образом, возвращая $this (указывающий на текущий объект), вы можете добиться цепочки методов

person Ankush Jetly    schedule 20.04.2014
comment
Почему за это проголосовали? Тот же ответ, что и у остальных... - person Justin E; 12.06.2014