2012-06-26 2 views

ответ

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

Строго говоря, это зависит от того, как определяется тест.

Если test определяется таким образом, что входные параметры passed by reference, то 2 будет поднимать фатальную ошибку, так как true является буквальным значением.

Также test может иметь побочные эффекты, которые означают, что порядок выполнения линий 1 и 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) невозможно выполнить при передаче по ссылке, потому что вы не можете иметь ссылку на буквальное значение, только для других переменных.

+0

wow почему было это downvoted вне меня ... :( –

+0

SiGanteng, я согласен. Было бы хорошо с объяснением. –

Смежные вопросы