可以解释一下这段代码如何返回4

时间:2018-07-10 04:20:00

标签: php

请参见下面的代码,这在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程序员的招聘面试。

2 个答案:

答案 0 :(得分:10)

逐行将其分解是有益的。通过启用错误报告,还可以找到更多信息,即error_reporting(E_ALL)

  1. $var_a = '33';

    很容易,将字符串"33"分配给$var_a

  2. $var_b = &$var_a;$var_c = &$var_b;

    $var_b$var_c都分配到$var_a的引用地址。参见http://php.net/manual/language.references.php。出于所有目的和目的,它们是具有不同名称的相同变量。

在下一行中,我将按评估顺序将其分为几部分

  1. "2 + $var_b"

    这是一个值为"2 + 33"的字符串。 33来自$var_a分配

  2. $var_b ="2 + $var_b"

    这将先前的字符串("2 + 33")分配给$var_b,并因此分配给$var_a$var_c。赋值表达式的返回值就是赋值。

  3. $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