Преимущество передачи по ссылке, в отличие от использования глобальной? - PullRequest
3 голосов
/ 16 августа 2010

я смотрю на шаблон MVC, и в я вижу один пример на phppatterns они передают модель по ссылке - есть ли преимущество в этом по сравнению с глобальной переменной? Я что-то упускаю из виду?

class MyView extends View {
  var $model; 

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

  function productTable($rownum=1) {
    $rowsperpage='20';
    $this->model->listProducts($rownum,$rowsperpage);
    while ( $product=$this->model->getProduct() ) {
         // Bind data to HTML
    }
  }
}

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

class MyView extends View {
  global $model;

  function __construct(){ }

  function productTable($rownum=1) {
    $rowsperpage='20';
    $model->listProducts($rownum,$rowsperpage);
    while ( $product=$this->model->getProduct() ) {
         // Bind data to HTML
   }
}

Ответы [ 6 ]

4 голосов
/ 16 августа 2010

Проблема с глобальными переменными заключается в том, что:

  1. Они предполагают, что существует только одна реализация модели и представления.
  2. Они предполагают, что существует только один экземпляр модели и вида (в вашем приложении может быть несколько экземпляров).
  3. Они скрывают взаимозависимость между компонентами; модель очень сильно влияет на ваше представление, но отсутствие явной передачи модели в ваше представление делает это неявным.

По другим причинам, по которым глобальные и синглтоны являются «злыми» (т. Е. Просто плохим дизайнерским решением, которое никогда не следует принимать), прочитайте избегайте глобальных переменных, переменных среды и синглетонов .

3 голосов
/ 16 августа 2010

Да - преимущество в том, что вы можете изменить реализацию модели без необходимости изменять вид.

2 голосов
/ 16 августа 2010

Я бы предложил использовать другой учебник, тот, который вы используете, немного устарел, и не PHP 5. Тем не менее, вы действительно не должны использовать глобальные переменные, это никогдарешение!

Но я не совсем понимаю, почему вы даже хотите передать его по ссылке, в PHP 5 он уже передан по ссылке :

class foo {
    public $a;
    public function __construct($a) {
        $this->a = $a;
    }
}

$a = new foo(10);
$b = $a;

$a->a = 20;

echo $a->a.' => '.$b->a; // 20 => 20
1 голос
/ 16 августа 2010

Если у вас есть несколько (похожих) экземпляров модели, к которым вы, возможно, хотели бы применить одно и то же представление, вам необходимо явно передать экземпляр модели.Глобальная переменная предполагает, что может быть только один экземпляр модели, и, таким образом, создает искусственное ограничение.

0 голосов
/ 16 августа 2010

Я не буду упоминать о том, почему это плохо, потому что это уже обсуждалось. Одна вещь, которую я думаю, вы должны знать, это то, что предоставленный код совместим с PHP 4. В PHP 5 по умолчанию объекты отправляются по ссылке.

0 голосов
/ 16 августа 2010

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

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