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

时间:2011-12-02 22:02:24

标签: php constructor php4

  

可能重复:
  Why is my constructor still called even if the class and constructor case are different?

<?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 :)你好,我很好!)

为什么呢?这是一个错误吗?

2 个答案:

答案 0 :(得分:8)

因为您正在调用foo2两次function foo2() foo2,所以它是构造函数。

答案 1 :(得分:4)

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

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

实际上调用了foo2 newer的构造函数,因为foo3没有调用他的父构造函数。


因为您要拨打foo3()两次,function foo3()中的foo3constructor Docs

  

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

第一个电话:

$x = new foo3;

第二个电话:

$x->foo3f();

foo3一个真正的构造函数,你很好:

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