请参见下面的代码,这在PHP中非常有效。谁能解释这个代码的工作原理以及为什么返回4。
<?php
error_reporting(0);
$var_a = '33';
$var_b = &$var_a;
$var_c = &$var_b;
echo $var_c * ( $var_b ="2 + $var_b");
?>
这个问题是针对php程序员的招聘面试。
答案 0 :(得分:10)
逐行将其分解是有益的。通过启用错误报告,还可以找到更多信息,即error_reporting(E_ALL)
$var_a = '33';
很容易,将字符串"33"
分配给$var_a
。
$var_b = &$var_a;
和$var_c = &$var_b;
将$var_b
和$var_c
都分配到$var_a
的引用地址。参见http://php.net/manual/language.references.php。出于所有目的和目的,它们是具有不同名称的相同变量。
在下一行中,我将按评估顺序将其分为几部分
"2 + $var_b"
这是一个值为"2 + 33"
的字符串。 33来自$var_a
分配
$var_b ="2 + $var_b"
这将先前的字符串("2 + 33"
)分配给$var_b
,并因此分配给$var_a
和$var_c
。赋值表达式的返回值就是赋值。
$var_c * ( $var_b = "2 + $var_b")
剩下的东西看起来像
"2 + 33" * "2 + 33"
启用错误报告后,您会得到
PHP注意:在...中遇到的格式不正确的数值
因为这显然不是一个合理的数学表达式。但是,PHP非常宽容,并会尽力对其进行评估。发生的事情是,它尝试从每个操作数中解析尽可能多的数字内容,这些操作数停在"2"
之后的第一个空格处,所以您留下了
"2" * "2"
感谢PHP的松散输入,其结果为4
。
答案 1 :(得分:0)
$var_a
包含值33。$var_b
包含地址$var_a
,$var_c
包含地址$var_b
。因此,如果您将值分配给任何变量
然后它将更改所有变量的值。
$var_b ="2 + $var_b"
在此等式中,您正在将$var_b
的值33更改为2,因为您正在分配"2 + $var_b"
。在为变量$var_b
赋值时,它只会考虑2。现在所有变量的值为2。
最终方程$var_c * ( $var_b ="2 + $var_b")
计算为2 * 2
返回4