$a = true;
1,new test($a);
2,new test(true);
Есть ли разница между ними (1,2), если есть, что из этого? Спасибо,.Есть ли разница между ними, если есть, что это?
$a = true;
1,new test($a);
2,new test(true);
Есть ли разница между ними (1,2), если есть, что из этого? Спасибо,.Есть ли разница между ними, если есть, что это?
Ну, другой использует переменную, а другой - нет. Это приводит к фатальной ошибке в этом случае:
class test {
public function __construct(&$a)
{
}
}
$a = true;
new test($a);
new test(true); //Fatal error because this cannot be passed by reference
Строго говоря, это зависит от того, как определяется тест.
Если test
определяется таким образом, что входные параметры passed by reference, то 2
будет поднимать фатальную ошибку, так как true
является буквальным значением.
Также test
может иметь побочные эффекты, которые означают, что порядок выполнения линий 1
и 2
вопрос.
Это зависит от конструктора класса 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)
невозможно выполнить при передаче по ссылке, потому что вы не можете иметь ссылку на буквальное значение, только для других переменных.
wow почему было это downvoted вне меня ... :( –
SiGanteng, я согласен. Было бы хорошо с объяснением. –