通过引用的优势反对使用全局?

时间:2010-08-16 01:37:25

标签: php model-view-controller

我正在查看MVC模式,我可以在one example on 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 个答案:

答案 0 :(得分:4)

全局变量的问题是:

  1. 他们假设模型和视图只有一个实现。
  2. 他们假设模型和视图只有一个实例(您的应用程序中可以有几个实例)。
  3. 他们隐藏了组件之间的相互依赖关系;您的视图受模型的影响非常大,但不必将模型明确地传递到视图中会使其隐含。
  4. 出于其他原因,为什么全局和单身人士是“邪恶的”(即你真的不应该做出糟糕的设计决定),请阅读avoid global variables, environment variables, and singletons

答案 1 :(得分:3)

是 - 优点是您可以更改模型的实现,而无需修改视图。

答案 2 :(得分:2)

我建议使用另一个教程,你正在使用的教程有点过时了,不是 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

答案 3 :(得分:1)

如果您有多个(类似的)模型实例,您可能希望在其上应用相同的视图,则需要显式传递模型实例。全局变量假设可能只有一个模型实例,因此产生了一个人为的限制。

答案 4 :(得分:0)

通常,不使用全局变量可以帮助您控制变量的范围。

答案 5 :(得分:0)

我不会提到为什么这是一件坏事,因为它已经讨论过了。我认为您应该知道的一件事是,那里提供的代码与PHP 4兼容。在PHP 5中,默认情况下,对象通过引用发送。