为什么返回new static()导致内存泄漏? (php)

时间:2018-09-16 08:06:12

标签: php inheritance

我试图进行测试,看看在面向对象的php中static()和self()彼此之间是如何不同的,所以我编写了以下简单代码:     

class Base{
  public function __construct(){
//    return new self();
    return new static();
  }
}

class Sub extends Base {
  public function foo(){
    echo 'yes';
  }
}

$obj = new Sub();
$obj->foo();

但是奇怪的是,基类中的两个关键字(self / static)似乎都没有达到我的预期。我期望的是使用self并使用static修复该错误。但是现在,两者都给出了错误:

  

已允许用完xxxx字节的内存大小(试图分配xxxx字节)

我搜索了此错误,据说这是程序中“内存泄漏”的结果,但是我找不到允许该泄漏的位置。

P.S:也许我不太了解自我和静态?据我了解,自我是指“包含类”,而静态是指“调用类”。

1 个答案:

答案 0 :(得分:1)

感谢在我的问题下的评论,我认为我现在可以看到此代码中的错误。我试图在实践中看到“后期静态绑定”,所以我编写了这段代码,但是后来我看到了此错误,并认为PHP中的后期静态绑定存在问题。像往常一样,我错了。这里的重点是,实际上,问题不在于后期的静态绑定。问题是由于我的代码中的继承结构不好。

当调用return new static();时,PHP尝试实例化调用的类(因此,后期的静态绑定可以正常工作),它是Sub类,但是由于继承,并且因为我没有重写Sub中Base的构造函数,PHP将尝试一次又一次地调用Base类,因此它变成了无限循环。