2010-09-22 36 views
5

Ok, Tôi đã được xem một số mã nguồn php và cần phải biết cách lớp sau và các phương pháp sử dụng tác phẩm tiểu:Bất cứ ai có thể giải thích cách thức hoạt động của nó?

<?php 
$me = new Person; 
$me->name("Franky")->surname("Chanyau")->phone("+22", "456 789"); 
?> 

tôi có kiến ​​thức khá vững chắc của OOP vì vậy tôi không muốn có một 101. Tôi chỉ cần biết cách làm cho mã trên có thể.

Cheers Franky

+0

* (liên quan) * [Phương pháp Chaining] (http : //stackoverflow.com/search? q = method + chaining + php) – Gordon

+1

Kỹ thuật này cũng có thể được sử dụng để thực hiện Giao diện thông thạo: http://en.wikipedia.org/wiki/Fluent_interface –

+0

@Dennis Haarbrink - Tốt. Tôi chưa bao giờ nghe nói về thuật ngữ đó trước đây. Cảm ơn các liên kết. –

Trả lời

12

Phương pháp chaining là có thể, bởi

return $this; 

ở phần cuối của phương pháp này.

Giải thích ở đây: phpandstuff: Method Chaining Plus Magic Setters

Những phương pháp này thường được thiết lập một biến dụ và sau đó chỉ trả $ này.

public function phone($param) { 
    $this->phone = $param; 
    return $this; 
} 
+0

+1 để sử dụng chuỗi từ khóa. –

+0

Ok, do đó, nó cũng sẽ có thể để chuỗi phương pháp nhưng thay vì trả lại $ này, bạn trả lại một đối tượng bạn tạo ra? –

+0

@Franky đó là có thể nhưng nghiêm túc nói Phương pháp Chaining trả về đối tượng lưu trữ. Khi bạn bắt đầu trả về các đối tượng khác nhau, bạn sẽ đi theo hướng của Giao diện thông thạo (để tạo DSL). Hai điều này thường bị nhầm lẫn. – Gordon

3

phương pháp name()surname()phone() trả về một thể hiện của Người. bạn có thể thực hiện điều này bằng cách

return $this; 

có lẽ hầu hết các phương pháp này giống như thế này:

public function name($name) { 
    $this->name = $name; 
    return $this; 
} 
3

như một số người khác cho biết, một giao diện chất lỏng của nó http://en.wikipedia.org/wiki/Fluent_interface#PHP Ý tưởng cơ bản là một methof của một lớp luôn trả về đối tượng tự

class Car { 
    private $speed; 
    private $color; 
    private $doors; 

    public function setSpeed($speed){ 
     $this->speed = $speed; 
     return $this; 
    } 

    public function setColor($color) { 
     $this->color = $color; 
     return $this; 
    } 

    public function setDoors($doors) { 
     $this->doors = $doors; 
     return $this; 
    } 
} 

// Fluent interface 
$myCar = new Car(); 
$myCar->setSpeed(100)->setColor('blue')->setDoors(5); 

(qua wiki)

+0

Nó không phải. Có sự khác biệt về khái niệm giữa * chỉ * Phương pháp Chaining và Giao diện thông thạo. Phương thức Chaining, theo định nghĩa của Fowler, trả về đối tượng Host. Giao diện thông thạo nhằm tạo ra một DSL. Giao diện thông thạo có thể sử dụng Chuỗi phương pháp (trong số các kỹ thuật khác), nhưng Chuỗi phương pháp không phải là Giao diện thông thạo. Một ví dụ về giao diện thông thạo sẽ là 'Zend_Db_Table':' $ table-> select() -> from ('foo') -> ở đâu ('bar = baz') -> assemble(); ' – Gordon

+0

bạn nói đúng, không phải mỗi lần tôi sử dụng phương pháp Chaining một giao diện chất lỏng của nó nhưng tôi sẽ không đi xa như vậy để nói nếu đó là những gì anh ta muốn thực hiện một giao diện chất lỏng hoặc chỉ ... Điện thoại – Hannes

0

Ý tưởng là nếu chúng ta trả về $ this thì chúng ta có thể kết nối các phương thức đối tượng với nhau. Dưới đây là giải pháp:

<?php 

    class Person 
    { 
     private $strName; 
     private $strSurname; 
     private $ArrPhone = array(); 

     public function name($strName) 
     { 
      $this->strName = $strName; 
      return $this; // returns $this i.e Person 
     } 

     public function surname($strSurname) 
     { 
      $this->strSurname = $strSurname; 
      return $this; // returns $this i.e Person 
     } 

     public function phone() 
     { $this->ArrPhone = func_get_args(); //get arguments as array 
      return $this; // returns $this i.e Person 
     } 

     public function __toString() 
     { 
      return $this->strName." ".$this->strSurname.", ".implode(" ",$this->ArrPhone); 
     } 
    } 

    $me = new Person; 
    echo $me->name("Franky")->surname("Chanyau")->phone("+22", "456 789"); 

?> 
0

câu trả lời đúng, nhưng để làm cho công việc mã bạn nên viết:

$me = new Person(); 

thay vì

$me = new Person; 
+1

http://php.net/manual/ vi/language.types.object.php - Trên thực tế .. Hãy xem tài liệu php chính thức, họ không sử dụng() để khởi tạo một đối tượng mới. Bạn chỉ cần các dấu ngoặc để gửi các biến đến phương thức __construct() của lớp. –

Các vấn đề liên quan