2011-09-16 39 views
2

我工作的一些遺留代碼的時刻和跨一個奇怪的類/函數調用似乎php.net並沒有解釋迷迷糊糊,我以前從來沒見過:PHP函數類方法混亂

if(security::instance()->check_client()) { 

有一個類的安全性,在這個類裏面有一些名爲instance和check_client的函數。但是,這似乎在一個陳述中稱爲兩個函數,並將其傳遞給另一個,或者至少這就是結果所暗示的。 有人能爲我澄清這一個嗎?

+0

的[static關鍵字(HTTP: //php.net/manual/en/language.oop5.static.php)(用於靜態函數)在[PHP Manual](http://php.net/manual/en/language.oop5.static .PHP)。 – hakre

回答

1

這是一個經典的實施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(); 
+0

嗨Alfwed,非常感謝你的詳細解釋。 – Marius

3

執行是這樣的:

  • 第一,執行security類的static methodinstance()
  • 它返回(最有可能的)的security類的實例
  • 然後,該check_client方法在返回的對象上執行

因此,由於security::instance()是一個對象,你可以調用它的方法。

+0

你怎麼知道它返回一個安全類的實例? :) – hakre

+0

這只是一個猜測,根據OPs聲明,代碼中存在一個'check_client'方法 – naivists

1

安全:實例()

是一個靜態調用(所以可能是一個靜態方法)

http://php.net/manual/en/language.oop5.static.php

它返回一些類的實例,其具有構件方法check_client ()

所以它返回一個對象,然後你可以調用該對象的任何公共方法。

0

我只能假設(因爲我不知道底層代碼),但它可能會解釋給你。

首先,所有函數都可以返回對象。然後調用一個對象函數返回的對象:

security::instance()->check_client() 

是一樣的,如:

$securityInstance = security::instance(); 
$securityInstance->check_client(); 

下一步,通過的instance命名我會假設一個的security::instance()返回實例安全類,可能是單例實現或基於應用程序配置的工廠。