【问题标题】:PHP class recursionPHP 类递归
【发布时间】:2014-10-22 21:00:51
【问题描述】:

我想问一下 PHP 对象中的递归是否得到了很好的处理,以及总体上是否可以接受。因为我宁愿拥有这个

class Human{

    public $pet;

    function setPet($pet){
        $this->pet = $pet;
    }

}

class Pet{
    public $owner;

    function __construct($owner){
        $this->owner = $owner;
    }
}

$a = new Human();
$b = new Pet($a);

$a->setPet($b);

比一组用户,然后将宠物的主人存储为 ID,在我需要获取宠物主人的情况下,我需要执行类似的操作

$arrayOfUsers[$pet->owner]

如您所见,这绝对不漂亮。与其他方法相比,这种递归是否节省内存?它安全吗?这是一种好的做法吗?

【问题讨论】:

  • 那些被称为“循环依赖”。他们被认为是一个代码错误。
  • 那不是递归。这只是一个嵌入另一个对象的对象。递归是指一系列函数/方法调用最终再次调用自己。例如function foo() { foo(); }
  • @tereško 如果这被认为是一个错误,那么如何以正确的方式实现此功能?我的意思是访问宠物的主人,如果我不能引用它?

标签: php oop recursion


【解决方案1】:

这与Recursion 无关。 如果人类有宠物,那么宠物就不能有人类,否则您将创建循环依赖,这是一种不好的做法。

如果你希望能够找到只有宠物的宠物主人,你可以试试这个。

1 从人类身上移除宠物。

class Human{
    public $field1;
    public $field2; 
    //etc
}

2 给宠物添加 Owner 的 id

class Pet{
   public $owner_id;

   function __construct($owner_id){
       $this->owner_id = $owner_id;
   }
}

    $owner = new Human();
    $pet = new Pet($owner->get_id());

这允许您:

  1. 如果您只有所有者(人类)并且想要检索害虫,只需使用 owner_id 对宠物的桌子进行查找。
  2. 如果您只有宠物并且想要重试所有者(人类),那么只需使用 owner_id 来查找所有者(人类)表。

但是我必须指出,在这种方法中,两个类之间的关系不是很清楚。 如果您只看 Human 类,您将无法判断它与 Pet 类有何关系。所以我相信一定有更好的方法来做到这一点

【讨论】:

  • 我认为这是递归,因为var_dump 是这么说的。
猜你喜欢
  • 2012-03-18
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 2016-03-15
  • 2012-08-10
  • 2021-10-02
  • 1970-01-01
相关资源
最近更新 更多