Можно ли создавать статические классы в 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();