требуется ли вам использовать модификатор & для передачи по ссылке?
Технически / семантически, ответ да , даже с объектами. Это потому, что есть два способа передать / назначить объект: по ссылке или по идентификатору . Когда объявление функции содержит &
, например:
function func(&$obj) {}
Аргумент будет передан по ссылке, несмотря ни на что. Если вы объявите без &
function func($obj) {}
Все будет передаваться по значению, за исключением объектов и ресурсов, которые затем будут передаваться через идентификатор . Какой идентификатор? Ну, вы можете думать об этом как о ссылке на ссылку. Возьмите следующий пример:
class A
{
public $v = 1;
}
function change($obj)
{
$obj->v = 2;
}
function makezero($obj)
{
$obj = 0;
}
$a = new A();
change($a);
var_dump($a);
/*
output:
object(A)#1 (1) {
["v"]=>
int(2)
}
*/
makezero($a);
var_dump($a);
/*
output (same as before):
object(A)#1 (1) {
["v"]=>
int(2)
}
*/
Так почему же $a
внезапно не становится целым числом после передачи его в makezero
? Это потому, что мы перезаписали только идентификатор . Если бы мы прошли мимо ссылка :
function makezero(&$obj)
{
$obj = 0;
}
makezero($a);
var_dump($a);
/*
output:
int(0)
*/
Теперь $a
является целым числом. Таким образом, существует разница между передачей по идентификатору и передачей по reference .