它们之间是否存在差异,如果有,它是什么?

时间:2012-06-26 11:39:44

标签: php

$a = true;

1,new test($a);

2,new test(true);

它们之间是否存在差异(1,2),如果有,它是什么?谢谢,

3 个答案:

答案 0 :(得分:4)

那么另一个使用变量而另一个不使用变量。在这种情况下,这会导致致命错误:

class test {

    public function __construct( &$a )
    {

    }
}

$a = true;

new test($a);

new test(true); //Fatal error because this cannot be passed by reference

答案 1 :(得分:1)

严格来说,这取决于测试的定义方式。

如果test定义为输入参数为passed by reference,那么2会引发致命错误,因为true是一个字面值。

此外,test可能会产生副作用,这意味着您执行第1行和2行的顺序很重要。

答案 2 :(得分:1)

这取决于test类的构造函数。在常规的按值传递构造函数中,它们完全相同:

class test {
  public $b;
  function __construct($a) { $this->b = $a; }
}

此处,$obj->b对于您的两个陈述都是true,正如预期的那样。

另一方面,如果您passing by reference,如果稍后更改全局$a,则可能会得到不同的结果。例如:

class test {
  public $b;
  function __construct( &$a ) { $this->b = &$a; }
}

$a = true;
$obj = new test($a);
$a = false;
在这种情况下,

$obj->b将为false,因为它是对$a的引用!通过引用,您也可以反过来做,从构造函数中更改$a

class test {
  function __construct( &$a ) { $a = false; }
}

$a = true;
$obj = new test($a);
即使在全球范围内,

$a现在也是假的!

此外,在通过引用传递时不可能执行new test(true),因为您不能引用文字值,只能引用其他变量。