Можно ли создавать статические классы в PHP (например, в С#)?

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

  • Конструктор автоматически вызывается при первом вызове класса
  • Не требуется никаких экземпляров

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

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

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

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

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

Ответ 1

У вас могут быть статические классы в 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!


?>

Ответ 2

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

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

<?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!


?>

Ответ 3

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

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

Ответ 4

final Class B{

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

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

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

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

Ответ 5

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

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

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

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

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;
    }
}

Класс DB...

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();

Ответ 6

Объект

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

final Class B{
  static $var;
  static function init(){
    self::$var = new A();
}
B::init();