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) 或者是否有更通用/更干净的方法将其传递到那里?
我在这里尝试完成的是创建一个具有多个部分的(大)对象。在这些部分中,对象和/或数组涉及更多(链接的)方法。
你可以这样操作:
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 的方法会令人困惑。