2012-04-30 1 views
3

я видел в некоторых библиотеках что-то вроде этого:PHP OOP Multicall

$this->getResponse()->setRedirect($returnUrl); 

Как это «multicall» сделано, или, как должен быть класс строить, чтобы сделать что-то вроде этого?

Я думаю:

class greeting 
{ 
    public function hi() 
    { 
     public function howAreYou() 
     { 
      echo 'How are you?'; 
     } 
    } 
} 
$greet = new greeting; 
$greet->hi()->howAreYou(); 

Но я думаю, что это не так хорошо, я бы лучше использовать что-то вроде проходит, но я не знаю. Thx для ваших предложений.

ответ

4

Если это экземпляр класса, называющая себя, это называется «метод цепочки».

В PHP можно сделать, используя return $this; обратите внимание, что это совсем другой механизм, чем наследование класса - на самом деле не имеет смысла рассматривать их как взаимозаменяемые.

Смотрите также: https://stackoverflow.com/search?q=method+chaining+php

3

getResponse() возвращает экземпляр класса, который имеет метод setRedirect().

Пример:

class Foo 
{ 
    public function getResponse() 
    { 
     $redirect = new Bar(); 
     return $redirect; 
    } 
} 

class Bar 
{ 
    public function setRedirect($returnUrl) 
    { 
     // do something 
    } 
} 

$foo = new Foo(); 

$foo->getResponse()->setRedirect("returnUrl"); 
2

No.

Все, что вам нужно сделать, это Самовозврат в самом конце каждой функции.

Так Ваш пример будет, как>

class greeting 
{ 
    public function hi() 
    { 
     echo "Hi"; 

     return $this; 
    } 

    public function howAreYou() 
    { 
     echo 'How are you?'; 

     return $this; 
    } 
} 

$greet = new greeting; 
$greet->hi()->howAreYou(); 

Или даже:

$greet->hi()->howAreYou()->hi()->howAreYou(); 
+3

Ключевое слово вы искали это ** метод цепочки **. :-) – YMMD

+0

Я думаю, вы имеете в виду '$ this', а не' self' (ваш пример кода верен). – Piskvor

+0

@YMMD yep, я прочитал его после того, как отправил свой ответ в другом ответе, который я больше не могу найти (кто-то удалил его?). Во всяком случае, я всегда был низко с теорией, я довольно практичен ... :-) – shadyyx

1

методы СЦЕПЛЕНИЕ не то же самое, как объявления функций в методе ... на самом деле последний будет плевать (не объявление функции, а способ ее вызова). Для того, чтобы цепи метод, просто он возвращает сам объект:

Class chainableObject 
{ 
    public $name=null; 
    public function __construct($name='') 
    { 
     $this->name=$name; 
     return $this; 
    } 

    public function setName($name) 
    { 
     $this->name = $name; 
     return $this;//makes chainable 
    } 

    public function greet() 
    { 
     echo 'Hello, '.$this->name; 
     return $this; 
    } 
} 

$chain = new chainableObject('Frank')->greet();//outputs: Hello, frank 

Объяснение: Все методы возвращают сам экземпляр, поэтому в основном, прочитать последнюю строку фрагмента кода, как это [создать объект с именем: Frank] => вызов метода приветствия по возвращаемому значению этого действия. Поскольку возвращаемое значение $this, объект, который имеет метод приветсвия, это то, что будет ... просто, для получения дополнительной информации: только Google метода PHP формирования цепочки

1
class stutter{ 
     public function a(){ 
     echo 'h'; 
     return $this; 
    } 
     public function b(){ 
     echo 'hello world!'; 
    } 
    } 

$ переменного = новое заикания(); var-> a() -> b();

Выход:

ч привет мир