Укладка статических классов в PHP - PullRequest
4 голосов
/ 07 января 2010

Есть ли способ создать статический класс, если в качестве члена используется другой статический класс?

EG Parent_Class::Child_Class::Member_function();

Ответы [ 5 ]

2 голосов
/ 07 января 2010

Если вы имеете в виду вложенные классы, нет. Я полагаю, что они собирались быть введенными однажды, но в конечном итоге были отброшены.

Существует пространство имен поддержка, однако, если это то, что вам нужно.

1 голос
/ 08 апреля 2010

Да, вы можете иметь вложенные статические классы в 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();
1 голос
/ 07 января 2010

номер

Однако вы можете использовать один из магических методов 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 голосов
/ 07 января 2010

PHP не поддерживает вложенные классы в любой форме (статической или иной).

0 голосов
/ 07 января 2010

Нет, классы не являются первоклассными гражданами в 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' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...