2014-04-02 127 views
0

比方說,我有這樣的:鏈接方法和變量傳遞

class "classname" 
{ 

    .... 

    public function section($id) 
    { 
     // variable method name 
     $this->section->$id = new stdClass(); 
     return $this; 
    } 

    public function subsection() 
    { 
     // $id is not available here 
     $this->section->$id->subsection = array(); 
     return $this; 
    } 

    .... 

} 

當我打電話:

$classname->section("test") 
    ->subsection(); 

它不工作,因爲$ ID是不是全局和在第二ChainLink研究組。我必須手動將它傳遞給 - >小節($ id),還是有更通用/更清潔的方式來實現它?

我在這裏嘗試完成的是創建一個包含多個部分的(大)對象。在這些部分中,對象和/或數組有更多(鏈接)方法。

+0

你在哪裏聲明變量'$ id'?同時檢查該變量是否保存訪問說明符「protected」或「public」。 – Ranjith

+0

如果你發佈完整的代碼會更好 –

+0

你是否在你的'class Classname'中定義了類成員/變量/字段/ etc'$ section'?如果是這樣,它是什麼類型?它是否有一個名爲'$ id'的屬性,您可以設置? – Havelock

回答

3

你可以像這樣:

class Foo 
{ 
    protected $section; 
    private $lastUsedId = null; 

    public function __construct() 
    { 
     $this->section = new StdClass(); 
    } 

    public function section($id) 
    { 
     // variable method name 
     $this->section->$id = new StdClass(); 
     $this->lastUsedId = $id; 
     return $this; 
    } 

    public function subsection() 
    { 
     // $id is not available here 
     $this->section->{$this->lastUsedId}->subsection = array(); 
     return $this; 
    } 
} 

所以

$obj = (new Foo()) 
    ->section('one') 
    ->subsection() 
    ->section('two') 
    ->subsection(); 

會產生像

 
object(Foo)#1 (2) { 
    ["section":protected]=> 
    object(stdClass)#2 (2) { 
    ["one"]=> 
    object(stdClass)#3 (1) { 
     ["subsection"]=> 
     array(0) { 
     } 
    } 
    ["two"]=> 
    object(stdClass)#4 (1) { 
     ["subsection"]=> 
     array(0) { 
     } 
    } 
    } 
    ["lastUsedId":"Foo":private]=> 
    string(3) "two" 
} 

注意有效的結果,它不是用一個好主意像這樣鏈接 - 這是難以閱讀,並且,除此之外,實際上有變化的方法數據,但看起來像getter,很混亂。

+0

當dv_請不要沉默,讓我知道什麼是錯的 –

+0

它充滿了悲傷的人;-)我確實帶來了一些平衡,因爲我發現你的答案完全合法。 – Havelock

0

您面臨的問題不是因爲鏈接方法。它的發生要麼是因爲您尚未聲明屬性$section,或者您宣稱它沒有屬性$id

一種可能性是在你和$id做同樣的方式快速定義$section,即

public function section($id) { 
    $this->section = new stdClass(); 
    $this->section->id = new stdClass(); 
    return $this; 
} 

class Classname { 
    private $section; 

    public function __construct() { 
     $this->section = new stdClass(); 
    } 

    public function section($id) { 
     $this->section->id = new stdClass(); 
     return $this; 
    } 
} 

class Classname { 

    private $section; 

    public function __construct() { 
     $this->section = new B(); 
    } 

    public function section($id) { 
     $this->section->id = new stdClass(); 
     return $this; 
    } 
} 

class B { 

    private $id; 

} 
0

考慮使用2個類來完成你想要的。下面是一個例子

class Document 
{ 
    private $sections = array(); 

    public function addSection(Section $section) 
    { 
     $this->sections[] = $section; 
    } 

    public function getSections() 
    { 
     print_r($this->sections); 
    } 
} 

class Section { 

    private $id; 

    private $subsection; 

    public function setId($id) 
    { 
     $this->id = $id; 

     return $this; 
    } 

    public function setSubsection() 
    { 
     $this->subsection = array(); 

     return $this; 
    } 
} 

$section1 = new Section; 

$section1->setId(1)->setSubsection(); 

$section2 = new Section; 

$section2->setId(2)->setSubsection(); 

$document = new Document; 

$document->addSection($section1); 

$document->addSection($section2); 

$document->getSections(); 

將輸出

Array ( 

    [0] => Section Object ([id:protected] => 1 [subsection:protected] => Array()) 

    [1] => Section Object ([id:protected] => 2 [subsection:protected] => Array()))