Можно ли создавать статические классы в PHP (как в C #)? - PullRequest
132 голосов
/ 22 января 2009

Я хочу создать статический класс в PHP и вести себя так же, как в C #, поэтому

  1. Конструктор автоматически вызывается при первом вызове класса
  2. Инстанцирование не требуется

Что-то в этом роде ...

static class Hello {
    private static $greeting = 'Hello';

    private __construct() {
        $greeting .= ' There!';
    }

    public static greet(){
        echo $greeting;
    }
}

Hello::greet(); // Hello There!

Ответы [ 6 ]

192 голосов
/ 22 января 2009

У вас могут быть статические классы в PHP, но они не вызывают конструктор автоматически (если вы попытаетесь вызвать self::__construct(), вы получите ошибку).

Поэтому вам нужно создать функцию initialize() и вызывать ее в каждом методе:

<?php

class Hello
{
    private static $greeting = 'Hello';
    private static $initialized = false;

    private static function initialize()
    {
        if (self::$initialized)
            return;

        self::$greeting .= ' There!';
        self::$initialized = true;
    }

    public static function greet()
    {
        self::initialize();
        echo self::$greeting;
    }
}

Hello::greet(); // Hello There!


?>
50 голосов
/ 20 июля 2012

В дополнение к ответу Грега я бы порекомендовал установить конструктор частным, чтобы невозможно было создать экземпляр класса.

Так что, по моему скромному мнению, это более полный пример, основанный на примере Грега:

<?php

class Hello
{
    /**
     * Construct won't be called inside this class and is uncallable from
     * the outside. This prevents instantiating this class.
     * This is by purpose, because we want a static class.
     */
    private function __construct() {}
    private static $greeting = 'Hello';
    private static $initialized = false;

    private static function initialize()
    {
        if (self::$initialized)
            return;

        self::$greeting .= ' There!';
        self::$initialized = true;
    }

    public static function greet()
    {
        self::initialize();
        echo self::$greeting;
    }
}

Hello::greet(); // Hello There!


?>
24 голосов
/ 22 января 2009

вы можете иметь эти "статические" классы. но я предполагаю, что чего-то действительно важного не хватает: в php у вас нет цикла приложений, поэтому вы не получите настоящую статичность (или синглтон) во всем приложении ...

см. Синглтон в PHP

4 голосов
/ 24 августа 2010
final Class B{

    static $staticVar;
    static function getA(){
        self::$staticVar = New A;
    }
}

структура b называется обработчиком singeton, вы также можете сделать это в

Class a{
    static $instance;
    static function getA(...){
        if(!isset(self::$staticVar)){
            self::$staticVar = New A(...);
        }
        return self::$staticVar;
    }
}

это использование синглтона $a = a::getA(...);

3 голосов
/ 31 декабря 2012

Я обычно предпочитаю писать обычные нестатические классы и использовать фабричный класс для создания экземпляров одного (sudo static) экземпляра объекта.

Таким образом, конструктор и деструктор работают как обычно, и я могу создавать дополнительные нестатические экземпляры, если пожелаю (например, второе соединение с БД)

Я использую это все время, и это особенно полезно для создания пользовательских обработчиков сеансов хранилища БД, так как после завершения страницы деструктор отправит сеанс в базу данных.

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

class Factory {
    static function &getDB ($construct_params = null)
    {
        static $instance;
        if( ! is_object($instance) )
        {
            include_once("clsDB.php");
            $instance = new clsDB($construct_params);   // constructor will be called
        }
        return $instance;
    }
}

Класс БД ...

class clsDB {

    $regular_public_variables = "whatever";

    function __construct($construct_params) {...}
    function __destruct() {...}

    function getvar() { return $this->regular_public_variables; }
}

Везде, где вы хотите использовать его, просто позвоните ...

$static_instance = &Factory::getDB($somekickoff);

Тогда просто обработайте все методы как нестатические (потому что они есть)

echo $static_instance->getvar();
2 голосов
/ 29 ноября 2010

объект не может быть определен статически но это работает

final Class B{
  static $var;
  static function init(){
    self::$var = new A();
}
B::init();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...