2012-07-20 61 views
0

首先的 - 我的英语不好,所以我希望您能理解。我有问题涉及嵌套对象结构的方法链接。OOP在PHP方法链

我试图创造某种与动态创建本身的对象和子列表列表。到目前为止,我有这样的代码:

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(); 

我可以追加到$根字段对象(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

你的脚本工作了多久?为什么它会导致泄漏? – zerkms 2012-07-20 02:51:52

+0

@zerkms我编辑了我的问题。希望你能解释* RECURSION *问题。谢谢 – 2012-07-20 16:06:53

+4

从英文角度来看这篇文章最糟糕的部分是你的第一句话。 “我的英文不好”是不正确的用法。其次,如果你比英语母语者使用英语更好,并且说“我的英语不好”,那么它就会变得居高临下,令人反感。我不知道为什么这么多非母语的人坚持使用这句话。 – 2012-07-20 16:10:04

回答

2

我见过的链接方法之前调用,我不认为我一生中遇到的任何问题。就内存泄漏而言,我怀疑是不是有问题,因为与C++或Java等语言不同,您不必处理内存。你已经注意写一个析构函数,所以我怀疑会有问题。

因为要创建只有1个实例,应该仅指财产$代理的1个实例,所以我想这可能是确定。