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

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

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

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

static class Hello { private static $greeting = 'Hello'; private __construct() { $greeting .= ' There!'; } public static greet(){ echo $greeting; } } Hello::greet(); // Hello There! 

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

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

В дополнение к ответу Грега, я бы рекомендовал установить конструктор 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! ?> 

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

см. Singleton в PHP

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

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

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

это singleton использует $a = a::getA(...);

Обычно я предпочитаю писать обычные нестатические классы и использовать фабричный класс для создания экземпляров одного (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(); 

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

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