Chcę utworzyć klasę statyczną w PHP i sprawić, by zachowywała się tak, jak w C #, więc
- Konstruktor jest wywoływany automatycznie przy pierwszym wywołaniu klasy
- Nie jest wymagana żadna instancja
Coś w tym rodzaju ...
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
źródło
źródło
Odpowiedzi:
Możesz mieć statyczne klasy w PHP, ale nie wywołują one konstruktora automatycznie (jeśli spróbujesz wywołać
self::__construct()
, pojawi się błąd).Dlatego musiałbyś stworzyć
initialize()
funkcję i wywołać ją w każdej metodzie:źródło
Therefore you'd have to create an initialize() function and call it in each method:
tego łatwiej byłoby stworzyćinitialize
funkcję publiczną i wywołać ją zaraz po deklaracji klasy.__callStatic
, tam możesz zobaczyć, czy została zainicjowana, a następnie zrobić,self::$method
czy cokolwiek dzwonisz. Jeśli nadal wywołuje metodę bezpośrednio, spróbuj zmienić wszystko na prywatne i zobacz tam.Oprócz odpowiedzi Grega zalecałbym ustawienie konstruktora jako prywatnego, aby nie było możliwe utworzenie instancji klasy.
Moim skromnym zdaniem jest to bardziej kompletny przykład oparty na przykładzie Grega:
źródło
możesz mieć te „statyczne” klasy. ale przypuszczam, że brakuje czegoś naprawdę ważnego: w php nie masz cyklu aplikacji, więc nie dostaniesz prawdziwego statycznego (lub pojedynczego) w całej aplikacji ...
zobacz Singleton w PHP
źródło
struktura b jest nazywana pojedynczym handlerem, możesz to również zrobić w a
to jest użycie singletona
$a = a::getA(...);
źródło
Generalnie wolę pisać zwykłe niestatyczne klasy i używać klasy fabrycznej do tworzenia instancji pojedynczych (sudo static) instancji obiektu.
W ten sposób konstruktor i destruktor działają normalnie i mogę tworzyć dodatkowe niestatyczne instancje, jeśli chcę (na przykład drugie połączenie DB)
Używam tego przez cały czas i jest to szczególnie przydatne do tworzenia niestandardowych programów obsługi sesji w bazie danych, ponieważ gdy strona kończy działanie, destruktor wypycha sesję do bazy danych.
Kolejną zaletą jest to, że możesz zignorować kolejność, którą nazywasz, ponieważ wszystko zostanie skonfigurowane na żądanie.
Klasa DB ...
Gdziekolwiek chcesz go używać, po prostu zadzwoń ...
Następnie potraktuj wszystkie metody jako niestatyczne (ponieważ są)
źródło
obiektu nie można zdefiniować statycznie, ale to działa
źródło