我正在使用以下代码,如果我运行它会产生内存耗尽错误。
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字节)在 [...] <...] 行
我期待函数重新声明错误而不是内存耗尽错误,因为父类和派生类以及父类都包含相同的方法。可以解释一下这背后的原因。?
答案 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();
}
}