2012-12-14 64 views
1

我在Codeigniter HMVC擴展中(通過Wiredesignz)發現了這樣一行代碼,其中一個類實例化時沒有分配給變量(Base.php中的類CI)沒有賦值給一個變量的PHP類的實例化

代碼:

class CI extends CI_Controller 
{ 
    public static $APP; 

    public function __construct() { 

    /* assign the application instance */ 
    self::$APP = $this; 

    global $LANG, $CFG; 

    /* re-assign language and config for modules */ 
    if (! is_a($LANG, 'MX_Lang')) $LANG = new MX_Lang; 
    if (! is_a($CFG, 'MX_Config')) $CFG = new MX_Config; 

    parent::__construct(); 
    } 
} 

/* create the application object */ 
new CI; 

這是什麼技術的名字嗎? 這是什麼意思?

+1

如果是這樣的笨我只是失去了興趣,學習它,甚至與它有任何共同之處。 – shadyyx

+2

@shadyyx閱讀問題的第一行。 –

+0

@Vlakarados它是一個擴展,所以不是真正的CI?但我想CI仍然使用'全球'然後... – shadyyx

回答

5

這沒有一個名字,其含義是,構造函數肯定是做了太多。人們想要在不引用它的情況下創建一個類的實例的原因是,他只希望構造函數想要被執行,但僅此而已。這意味着,構造函數「做」了某些事情,但構造函數應該只能確保對象處於穩定/有效狀態,而不再是其他事情。

簡而言之:不要以爲這是一個很好的做法。 globalself::$APP = $this證實了我的意見,這是一段糟糕的代碼。

+0

對不起,但您是否真的有意將該逗號放在最後一句中? :) –

+0

我確實同意,非常糟糕的一段代碼。而且非常糟糕的做法。 – shadyyx

+0

啊,現在我明白了,謝謝。不是母語和標點符號......甚至不用我的語言:D – KingCrunch

0

我想這可以被看作是某種facade design。 - 類(構造函數被調用)和賦值完成,雖然在構造函數本身。

所以new CI只是擴展Super對象並初始化它自己的構造函數。 的功能類似,function somefun(){ return }; somefunc();//call somefunc

是CI_Controller加載所有運行笨所需的類,它是SUPER對象

$ci = &get_instance() // CI_Controller 
+0

讓我感到困惑的是CI的實例化,而沒有將它分配給變量... 已經有一個CI_Controller類型的index.php中聲明瞭$ CI。 現在是CI類型的CI。 CI和$ CI都是對象,後者是一個變量,但前者呢? 它是如何管理的PHP? 起初我想也許它是單身人士,但在任何其他地方,任何人都可以聲明另一個類型爲CI的對象,但這次他可能必須將它分配給一個變量。 儘管...使用Jens Segers中的一個刪除了擴展名。 –

相關問題