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

发布于 2024-12-19 04:51:32 字数 949 浏览 0 评论 0 原文

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

<?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 :)你好,我是 foo :)

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

Possible Duplicate:
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();
?>

This code outputs "Hello, I'm foo :)" (as expected) but when I change code to something like this: 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 prints:

Hello, I'm foo :)Hello, I'm foo :)

Why? Is it a bug?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

涙—继续流 2024-12-26 04:51:32

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

Because you are calling the foo2 two times, function foo2() in foo2 it's a constructor.

翻了热茶 2024-12-26 04:51:32

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

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

实际上,由于 foo3 没有调用其父构造函数,因此调用了较新的 foo2 构造函数。


因为您调用了 foo3() 两次,所以 foo3 中的 function foo3() 是一个 构造函数 文档

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

第一次调用:

$x = new foo3;

第二次调用:

$x->foo3f();

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

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

The correct answer is not that function foo2() in foo2 it's a constructor, although it's true that it's a constructor.

The answer is that foo3() is the constructor called in new foo3(). This constructor calls the method foo2().

Actually the constructor of foo2 newer is called since foo3 has not a call to his parent constructor.


Because you are calling foo3() two times, function foo3() in foo3 is a constructor Docs:

For backwards compatibility, if PHP 5 cannot find a __construct() function for a given class, it will search for the old-style constructor function, by the name of the class.

First call:

$x = new foo3;

Second call:

$x->foo3f();

Give foo3 a real constructor and you're fine:

class foo3 extends foo2 {
 function __construct() {};
 function foo3() {
  $this->foo2();
 }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文