2010-02-21 39 views
12

Thông thường, trong nhiều khung công tác, bạn có thể tìm thấy các ví dụ tạo truy vấn bằng cách sử dụng trình tạo truy vấn. Thông thường, bạn sẽ thấy:Chuỗi phương pháp PHP OOP

$query->select('field'); 
$query->from('entity'); 

Tuy nhiên, trong một số khuôn khổ bạn cũng có thể làm điều đó như thế này

$object->select('field') 
     ->from('table') 
     ->where(new Object_Evaluate('x')) 
     ->limit(1) 
     ->order('x', 'ASC'); 

Làm thế nào để bạn thực sự làm loại này của chuỗi?

Trả lời

18

Đây được gọi là Fluent Interface - có example in PHP trên trang đó.

Ý tưởng cơ bản là mỗi phương pháp (mà bạn muốn để có thể chuỗi) của lớp đã trở lại $this - mà làm cho có thể gọi các phương pháp khác của cùng một lớp trên trở $this.

Và, tất nhiên, mỗi phương thức có quyền truy cập vào các thuộc tính của cá thể hiện tại của lớp - nghĩa là mỗi phương thức có thể "thêm một số thông tin" vào cá thể hiện tại.

+0

Bạn được chào đón :-) ;; có, mỗi phương thức có thể thiết lập/thay đổi các thuộc tính và phương thức "cuối cùng" thường được sử dụng để "thực hiện" bất kỳ phương thức nào trước đây được gọi để định cấu hình. –

+0

Không chắc chắn sử dụng giao diện thông thạo sẽ luôn làm cho mã dễ đọc hơn ;;; khi nó được sử dụng để xây dựng một số truy vấn SQL, ví dụ, nó có ý nghĩa; nhưng khi các phương pháp không thực sự liên quan, không chắc chắn - phụ thuộc vào tình huống, tôi giả sử ;;; một điều tuyệt vời là ngay cả khi các phương thức của bạn trả về '$ this', chúng có thể được gọi là" theo cách thông thường ". –

+0

Có phải trả lại '$ this' không? Không thể trả lại '$ đó' và tiếp tục từ đó? –

2
class c 
{ 
    function select(...) 
    { 
    ... 
    return $this; 
    } 
    function from(...) 
    { 
    ... 
    return $this; 
    } 
    ... 
} 

$object = new c; 
7

Về cơ bản, bạn phải làm cho mỗi phương thức trong lớp trả lại Ví dụ:

<?php 

class Object_Evaluate{ 
    private $x; 
    public function __construct($x){ 
     $this->x = $x; 
    } 
    public function __toString(){ 
     return 'condition is ' . $this->x; 
    } 
} 
class Foo{ 
    public function select($what){ 
     echo "I'm selecting $what\n"; 
     return $this; 
    } 
    public function from($where){ 
     echo "From $where\n"; 
     return $this; 
    } 
    public function where($condition){ 
     echo "Where $condition\n"; 
     return $this; 
    } 
    public function limit($condition){ 
     echo "Limited by $condition\n"; 
     return $this; 
    } 
    public function order($order){ 
     echo "Order by $order\n"; 
     return $this; 
    } 
} 

$object = new Foo; 

$object->select('something') 
     ->from('table') 
     ->where(new Object_Evaluate('x')) 
     ->limit(1) 
     ->order('x'); 

?> 

này thường được sử dụng như kẹo mắt tinh khiết nhưng tôi cho rằng nó có tập quán có giá trị của nó là tốt.

+0

Trường hợp sử dụng: '$ setup = $ Object-> add_component ($ component_property) -> configure ($ component_properties);' Where Object :: add_component() trả về đối tượng Component mà nó được thêm dưới dạng thuộc tính của $ Object (ví dụ: mảng) và được cấu hình bằng phương thức Component :: configure(). Không có chuỗi, chúng ta sẽ phải xác định rằng phần tử cuối cùng được thêm vào mảng $ Object-> Components, sau đó lấy đối tượng Component theo cách đó. – AVProgrammer

+0

@AVProgrammer - Ví dụ của bạn không sử dụng 'return $ this', phải không? –

+0

Có, đối tượng Component thực hiện điều này, để cho phép phương thức configure(). – AVProgrammer

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