后增量和复古兼容性

Ped*_*dro 2 php oop

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

码:

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();
Run Code Online (Sandbox Code Playgroud)

在我看来,我可以从结果中得到的最大值就像1011,但看起来结果是10111213.我无法弄清楚为什么我得到这个结果.有人可以向我解释一下引擎盖下的内容吗?

Don*_*nic 6

这是因为您的方法与包含它们的类具有相同的名称(不区分大小写).它们的行为类似于构造函数以及显式调用.

从上面链接的PHP文档:

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

因此$b = new B();产生1011,$b->b();产生1213.

不推荐使用此行为,如果启用了此级别的错误报告,则会收到相应警告.我在开发环境中看到此消息:

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

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

function __construct() {}
Run Code Online (Sandbox Code Playgroud)

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