вопросы о ссылках php - PullRequest
       14

вопросы о ссылках php

1 голос
/ 05 февраля 2010

когда я искал какой-то фреймворк MVC, я получил сайт: http://www.phppatterns.com/docs/design/archive/model_view_controller_pattern

однако, как и приведенный там код, я не понимаю ссылки. Например:

  $dao=& new DataAccess ('localhost','user','pass','dbname');
  $productModel=& new ProductModel($dao);

каждый создаваемый экземпляр добавляет «&» перед новым оператором, что именно это означает? ссылка на экземпляр? На самом деле, я удалил все '&' перед всеми этими экземплярами, и код все еще работает отлично.

Другое, коды вроде:

 function ProductView (&$model) {
    $this->model=& $model;
 }

Я действительно думаю, что это можно пересмотреть, как:

function ProductView (&$model) {
    $this->model=$model;
}

Я прав? в чем разница между этими двумя? На самом деле, как пример кода MVC, перечисленный выше? если вы измените код, как я, код все еще работает.

Тогда я получил этот пост где-то еще: http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html

имеет ли смысл? любые предложения по этому поводу были бы полезны.

1 Ответ

2 голосов
/ 05 февраля 2010

До версии PHP 5 объекты передавались по значению, и вам приходилось явно указывать амперсанд, чтобы получить объект по ссылке. *

В PHP 5+ все объекты передаются по ссылке и, таким образом, использование амперсанда является избыточным.

Более того, начиная с PHP 5.3.0, код, подобный приведенному выше, будет генерировать СТРОЧНУЮ ошибку «Назначение возвращаемого значения new по ссылке устарело».

Если вам интересно узнать об историческом использовании (PHP 4 или ранее) кода "$o =& new Object()", см. php-by-reference (в частности, принятый ответ там дается хорошее объяснение).

Подведем итог:

  • в PHP 5 или выше, это не имеет значения. Код будет работать должным образом с без памяти или другими различиями.

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

  • В PHP 4.x (или ранее) этот метод использовался для предотвращения ненужного дублирования объектов.

(*) Хорошая вещь - передавать ссылки - не нужно создавать копии объектов, когда вам нужен только один экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...