2010-01-06 70 views
3

有沒有辦法讓一個靜態類有一個靜態類作爲成員?在PHP中堆棧靜態類

E.G. Parent_Class::Child_Class::Member_function();

回答

2

如果你的意思是嵌套類,沒有。我相信他們會在某一時刻被引入,但最終會被拋棄。

但是,如果這就是你所追求的,那麼支持namespace

+2

是啊,我基本上試圖用靜態類代替名稱空間;我真的很討厭\ char作爲一個命名空間分隔符..:P – Ian 2010-01-07 14:17:17

0

不,類不是PHP中的一等公民,因此它們不能存儲在變量中。

你可能有點讓通過功能的傳中您最一流的

class Parent_Class 
{ 
    public static $childClass; 

    public static function callChildMethod($methodName, array $args=array()) 
    { 
     return call_user_func_array(array(self::$childClass, $methodName), $args); 
    } 
} 

class Child_Class 
{ 
    public static function hello() 
    { 
     echo 'hello'; 
    } 
} 

Parent_Class::$childClass = 'Child_Class'; 

Parent_Class::callChildMethod('hello'); 
+0

我認爲他所說的是C#靜態嵌套類型: http://msdn.microsoft.com/en-us/library/ ms173120(VS.80).aspx 它們不存儲在變量中;他們只是通過他們的父類以靜態方式訪問。 – 2010-01-06 21:55:44

0

PHP不支持任何形式的(靜態或其他方式)嵌套類。

1

但是,你可以使用PHP的魔術方法之一,做你想做的,也許是:

class ParentClass { 
    public static function __callStatic($method,$args) { 
    return call_user_func_array(array('ChildClass',$method),$args); 
    } 
} 

class ChildClass { 
    public static function childMethod() { 
    ... 
    } 
} 

ParentClass::childMethod($arg); 
0

是的,你可以有嵌套靜態類在PHP中,但它不漂亮,並且需要一些額外的工作。語法與您的語法稍有不同。

訣竅是靜態初始化外部類並創建內部類的靜態實例。

然後你可以做兩件事情之一,兩者都在下面說明。

  1. 指的是內部類的靜態實例(子類實際上是用詞不當,因爲沒有繼承關係。)

  2. 的內部類的實例創建一個靜態訪問方法(這是優選的,因爲它允許發現。)

class InnerClass { 
    public static function Member_function() { 
     echo __METHOD__; 
    } 
} 

class OuterClass { 
    public static $innerClass; 

    public static function InnerClass() { 
     return self::$innerClass; 
    } 

    public static function init() { 
     self::$innerClass = new InnerClass(); 
    } 
} 
OuterClass::init(); 

OuterClass::$innerClass->Member_function(); 
OuterClass::InnerClass()->Member_function();