Возьмите в качестве примера этот абстрактный класс из проекта, над которым я работаю. (минус все действительно интересные биты).
abstract class col_meta extends meta {
protected $col_obj;
public function inject_object(&$obj);
public function &get_object(){
return $this->col_obj;
}
}
Я понимаю что inject_object
метод получает $obj
в качестве ссылки, но если я хочу, чтобы класс назначил его защищенной переменной, нужно ли мне снова назначать его по ссылке?
как это:
class foo extends col_meta {
public function inject_object(&$obj){
$this->col_obj = &$obj;
}
}
Или, получив только ссылку, мне нужно просто скопировать ссылку в защищенную переменную?
class bar extends col_meta {
public function inject_object(&$obj){
$this->col_obj = $obj;
}
}
Я связывал свои мысли в узлах, пытаясь решить это, поскольку они оба кажутся правильными.
По определению, путем ссылки является «путем ссылки»; Это означает, что если значение изменяется в функции, оно изменяется в вызывающем скрипте.
Однако — поскольку это обеспечивает лучшую производительность — если вы передаете «по значению», PHP по-прежнему передает ссылку на функцию, но создает копию (по значению), если вы изменяете значение в функции.
Обратите внимание, что объекты всегда эффективно «передаются по ссылке», потому что ваша переменная объекта на самом деле является указателем на объект, поэтому любые изменения в объекте внутри функции также будут отражаться и вне функции.
Не передавайте по ссылке, если вы явно не хотите, чтобы переменная, измененная внутри функции, изменялась также и вне функции.
Если вам нужна «копия» объекта внутри вашего класса, а не ссылка; затем используйте clone
создать копию.
Других решений пока нет …