首先 - 我的英语不好,所以我希望你能理解。我有问题涉及嵌套对象结构的方法链接。
我正在尝试创建某种带有对象和子列表的列表,这些列表可以动态创建。到目前为止我有这个代码:
interface IData {}
class root {
public function __construct( root $proxy = null ) {
$this->proxy = $proxy;
}
public function __destruct() {
if( !is_null( $this->proxy ) ) {
unset( $this->proxy );
}
}
public function OpenList() {
$list = new field_list( $this );
$this->data[] = $list;
return $list;
}
public function CloseList() {
return $this->proxy;
}
public function Add() {
$this->data[] = new field();
return $this;
}
private $proxy = null;
private $data = array();
}
class field_list extends root implements IData {
public function __construct( root $proxy ) {
parent::__construct( $proxy );
}
public function __destruct() {
parent::__destruct();
}
}
class field implements IData {}
我正在使用我的代码如下:
$root = new root();
$root->OpenList()->Add()->CloseList()->OpenList()->Add()->Add()->Add()->OpenList()->Add();
我可以附加到$ root字段对象(class field
),但也可以打开新列表(class field_list
)并将字段对象追加到上一个打开的列表中。
我想知道我创建的对象引用($proxy
)是否会导致内存泄漏问题,以及此代码是否存在任何性能问题。 (编辑:)当我print_r($root);
我在输出中得到递归时,我不知道它是否是我的对象结构的某种类型的问题。
root Object(
[proxy:root:private] =>
[data:root:private] => Array
(
[0] => field_list Object
(
[proxy:root:private] => root Object
*RECURSION*
[data:root:private] => Array
(
[0] => field Object
(
)
)
)
[1] => field_list Object
(
[proxy:root:private] => root Object
*RECURSION*
[data:root:private] => Array
(
........
)
)
)
)
谢谢
答案 0 :(得分:2)
之前我见过链式方法调用,我认为我从未遇到任何问题。在内存泄漏方面,我怀疑是否存在问题,因为与C ++或Java等语言不同,您不必处理内存。你已经注意写了一个析构函数,所以我怀疑会有问题。
由于您只创建了一个实例,因此它应该仅引用属性$ proxy的1个实例,所以我认为这可能没问题。