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>,原因如下:
- 调用
$post->publish()时,执行的是父类Content的publish方法(子类未重写该方法)。 $this->published = true只是给Article实例动态添加了一个公共属性$published,值为true——这个操作不会触发任何方法调用,PHP中只有当类定义了__set()魔术方法时,给未声明属性赋值才会触发对应逻辑,你贴的代码里没有这个魔术方法。- 之后执行
$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
相关产品推荐
相关产品推荐

