[英]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.