2017-07-24 19 views
-1

比方說,我有一個建立場的一類,我想要做這樣的事情:可能創建一個帶子鏈的類方法鏈?

$section = new Group('services'); 
$section 
    ->addRepeater('showcase') 
    ->setMinRows(3) 
    ->addField('text') 
    ->addField('image') 
    ->endRepeater() 
    ->endGroup(); 

我知道有方法鏈接可以返回使用$this父實例,但我不知道這是否是可能鏈接子類。

例如,如果addRepeater返回一個Repeater類實例,我可以在其上運行方法,但是如何獲取它返回的數據並將其存儲在父類Group類中?

回答

1

例如,如果addRepeater返回直放站類的實例,我可以運行在該 方法,但再怎麼我把它返回的數據並將其存儲在父Group類?

你不行。你要麼返回AB,所以你不能直接混合鏈。通過邏輯,addRepeater()不應該返回RepeaterGroup如果addField()Repeater方法,那麼你需要外鏈吧:

$repeater = (new Repeater('showcase')) 
    ->setMinRows(3) 
    ->addField('text') 
    ->addField('image') 
    ->endRepeater(); 

$section = new Group('services'); 
$section 
    ->addRepeater($repeater) 
    ->endGroup(); 

或使Repeater相關的方法需要轉發的對象(它使用外鏈建設)作爲參數等。

0

您可以通過將Group對象傳遞給中繼器來實現。所有你需要記住的是對象總是通過引用傳遞的,所以你在子類中做的任何改變都可以在父類中使用。

class Repeater 
{ 
    private $name; 
    private $group; 
    private $fields = []; 

    public function __construct($name, Group $group) 
    { 
     $this->name = $name; 
     $this->group = $group; 
    } 

    public function addField($field) 
    { 
     $this->fields[] = $field; 

     return $this; 
    } 

    public function endRepeater() 
    { 
     return $this->group; 
    } 
} 

class Group 
{ 
    private $name; 
    private $repeaters = []; 

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

    public function addRepeater($name) 
    { 
     $repeater = new Repeater($name, $this); 

     $this->repeaters[] = $repeater; 

     return $repeater; 
    } 

    public function endGroup() 
    { 
     echo 'group ended'; 
    } 
} 

$section = new Group('services'); 
$section 
    ->addRepeater('showcase') 
    ->addField('test') 
    ->addField('test 1') 
    ->endRepeater() 
    ->addRepeater('another repeater') 
    ->addField('something') 
    ->addField('something else') 
    ->endRepeater() 
    ->endGroup(); 

var_dump($section); 

結果會是這樣的

object(Group)#1 (2) { 
    ["name":"Group":private]=> 
    string(8) "services" 
    ["repeaters":"Group":private]=> 
    array(2) { 
    [0]=> 
    object(Repeater)#2 (3) { 
     ["name":"Repeater":private]=> 
     string(8) "showcase" 
     ["group":"Repeater":private]=> 
     *RECURSION* 
     ["fields":"Repeater":private]=> 
     array(2) { 
     [0]=> 
     string(4) "test" 
     [1]=> 
     string(6) "test 1" 
     } 
    } 
    [1]=> 
    object(Repeater)#3 (3) { 
     ["name":"Repeater":private]=> 
     string(16) "another repeater" 
     ["group":"Repeater":private]=> 
     *RECURSION* 
     ["fields":"Repeater":private]=> 
     array(2) { 
     [0]=> 
     string(9) "something" 
     [1]=> 
     string(14) "something else" 
     } 
    } 
    } 
} 
+0

啊,我沒想到!謝謝你的提示,我會玩弄它。 –

相關問題