PHP中__get魔术方法代码输出疑问:为何最后一行是b,A,B而非A,b,B?
为什么
echo $m->a.",".$m->b;输出b,A,B而不是A,b,B? 这个问题的核心在于PHP字符串拼接时的操作数求值顺序,以及__get魔术方法里的echo语句会提前输出内容,而非等到整个拼接完成后才统一输出。我们一步步拆解最后一行代码的执行过程:
- 当执行
echo $m->a.",".$m->b;时,PHP需要先计算出拼接字符串的所有组成部分,再输出最终结果。 - 首先处理第一个操作数
$m->a:因为$a是类的公共属性,直接返回值"A",这一步没有额外输出。 - 接下来处理第二个操作数
$m->b:因为$b是受保护(protected)的属性,外部无法直接访问,因此触发了类中的__get魔术方法:__get方法第一行就是echo "$name,";,这里的$name是调用时传入的"b",所以会立刻输出"b,"。- 随后
__get方法返回$this->b[$name],也就是数组$b中键为"b"的值"B"。
- 所有操作数求值完成后,
"A"+","+"B"拼接成"A,B"。 - 最后
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é
相关产品推荐
相关产品推荐

