В PHP присваивает ли byref var другому var присваивать ссылку или копировать значение?

Возьмите в качестве примера этот абстрактный класс из проекта, над которым я работаю. (минус все действительно интересные биты).

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;
    }

}

Я связывал свои мысли в узлах, пытаясь решить это, поскольку они оба кажутся правильными.

1 ответ

Решение

По определению, путем ссылки является "путем ссылки"; Это означает, что если значение изменяется в функции, оно изменяется в вызывающем скрипте.

Однако - поскольку это обеспечивает лучшую производительность - если вы передаете "по значению", PHP все равно передает ссылку на функцию, но создает копию (по значению), если вы изменяете значение в функции.

Обратите внимание, что объекты всегда эффективно "передаются по ссылке", потому что ваша переменная объекта на самом деле является указателем на объект, поэтому любые изменения в объекте внутри функции также будут отражаться и вне функции.

Не передавайте по ссылке, если вы явно не хотите, чтобы переменная, измененная внутри функции, изменялась также и вне функции.

Если вам нужна "копия" объекта внутри вашего класса, а не ссылка; затем используйте clone создать копию.

Другие вопросы по тегам