2010-08-16 16 views
3

即时通讯看着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 
    } 
} 
+9

全局变量杀死小狗。这就是为什么。 – Matchu 2010-08-16 01:40:33

回答

4

问题与全局变量是:

  1. 他们认为,只有一个实现模型和视图。
  2. 他们假设只有一个模型和视图的实例(在应用程序中可以有几个)。
  3. 它们隐藏了组件之间的相互依赖关系;您的视图受模型影响很大,但不必将模型显式传递到您的视图中,这使得这种隐含。

由于其他原因,为什么globals和singletons是“邪恶”(即只是一个糟糕的设计决定,你永远不应该做),请阅读avoid global variables, environment variables, and singletons

+0

谢谢Michael!关键点在于,它只假设1个实例 - 并且它会使链接看起来更难一些。如果我没有明确地将它们传递给构造函数,我可以看到自己忽略了全局变量,并且没有正确处理它们。 – htmlr 2010-08-16 10:52:06

3

是的 - 优点是你可以改变模型的实现而不必修改视图。

+0

我很困惑。为什么你需要在一种情况下修改视图,而不是在另一种情况下?如何引用模型实例取决于Model类的实现? – catchmeifyoutry 2010-08-16 01:51:38

0

通常不使用全局变量最好能帮助您控制变量的范围。

+0

同意 - 我想我试图简化代码并查看基于PHP4的框架! – htmlr 2010-09-01 01:16:54

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 
+0

+1。按引用传递类实例是一种过时的技术。 – 2010-08-16 06:52:47

+0

感谢GuidoH,那它是如何在更传统的编程语言,即Java中完成的呢? – htmlr 2010-08-16 10:54:24

0

我就不提了,为什么这是一个坏因为它已经被讨论过了。我认为你应该知道的一件事是,提供的代码与PHP 4兼容。在PHP 5中,默认的对象是通过引用发送的。