You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP代码调用publish后article执行两次?$this->published赋值为何触发方法

问题:PHP代码中publish方法执行后article被调用两次的原因

先看给定的PHP代码:

<?php

class Content
{
    public function publish()
    {
        $this->published = true;
        $this->article();
    }
    protected function article()
    {
        echo "<i>Article:</i>";
    }
}
class Article extends Content
{
    public function article()
    {
        echo "<i>Post:</i>";
    }
}

$post = new Article();
$post->publish();


/*
Code Output :  <i>Post:</i><i>Post:</i>
*/

  
?>

执行上述代码后,发现article方法被执行了两次,疑惑点在于:$this->published = true看起来只是给一个未定义的属性赋值,为什么会触发article方法调用?


先明确正常代码逻辑

按照你贴出的代码,正常执行只会输出一次<i>Post:</i>,原因如下:

  1. 调用$post->publish()时,执行的是父类Content的publish方法(子类未重写该方法)。
  2. $this->published = true只是给Article实例动态添加了一个公共属性$published,值为true——这个操作不会触发任何方法调用,PHP中只有当类定义了__set()魔术方法时,给未声明属性赋值才会触发对应逻辑,你贴的代码里没有这个魔术方法。
  3. 之后执行$this->article(),由于子类Article重写了父类的article方法,所以调用子类版本,输出<i>Post:</i>。

为什么你会看到两次输出?

你看到的两次article方法调用,肯定不是$this->published = true导致的,大概率是以下情况之一:

  • 代码笔误:比如你实际运行的代码中,publish方法里多写了一次$this->article(),或者$post->publish();被执行了两次;也有可能是把$this->published = true误写成了$this->article();(比如手滑打错符号)。
  • 环境缓存问题:测试环境的旧代码没更新,导致执行的不是你当前贴出的代码。
  • 误解输出:可能页面渲染时的重复显示,或者其他代码逻辑的干扰。

总结:$this->published = true本身绝对不会触发article方法,两次调用一定是额外的方法调用逻辑导致的。

内容的提问来源于stack exchange,提问作者Nahidul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:40:30