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

PHP中__get魔术方法代码输出疑问:为何最后一行是b,A,B而非A,b,B?

为什么echo $m->a.",".$m->b;输出b,A,B而不是A,b,B?

这个问题的核心在于PHP字符串拼接时的操作数求值顺序,以及__get魔术方法里的echo语句会提前输出内容,而非等到整个拼接完成后才统一输出。我们一步步拆解最后一行代码的执行过程:

  1. 当执行echo $m->a.",".$m->b;时,PHP需要先计算出拼接字符串的所有组成部分,再输出最终结果。
  2. 首先处理第一个操作数$m->a:因为$a是类的公共属性,直接返回值"A",这一步没有额外输出。
  3. 接下来处理第二个操作数$m->b:因为$b是受保护(protected)的属性,外部无法直接访问,因此触发了类中的__get魔术方法:
    • __get方法第一行就是echo "$name,";,这里的$name是调用时传入的"b",所以会立刻输出"b,"。
    • 随后__get方法返回$this->b[$name],也就是数组$b中键为"b"的值"B"。
  4. 所有操作数求值完成后,"A" + "," + "B" 拼接成"A,B"。
  5. 最后echo输出这个拼接好的字符串,也就是"A,B"。

把这些步骤的输出连起来,就是先输出"b,",再输出"A,B",合起来就是你看到的"b,A,B"。

如果你想得到预期的"A,b,B",可以拆分输出语句:

echo $m->a . ",";
echo $m->b;

这样执行时会先输出"A,",再触发__get输出"b,"并返回"B",最终得到"A,b,B"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:12:21