Я хочу создать статический класс в PHP и вести себя так же, как в C #, поэтому
- Конструктор автоматически вызывается при первом вызове класса
- Инстанцирование не требуется
Что-то в этом роде ...
static class Hello {
private static $greeting = 'Hello';
private __construct() {
$greeting .= ' There!';
}
public static greet(){
echo $greeting;
}
}
Hello::greet(); // Hello There!
php
design-patterns
oop
static
aleemb
источник
источник
Ответы:
У вас могут быть статические классы в PHP, но они не вызывают конструктор автоматически (если вы попытаетесь вызвать,
self::__construct()
вы получите ошибку).Поэтому вам нужно создать
initialize()
функцию и вызывать ее в каждом методе:источник
Therefore you'd have to create an initialize() function and call it in each method:
этого было бы проще сделатьinitialize
публичную функцию и вызывать ее сразу после объявления класса.__callStatic
, там вы сможете увидеть, был ли он инициализирован, а затем делатьself::$method
или как вы вызываете. Если он все еще вызывает метод напрямую, попробуйте изменить все на private и посмотреть там.В дополнение к ответу Грега я бы порекомендовал установить конструктор частным, чтобы невозможно было создать экземпляр класса.
Так что, по моему скромному мнению, это более полный пример, основанный на примере Грега:
источник
вы можете иметь эти "статические" классы. но я полагаю, что чего-то действительно важного не хватает: в php у вас нет цикла приложений, поэтому вы не получите настоящую статичность (или синглтон) во всем приложении ...
увидеть синглтон в PHP
источник
структура b называется обработчиком Singeton, вы также можете сделать это в
это одноразовое использование
$a = a::getA(...);
источник
Я обычно предпочитаю писать обычные нестатические классы и использовать фабричный класс для создания экземпляров одного (sudo static) экземпляра объекта.
Таким образом, конструктор и деструктор работают как обычно, и я могу создать дополнительные нестатические экземпляры, если пожелаю (например, второе соединение с БД)
Я использую это все время, и это особенно полезно для создания пользовательских обработчиков сеансов хранилища БД, поскольку, когда страница заканчивается, деструктор отправляет сеанс в базу данных.
Еще одним преимуществом является то, что вы можете игнорировать порядок вызова, так как все будет настроено по требованию.
Класс БД ...
Везде, где вы хотите использовать это просто позвоните ...
Тогда просто обработайте все методы как нестатические (потому что они есть)
источник
объект не может быть определен статически, но это работает
источник