我工作的一些遺留代碼的時刻和跨一個奇怪的類/函數調用似乎php.net並沒有解釋迷迷糊糊,我以前從來沒見過:PHP函數類方法混亂
if(security::instance()->check_client()) {
有一個類的安全性,在這個類裏面有一些名爲instance和check_client的函數。但是,這似乎在一個陳述中稱爲兩個函數,並將其傳遞給另一個,或者至少這就是結果所暗示的。 有人能爲我澄清這一個嗎?
我工作的一些遺留代碼的時刻和跨一個奇怪的類/函數調用似乎php.net並沒有解釋迷迷糊糊,我以前從來沒見過:PHP函數類方法混亂
if(security::instance()->check_client()) {
有一個類的安全性,在這個類裏面有一些名爲instance和check_client的函數。但是,這似乎在一個陳述中稱爲兩個函數,並將其傳遞給另一個,或者至少這就是結果所暗示的。 有人能爲我澄清這一個嗎?
這是一個經典的實施singleton pattern
我想你security
類看起來是這樣的:
class security {
private static $instance = null;
private function __construct() {}
public static function instance() {
if (null === self::$instance)
self::$instance = new security();
return self::$instance;
}
public function check_client() { /* do something */ }
}
它所做的是靜態方法實例返回類安全的一個實例;這意味着security::instance() instanceof security === true
這就是爲什麼你可以鏈調用check_client()方法,在你的爲例
security::instance()->check_client()
這類似於
$secu = security::instance();
$secu->check_client();
嗨Alfwed,非常感謝你的詳細解釋。 – Marius
執行是這樣的:
security
類的static methodinstance()
security
類的實例check_client
方法在返回的對象上執行因此,由於security::instance()
是一個對象,你可以調用它的方法。
安全:實例()
是一個靜態調用(所以可能是一個靜態方法)
http://php.net/manual/en/language.oop5.static.php
它返回一些類的實例,其具有構件方法check_client ()
所以它返回一個對象,然後你可以調用該對象的任何公共方法。
我只能假設(因爲我不知道底層代碼),但它可能會解釋給你。
首先,所有函數都可以返回對象。然後調用一個對象函數返回的對象:
security::instance()->check_client()
是一樣的,如:
$securityInstance = security::instance();
$securityInstance->check_client();
下一步,通過的instance
命名我會假設一個的security::instance()
返回實例安全類,可能是單例實現或基於應用程序配置的工廠。
的[static關鍵字(HTTP: //php.net/manual/en/language.oop5.static.php)(用於靜態函數)在[PHP Manual](http://php.net/manual/en/language.oop5.static .PHP)。 – hakre