2010-01-06 24 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();