2011-07-20 156 views
8

我遇到一個以前的員工寫了一個PHP類,它是這樣定義的:類擴展自己?

namespace SomeNamespace; 

class SomeClass extends ::SomeClass 
{ 
    private function __construct() {} 

    public static function someFunction() 
    { 
     //Do something 
    } 
} 

會有人請解釋一下是怎麼回事?這個班是自我擴展嗎?我知道一個單身人士會使用私人構造函數,但不知道這是發生在這裏的事情。

實際的類與緩存有關。不知道這是否有幫助。

+2

它執行沒有錯誤?你確定這兩個類都在同一個命名空間嗎? – zzzzBov

+2

好問題!從來沒有見過這樣的代碼。要麼以前的員工是天才,要麼是瘋子。 – GordonM

+0

我不願意在這個時候執行這個類。但是,是的!有一行在類定義之上定義了一個名稱空間(我更新了這個問題以反映這一點)。 –

回答

6

我不認爲你可以做這種事情使用::;但它應該,如果你使用了命名空間分隔符的工作:\

我只是用PHP PHP 5.3.5測試 - 使用::確實讓我一個錯誤。
使用\,另一方面,工作正常(請參閱下面的示例)


例如,在全局命名空間是(不在任何具體命名空間)你可以定義一個類SomeClass

namespace { 

    class SomeClass 
    { 
     public function method() { 
      var_dump("child: " . __METHOD__); 
     } 
    } 


    $obj = new SomeNamespace\SomeClass(); 
    $obj->method(); 

} 


而且,在我的例子稱爲SomeNamespace一個特定的名稱空間,您可以定義一個類SomeClass,該類將從全局命名空間擴展該類 - 可訪問爲\SomeClass

namespace SomeNamespace { 

    class SomeClass extends \SomeClass 
    { 
     public function method() { 
      var_dump("parent: " . __METHOD__); 
     } 
    } 

} 


旁註:在這裏,我已經使用bracketed syntax,因爲我把代碼的兩個部分在同一個文件(見例3該手冊頁) - 但它應該與幾個文件一樣工作。



注意,對於PHP 5.3的第一個Alpha版本,命名空間分隔符不\,但::

所以,如果你正在使用PHP 5.3的α1或2 (也許3,不知道如果\之前或之後選擇3),使用::可能工作。

(當然,你不應該使用的α - 尤其是考慮到已經有PHP 5.3的穩定版本了兩年)

+0

之前是的!我們正在運行PHP的Alpha版本。我們現在不需要對此發表評論:-) –

+2

呃,你真的真的不應該用阿爾法來運行 - 特別是這樣一個老的!當你切換到一個穩定的版本,所有的命名空間代碼將打破... *(對不起,我無法抗拒評論^^很高興我可以幫忙,雖然)* –

+0

哈哈是的,它是可怕的! –

2

如果我的5.3的開發過程中記住正確::被用作命名空間分隔符。

相關問題