我是不是在PHP中发现了一个错误,或者我错过了什么


Have I found a bug in PHP or have I missed something?

可能重复:
为什么即使类和构造函数的情况不同,我的构造函数仍然被调用?

<?php
 abstract class foo {
  function foof() {
   echo "Hello, I'm foo :)";
  }
 }
 class foo2 extends foo {
  function foo2f() {
   $this->foof();
  }
 }
 class foo3 extends foo2 {
  function foo3f() {
   $this->foo2f();
  }
 }
 $x = new foo3;
 $x->foo3f();
?>

这段代码输出"Hello,I’m foo:("(正如预期的那样(,但当我将代码更改为这样的内容时:http://pastebin.com/wNeyikpq

<?php
abstract class foo {
 function fooing() {
  echo "Hello, I'm foo :)";
 }
}
class foo2 extends foo {
 function foo2() {
  $this->fooing();
 }
}
class foo3 extends foo2 {
 function foo3() {
  $this->foo2();
 }
}
$x = new foo3;
$x->foo3();
?>

PHP打印:

你好,我是foo

为什么?是虫子吗?

因为您要调用foo2两次,所以foo2中的function foo2()是一个构造函数。

正确的答案不是foo2中的function foo2()是构造函数,尽管它确实是构造函数。

答案是foo3()是在new foo3()中调用的构造函数。此构造函数调用方法foo2()

实际上foo2更新的构造函数被调用,因为foo3没有对其父构造函数的调用。


因为您要调用foo3()两次,所以foo3中的function foo3()是一个构造函数Docs:

为了向后兼容性,如果PHP 5找不到给定类的__construct((函数,它将根据类的名称搜索旧样式的构造函数。

第一次呼叫:

$x = new foo3;

第二次通话:

$x->foo3f();

foo3一个真正的构造函数,你就可以了:

class foo3 extends foo2 {
 function __construct() {};
 function foo3() {
  $this->foo2();
 }
}