2012-11-01 52 views
3

嗨我正在看Joomla的代碼,並試圖找出究竟在這個功能發生了什麼。PHP靜態函數self :: in joomla JFactory類的解釋?

index.php文件進行調用的功能

$app = JFactory::getApplication('site'); 

jfactory.php代碼

public static function getApplication($id = null, $config = array(), $prefix='J') 
{ 
    if (!self::$application) { 

     jimport('joomla.application.application'); 

     self::$application = JApplication::getInstance($id, $config, $prefix); 
    } 

    return self::$application; 
} 

application.php代碼..

public static function getInstance($client, $config = array(), $prefix = 'J') 
{ 
    static $instances; 

    if (!isset($instances)) { 
     $instances = array(); 
    } 

    ....... more code ........ 

    return $instances[$client]; 
} 

現在,我不能在功能弄清楚getApplication爲什麼是self:使用$ application。

self::$application = JApplication::getInstance($id, $config, $prefix); 

$ application始終爲空,使用此方法的目的是什麼。我試着修改它到

$var = JApplication::getInstance($id, $config, $prefix); 

和returnig它,但它不起作用。

如果有更多知識的人可以解釋這裏發生的情況,我會很高興。非常感謝。

+0

'self :: $ application'與'$ application'無關。 –

回答

4

self::用於訪問類的靜態成員。

所以在這種情況下,使用self::$application來緩存JFactory中的應用程序對象,以避免多次調用JApplication::getInstance,這樣更加昂貴。

有關靜力學的更多信息,請參見Static Keyword

+0

我還是不明白。據我瞭解,這是某種單身模式,對吧?但是,讓我困惑的是實際上$應用程序,當我嘗試更改爲self :: $ app時,它會生成一個錯誤,爲什麼? – Carbon6

+0

@ Carbon6是的,這是一種單身模式。美元申請?什麼,爲什麼你想改變自我:: $應用程序? –

+0

也許這聽起來很愚蠢,但它爲什麼被稱爲self :: $ application = ...爲什麼它不能只是作爲一個變量$ var = JApplication :: getInstance ...正如我試過它,並在那它不通過該值?我不想改變它:)只是瞭解它。 – Carbon6

1

getApplication() - 返回對Global JApplication 對象的引用。 Read more

self::$member要被訪問的靜態成員。

這是一個我能理解的解釋。

if (!self::$application){ //<-check for the $application static variable of the the class 

jimport('joomla.application.application');   
self::$application = JApplication::getInstance($id, $config, $prefix); 

//if it does not exist get a new instance otherwise nothing happens because there is no else part 
} 

return self::$application; //<- return the object(new one or the existing one) 

這是做什麼的,如果$應用程序存在一個函數調用被保存。如果沒有得到新的實例。 Read more。希望這可以幫助你。

+0

所以在CMS $應用程序將是'網站'或'管理員'權? 工廠適用於任何一家,但每次只有一家。所以你需要說出你正在處理的是哪一個。 因此,無論你在哪個應用程序中,都可以找到該類的靜態成員。 嘗試var_dumping $ application和$ app。 – Elin

+0

var_dump($ application)在調用函數之前和之後返回值始終爲空,var_dump($ app)返回一個包含所有參數的對象。 – Carbon6

+1

參考鏈接。 http://www.inmotionhosting.com/support/edu/joomla-25/create-template/jfactory-get-application – Techie