为什么以下代码会产生内存耗尽错误。

时间:2014-01-02 09:20:16

标签: php function class oop

我正在使用以下代码,如果我运行它会产生内存耗尽错误。

class A{
  public function who(){
   echo __CLASS__;
 }
 public function test(){
   echo $this->who();
 }
}

class B extends A{
 public function test(){
  $this->test();
 }
}

$obj = new B();
$obj->test();

输出

  

致命错误:允许的内存大小为134217728字节   (试图分配130968字节)在 [...] <...]

我期待函数重新声明错误而不是内存耗尽错误,因为父类和派生类以及父类都包含相同的方法。可以解释一下这背后的原因。?

5 个答案:

答案 0 :(得分:3)

当你这样做时:

class B extends A{
 public function test(){
  $this->test();
 }
}

这是一个递归调用,所以它是一个无限循环,这就是你有错误或Allowed memory size

的原因

请查看此代码以了解:

class A{
  public function who(){
   echo __CLASS__;
 }
 public function test(){
   echo $this->who();
 }
}

class B extends A{
 public function test(){
  parent::test();
 }
}

$obj = new B();
$obj->test();

如果调用方法$this->test(),php将不会使用“父”类。 查看“扩展”文档。 http://www.php.net/manual/en/keyword.extends.php

答案 1 :(得分:0)

您正在调用test()作为递归调用,

public function test(){
   $this->test();
 }

答案 2 :(得分:0)

你正在进行递归,我认为你需要调用parent ::

class A{
  public function who(){
   echo __CLASS__;
 }
 public function test(){
   echo $this->who();
 }
}

class B extends A{
 public function test(){
  parent::test();
 }
}

$obj = new B();
$obj->test();

答案 3 :(得分:0)

一次又一次地调用test(),如果要调用父测试方法,请使用parent::test()

B类正在扩展A类,并且在类B中重写了函数test(),因此除非函数定义发生更改,否则不需要在子类中重新定义该方法。

一旦你做了

$obj = new B();
$obj->test();

它将检查B类中是否存在定义,如果不存在,它将检查父类A,并且由于在那里定义了函数,您将获得输出

答案 4 :(得分:0)

在子类的$this->test()中调用test()没有意义。如果要使用完全相同的方法声明,则不要在子类中声明test()。由于它继承了方法,您可以从test()中删除B方法,但仍然可以调用B->test(),因此它将调用父类方法。

如果你想做任何其他事情,然后调用父方法,你可以简单地做:

class B extends A{
 public function test(){
  //some other things
  parent::test();
 }
}