Передать объект по ссылке или значению - PullRequest
1 голос
/ 02 июля 2011

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

В моем проекте мне нужно использовать свой класс sql и другие разноеклассы, во многих классах.Тогда мне очень интересно узнать, как лучше передать производительность объектам.

Должен ли я передавать объекты в конструкцию классов как ссылку?

class MyClass {
    private $_link;

    function __construct(&$db) {
        $this->_link =& $db;
    }
}

или значение ..

class MyClass {
    private $_link;

    function __construct($db) {
        $this->_link = $db;
    }
}

или просто создать новый объект?

class MyClass {
    private $_link;

    function __construct() {
        $this->_link = new DB();
    }
}

Ответы [ 2 ]

2 голосов
/ 02 июля 2011

Если вы используете PHP5 +, почти во всех случаях объекты передаются по ссылке по умолчанию.

0 голосов
/ 22 мая 2019

Поскольку объекты уже передаются «по ссылке» в PHP5 +, то, используя &, вы фактически передаете «ссылку на ссылку на объект», а не просто «ссылку на объект».Это может быть критически важным, потому что это позволит функции в пределах локальной области изменять глобальную фактическую ссылку и потенциально полностью удалять объект.Например, можно подумать, что следующий пример передачи объекта по ref и передачи по «обычному» полностью одинаков:

$aa = new stdclass;
$aa->aa = 1;
byRef($aa);
function byRef(&$aaa) {
    $aaa->aa = 2;
}
var_dump($aa); // Outputs {aa:2}

$bb = new stdclass;
$bb->bb = 1;
byVal($bb);
function byVal($bba) {
    $bba->bb = 2;
}
var_dump($bb); // Outputs {bb:2}

Судя по выводу, он выглядит одинаково.Но это хорошая практика?Зависит от того, что вы хотели сделать.Посмотрите на тот же пример, где мы уничтожили исходную ссылку и «удалили» объект:

$aa = new stdclass;
$aa->aa = 1;
byRef($aa);
function byRef(&$aaa) {
    $aaa->aa = 2;
    $aaa = 0; // We are changing $aa, not $aaa, because $aaa is just a reference
}
var_dump($aa); // Outputs int:0, $aa is not an object anymore

$bb = new stdclass;
$bb->bb = 1;
byVal($bb);
function byVal($bba) {
    $bba->bb = 2;
    $bba = 0;
}
var_dump($bb); // Outputs {bb:0}

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

...