Nigdy nie widziałem takiego kodu:
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
Czy to jest to samo co new className()
?
EDYTOWAĆ
Jeśli klasa jest dziedziczona, na którą klasę wskazuje?
Odpowiedzi:
self
wskazuje na klasę, w której jest napisany.Tak więc, jeśli metoda getInstance znajduje się w nazwie klasy
MyClass
, następujący wiersz:Zrobi to samo, co:
Edycja: jeszcze kilka informacji, po komentarzach.
Jeśli masz dwie klasy, które się wzajemnie rozszerzają, masz dwie sytuacje:
getInstance
jest zdefiniowany w klasie podrzędnejgetInstance
jest zdefiniowany w klasie nadrzędnejPierwsza sytuacja wyglądałaby tak (usunąłem cały niepotrzebny kod, dla tego przykładu - będziesz musiał dodać go z powrotem, aby uzyskać zachowanie singletona) *:
Tutaj otrzymasz:
Co
self
oznaczaMyChildClass
- czyli klasy, w którym jest napisane.W drugiej sytuacji kod wyglądałby następująco:
Otrzymasz taki wynik:
Co oznacza, że
self
środkiMyParentClass
- czyli tu też klasa, w którym jest napisane .W PHP <5.3, „klasa, w której jest napisane” jest ważna - i może czasami powodować problemy.
Dlatego PHP 5.3 wprowadza nowe użycie
static
słowa kluczowego: może być teraz używane dokładnie tam, gdzie użyliśmyself
w tych przykładach:Ale
static
zamiast tegoself
otrzymasz:Co oznacza, że ten
static
rodzaj wskazuje na używaną (przez nasMyChildClass::getInstance()
) klasę , a nie tę, w której jest napisane.Oczywiście zachowanie
self
nie zostało zmienione, aby nie zepsuć istniejących aplikacji - PHP 5.3 właśnie dodało nowe zachowanie, przetwarzającstatic
słowo kluczowe.A mówiąc o PHP 5.3, możesz rzucić okiem na stronę Późne statyczne powiązania w podręczniku PHP.
źródło
baseclass
,class
, który z nich to wskazywać?self
dziedziczenia; a także zamieściłem kilka informacji ostatic
PHP 5.3 ;; mam nadzieję, że to pomoże :-)Wydaje się, że jest to implementacja wzorca Singleton . Funkcja jest wywoływana statycznie i sprawdza, czy klasa statyczna zawiera zmienną
$_instance
ustawioną .Jeśli tak nie jest, inicjalizuje swoje wystąpienie (
new self()
) i przechowuje je w$_instance
.Jeśli zadzwonisz
className::getInstance()
, otrzymasz jedno i to samo instancję klasy w każdym wywołaniu, co jest punktem wzorca singleton.Jednak nigdy nie widziałem tego w ten sposób i szczerze mówiąc nie wiedziałem, że to możliwe. Co jest
$_instance
zadeklarowane jako w klasie?źródło
$_instance
jest zadeklarowany jakopublic static $_instance;
Jest to najprawdopodobniej używane w pojedynczym wzorcu projektowym, w którym konstruktor jest zdefiniowany jako prywatny, aby uniknąć tworzenia instancji,
(::)
operator podwójnego dwukropka może uzyskać dostęp do elementów członkowskich, które są zadeklarowane jako statyczne wewnątrz klasy, więc jeśli istnieją statyczne elementy członkowskie, pseudozmienna $ nie można tego użyć, dlatego zamiast tego kod używał self, Singletons to dobre praktyki programistyczne, które pozwalają tylko na 1 wystąpienie obiektu, takiego jak programy obsługi konektora bazy danych. Z kodu klienta dostęp do tej instancji odbywałby się poprzez utworzenie pojedynczego punktu dostępu, w tym przypadku nazwał gogetInstance()
odbywałby się , Funkcja getInstance sama w sobie była funkcją, która utworzyła obiekt w zasadzie przy użyciu słowa kluczowego new do utworzenia obiektu, co oznacza, że metoda konstruktora została nazywane również.linia
if(!isset(self::instance))
sprawdza, czy obiekt został już utworzony, nie możesz tego zrozumieć, ponieważ kod jest tylko fragmentem, gdzieś na górze powinny być statyczne elementy, jak prawdopodobniew normalnych klasach uzyskalibyśmy dostęp do tego członka po prostu
ale jest zadeklarowany jako statyczny, więc nie mogliśmy użyć zamiast tego kodu $ this
sprawdzając, czy w tej statycznej zmiennej klasy znajduje się obiekt, klasa może następnie zdecydować o utworzeniu lub nie utworzeniu pojedynczej instancji, więc jeśli nie jest ona ustawiona,! isset, co oznacza, że żaden obiekt nie istnieje w statycznym elemencie $ _instance, a następnie generuje nowy obiekt, zapisuje go w elemencie statycznym
$_instance
za pomocą poleceniai zwrócił go do kodu klienta. Kod klienta może wtedy szczęśliwie używać pojedynczej instancji obiektu z jego metodami publicznymi, ale w kodzie klienta, wywołując pojedynczy punkt dostępu, to znaczy
getInstance()
metoda jest również trudna, musi być wywołana w ten sposóbz tego powodu funkcja sama w sobie jest deklarowana jako statyczna.
źródło
Tak, to jak
new className()
(odnosząc się do klasy zawierającej tę metodę), prawdopodobnie używane we wzorcu Singleton, w którym konstruktor jest prywatny.źródło
Jeśli klasa jest dziedziczona, wywołanie metody getInstance () od child nie da ci instancji child. Zwróci tylko instancję instancji nadrzędnej. Dzieje się tak, ponieważ nazywamy new self ().
Jeśli chcesz, aby klasa potomna zwróciła instancję klasy potomnej, użyj funkcji new static () w funkcji getInstance (), a następnie zwróci instancję klasy potomnej. Nazywa się to późnym wiązaniem !!
źródło