2010-02-21 81 views
12

通常,在很多框架中,可以找到使用查詢構建器創建查詢的示例。通常你會看到:方法鏈PHP OOP

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

然而,在一些框架也可以做這樣的

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

你如何真正做到這一點種類鏈?

回答

18

這被稱爲Fluent Interface - 該頁面上有一個example in PHP

的基本思路是,每種方法(要能夠鏈)之類的必須返回$this - 這就有可能呼籲返回$this同一類的其他方法。

而且,當然,每種方法都可以訪問當前類實例的屬性 - 這意味着每種方法都可以爲當前實例「添加一些信息」。

+0

不客氣:-) ;;是的,每種方法都可以設置/更改屬性,而「最後」方法通常用於「執行」任何前面調用的方法進行配置。 – 2010-02-21 19:23:43

+0

不確定使用流暢的界面會使代碼更易於閱讀;;;例如,當它用於構建一些SQL查詢時,它是有道理的;但是當方法沒有真正相關時,不太確定 - 取決於情況,我想;;;一件好事就是即使你的方法返回'$ this',他們也可以被稱爲「典型的方式」。 – 2010-02-21 19:25:17

+0

它是否必須返回'$ this'?它不能返回'$ that'並從那裏繼續? – 2014-04-07 17:16:46

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

$object = new c; 
7

基本上,你必須在每類方法返回的實例:

<?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'); 

?> 

這通常被用來作爲純眼睛糖果,但我想它有它的用途有效,以及。

+0

用例:'$ setup = $ Object-> add_component($ component_property) - > configure($ component_properties);'Object Object :: add_component()返回它作爲$ Object屬性添加的Component對象(例如,數組),並使用Component :: configure()方法進行配置。如果沒有鏈接,我們必須確定添加到$ Object-> Components數組的最後一個元素,然後以這種方式獲取Component對象。 – AVProgrammer 2012-09-21 00:32:11

+0

@AVProgrammer - 你的例子沒有使用'return $ this',是嗎? – 2012-09-22 19:09:21

+0

是的,Component對象執行此操作以允許configure()方法。 – AVProgrammer 2012-09-24 20:57:22