2010-08-16 48 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中,默認的對象是通過引用發送的。