【问题标题】:Have I found a bug in PHP or have I missed something? [duplicate]我是否在 PHP 中发现了一个错误,或者我错过了什么? [复制]
【发布时间】:2011-12-02 22:02:24
【问题描述】:

可能重复:
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();
?>

此代码输出“你好,我是 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 :)你好,我是 foo :)

为什么?是bug吗?

【问题讨论】:

  • 由于 stackoverflow 错误,我在 pastebin 上放了第二个代码 (lol) - cl.ly/3J352B14073S15282O2s
  • 这不是 PHP 中的错误,也不是 StackOverflow 中的错误。
  • 一般来说,如果您的问题假设(即使您只是顺便提及)您使用的语言存在错误,而不是在您编写的代码中。

标签: php constructor php4


【解决方案1】:

因为你调用了 foo2 两次,function foo2() in foo2 它是一个构造函数。

【讨论】:

【解决方案2】:

正确的答案不是foo2中的function foo2()是构造函数,虽然确实是构造函数。

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

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


因为您调用了两次foo3(),所以foo3 中的function foo3()constructor Docs

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

第一次通话:

$x = new foo3;

第二次通话:

$x->foo3f();

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

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

【讨论】:

  • +1,您实际上首先正确地创造了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 2018-03-02
  • 1970-01-01
  • 2023-03-07
  • 2021-12-20
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多