2012-02-15 3 views
0

Типичный способ использования:

<?php 

class A { 
    public $var; 

    public function __construct($var){ 
    $this->var = $var; 
    } 

    public function do_print(){ 
    print $this->var; 
    } 
} 

?> 

$obj = new A('Test'); 
$obj->do_print(); // Test 

Как я могу реализовать что-то вроде:

$obj->var->method(); 

И почему это полезно?

+1

'$ obj-> варьировали>()' не является полезным на всех из-за бессмысленной. Например, 'var' должен быть объектом с методом method(). То, что вы, скорее всего, ищете, - это http://stackoverflow.com/search?q=method+chaining+php – Gordon

ответ

5

делая var объект другого класса, вы можете приковать вызовы методов друг с другом.

<?php 
    class Foo { 
     public $bar; 
     public function __construct(Bar $bar) { 
      $this->bar= $bar; 
     } 
    } 

    class Bar { 
     private $name; 
     public function __construct($name) { 
      $this->name = $name; 
     } 
     public function printName() { 
      echo $this->name; 
     } 
    } 

    $bar = new Bar('Bar'); 
    $bar2 = new Bar('Bar2'); 
    $foo = new Foo($bar); 

    $foo->bar->printName(); // Will print 'Bar'; 
    $bar2->printName(); // Will print 'Bar2' 

Вы можете использовать это для аккуратных вещей, как Dependency Injection

Кроме того, он может сделать код Бетт читаемым и понятным, потому что вы не должны буфера переменных, прежде чем принимать вызовы методов их и может просто вызвать один метод за другим.

Посмотрите на этот пример:

$obj = new MyObject(); 
$db = $obj->getDb(); 
$con = $db->getCon(); 
$stat = $con->getStat(); 

Что может быть написано, как это с помощью метода построения цепочки:

$obj = new Object(); 
$stat = $obj->getDB()->getCon()->getStat(); 

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

Итак, всегда есть две стороны. Это просто еще один стиль программирования.

Просто убедитесь, что не к цепи слишком долго в одной строке, как вы определенно потерять обзор. Метод

БАД

$obj->meth('1', $arg2, array('arg2'))->method2($whaterver, array('text' => $bla_text))->andSoOn(); 

ХОРОШО

$obj->meth('1', $arg2, array('arg2')) 
    ->method2($whaterver, array('text' => $bla_text)) 
    ->andSoOn(); 
+0

, является ли метод цепочки делает код более читаемым предметом обсуждения. есть много людей, которые так не думают. – Gordon

+0

Я, например, считаю, что метод-цепочка выглядит намного читабельнее.Почему вы думаете об обратном @Gordon (если вы действительно против метода-цепочки для лучшей читаемости)? – Flukey

+0

Это зависит от того, как вы его используете. Как только вы назовете одну и ту же цепочку в два раза, это будет плохо по производительности POV. Но из читаемости я тоже не вижу большого недостатка ... Но я хочу учиться! –

2

Ваш класс может быть чем-то сложным, как человек, у которого есть адрес (как и у другой компании класса). Адрес класс сам по себе, так что вы хотите позвонить

$person->adress->makeLabel(); 

или

$company->adress->makeLabel(): 

Вы можете осуществить это, сделав объект на человека (или компании) класса, так же, как вар :

Class Person{ 
    public $address; 

    public function __construct(){ 
    $this->address = new address(); 

    } 
}