Я хочу создать статический класс в PHP и вести себя так же, как на C #, поэтому
Что-то в этом роде …
static class Hello { private static $greeting = 'Hello'; private __construct() { $greeting .= ' There!'; } public static greet(){ echo $greeting; } } Hello::greet(); // Hello There!
У вас могут быть статические классы в 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();