簡體   English   中英

鏈接方法和傳遞變量

[英]Chaining methods and passing variables

假設我有這個:

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既不是全局的,也不是在第二個鏈接中設置的。 我是否必須手動將其傳遞給-> subsection($ id)還是有更通用/更干凈的方法來實現?

我在這里試圖完成的工作是創建一個具有多個部分的(大)對象。 在這些部分中,對象和/或數組是這樣的,因此涉及更多(鏈接的)方法。

您可以這樣操作:

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"
}

請注意,以這種方式使用鏈接不是一個好主意-很難讀取,此外,擁有一種實際上會更改數據但看上去像吸氣劑的方法令人困惑。

您面臨的問題不是由於鏈接方法。 發生這種情況的原因可能是因為您尚未聲明屬性$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;

}

考慮使用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( )))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM