【问题标题】:Post-increment and retro compatibility [duplicate]后增量和复古兼容性[重复]
【发布时间】:2018-03-02 22:50:48
【问题描述】:

我有一个例子,我无法弄清楚为什么结果不是我所期望的。

代码:

class A
{
    protected $a = 1;

    function a(){
        echo $this->a++;
    }
}

class B extends A
{
    protected $a = 10;

    function b(){
        echo $this->a++; $this->a() . PHP_EOL;
    }
}

$b = new B();
$b->b();

在我看来,我可以从结果中得到的最大值是 1011,但看起来结果是 10111213。我不知道为什么会得到这个结果。有人可以向我解释一下引擎盖下发生了什么吗?

【问题讨论】:

    标签: php oop


    【解决方案1】:

    这是因为您的方法与包含它们的类具有相同的名称(不区分大小写)。它们的行为类似于 constructors 以及您的明确调用。

    来自我上面链接的 PHP 文档:

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

    所以$b = new B(); 产生 1011,$b->b(); 产生 1213。

    此行为已被弃用,如果您启用了该级别的错误报告,您将收到警告。我在我的开发环境中看到这条消息:

    不推荐使用:与其类同名的方法在 PHP 的未来版本中将不再是构造函数; A 在第 2 行的 C:\Apache24\htdocs\example.php 中有一个已弃用的构造函数

    显然,避免意外行为的最简单方法是将方法的名称更改为类名以外的名称。如果您不想这样做,可以添加一个现代构造函数。

    function __construct() {}
    

    即使它实际上没有做任何其他事情,它也会阻止 a() 和 b() 方法像构造函数一样工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多