2014-04-02 85 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()))