链接方法和传递变量

Kla*_*aaz 0 php oop class chain

假设我有这个:

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

    ....

}
Run Code Online (Sandbox Code Playgroud)

当我打电话时:

$classname->section("test")
    ->subsection();
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为 $id 不是全局的,也不是在第二个链链接中设置的。我是否必须手动将其传递给 ->subsection($id) 或者是否有更通用/更干净的方法将其传递到那里?

我在这里尝试完成的是创建一个具有多个部分的(大)对象。在这些部分中,对象和/或数组涉及更多(链接的)方法。

Alm*_* Do 5

你可以这样操作:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以

$obj = (new Foo())
   ->section('one')
   ->subsection()
   ->section('two')
   ->subsection();
Run Code Online (Sandbox Code Playgroud)

将产生有效的结果,例如

对象(Foo)#1 (2) {
  [“部分”:受保护]=>
  对象(stdClass)#2 (2) {
    [“一”]=>
    对象(stdClass)#3 (1) {
      [“小节”]=>
      数组(0){
      }
    }
    [“二”]=>
    对象(stdClass)#4 (1) {
      [“小节”]=>
      数组(0){
      }
    }
  }
  [“lastUsedId”:“Foo”:私人] =>
  字符串(3)“二”
}

请注意,以这种方式使用链接并不是一个好主意 - 它很难阅读,而且,拥有实际更改数据但看起来像 getter 的方法会令人困惑。