Объединение вызовов методов вместе

Например, для меня понятна запись типа: property3->property2->property1, это означает, что свойство класса является объектом другого класса, например:

class a {
        public $property1 = "some";
}


class b {
    function __construct () {
        $this->property2 = new a();
    }           
}

$obj = new b();
echo $obj->property2->property1;

это понял. но я не могу понять такие записи: method1()->method2()->method3()

Вы можете разместить простой пример, кто использует эти записи?


person Oto Shavadze    schedule 21.10.2012    source источник
comment
Этот метод заканчивается на return $this;.   -  person Alain Tiemblo    schedule 22.10.2012
comment
@Ninsuo: Не всегда. Методы возвращают объект, не обязательно тот же объект, который их вызвал.   -  person Madara's Ghost    schedule 22.10.2012


Ответы (2)


Простой пример:

class A {

  function fooA() {
    echo "a...";
    return $this;
  }

  function fooB() {
    echo "b...";
    return $this;
  }

  function fooC() {
   echo "c...";
  }
}

$a = new A();
$a->fooA()->fooB()->fooC();

Или с несколькими классами:

class A
{
  private $b;

  public function __construct()
  {
    $this->b = new B();
  }

  public function fooA()
  {
    echo "A...";
    return $this->b;
  }

}

class B
{

  public function fooB()
  {
    echo "B...";
  }

}

$a = new A();
$a->fooA()->fooB();
person Alain Tiemblo    schedule 21.10.2012
comment
Опять же, вы даете неполную картину. Не всегда метод возвращает $this, и он волшебным образом объединяется в цепочку. - person Madara's Ghost; 22.10.2012

Это означает, что эти функции возвращают объекты. Например, возможно следующее (при условии, что $ pdo является допустимым объектом PDO):

$result = $pdo->query("SELECT * FROM `table`")->fetchAll();

Это не всегда может быть благоприятным, потому что вы:

  1. Потеряйте читабильность.
  2. Потеряйте способность использовать предметы между ними.
  3. Потеряйте способность проверять наличие ошибок, и вы рассчитываете на методы, которые вернут то, что вы думаете.

    В этом примере вы получаете только набор результатов в виде array, но вы не можете получить доступ к PDOStatement, который возвращается PDO::query(). В этом случае это может не иметь значения, в некоторых случаях может.

    Кроме того, PDO::query() может вернуть BOOLEAN false в случае ошибки, что приведет к необъяснимой ошибке «Метод fetchAll(), используемый для не-объекта».

person Madara's Ghost    schedule 21.10.2012
comment
Другая потенциальная проблема заключается в том, что query () не выполняется и возвращает логическое значение ошибки, а не объект ... сильный аргумент для созданных исключений. - person Mark Baker; 22.10.2012
comment
@MarkBaker: Ну, если уж вдаваться в подробности, вам следовало бы включить PDOExceptions :) - person Madara's Ghost; 22.10.2012
comment
@MarkBaker Что-то идет не так в цепочке методов, поэтому я бы никогда не стал ее использовать. И это не только про pdo, но и в целом. +1 - person PeeHaa; 22.10.2012
comment
@Madara - просто указание для будущих читателей, которые могут не думать об этой возможности или рассмотреть возможность использования свободного интерфейса в другом коде ... но при правильном использовании свободный интерфейс может быть очень мощным и простым - person Mark Baker; 22.10.2012