Istnieją dwa różne sposoby dostępu do metod w PHP, ale jaka jest różnica?
$response->setParameter('foo', 'bar');
i
sfConfig::set('foo', 'bar');
Zakładam, że ->
(kreska większa niż znak lub szewron) jest używana dla funkcji zmiennych, a ::
(podwójne dwukropki) jest używana dla funkcji dla klas. Poprawny?
Czy =>
operator przypisania służy tylko do przypisywania danych w obrębie tablicy? Czy jest to sprzeczne z =
operatorem przypisania, który jest używany do tworzenia lub modyfikowania zmiennej?
Odpowiedzi:
Gdy lewa część jest instancją obiektu, używasz
->
. W przeciwnym razie korzystasz::
.Oznacza to, że
->
jest najczęściej używany do uzyskiwania dostępu do członków instancji (chociaż może być również używany do uzyskiwania dostępu do członków statycznych, takie użycie jest odradzane), podczas gdy::
zwykle jest używany do uzyskiwania dostępu do członków statycznych (chociaż w kilku szczególnych przypadkach jest używany do uzyskiwania dostępu do członków instancji ).Na ogół
::
stosuje się do uchwały zakres i może mieć albo nazwą klasyparent
,self
lub (w PHP 5.3)static
z jego lewej strony.parent
odnosi się do zakresu nadklasy klasy, w której jest używana;self
odnosi się do zakresu klasy, w której jest używany;static
odnosi się do „wywoływanego zakresu” (patrz późne wiązania statyczne ).Zasadą jest, że połączenie z
::
jest wywołaniem instancji wtedy i tylko wtedy, gdy:$this
istnieje i$this
jest albo klasą wywoływanej metody, albo jej podklasą.Przykład:
Wynik:
źródło
->
służy głównie do uzyskiwania dostępu do członków instancji (chociaż może być również używany do uzyskiwania dostępu do członków statycznych, takie użycie jest odradzane)” „Nie wiedziałem, że może być. Więc jeśli „funkcjonuje” w jakiś sposób, gdy jest używany do uzyskiwania dostępu do elementów statycznych - jakiej różnicy w zachowaniu można się spodziewać, jeśli użyjemy go w ten sposób nieprawidłowo? Z czystej ciekawości.->
. Oczywiście może zaistnieć potrzeba utworzenia instancji klasy tylko w celu wywołania metody statycznej, więc jest też uderzenie wydajności. Jednak w przypadku właściwości jest więcej problemów. Pojawia się ostrzeżenie STRICT, które może działać lub nie . Zauważ, że odwrotność jest również prawdą - możesz wywołać metodę instancji statycznie, ale jest to jeszcze gorsze (i nie możesz użyć$this
w implementacji takiej metody).::
jest używany w kontekście statycznym , tj. gdy jakaś metoda lub właściwość jest zadeklarowana jako statyczna:Ponadto
::
operator (operator rozpoznawania zakresu , znany również jako Paamayim Nekudotayim ) jest używany w kontekście dynamicznym podczas wywoływania metody / właściwości klasy nadrzędnej:->
jest używany w kontekście dynamicznym , tj. kiedy masz do czynienia z jakąś instancją jakiejś klasy:Nawiasem mówiąc: nie sądzę, że używanie Symfony jest dobrym pomysłem, jeśli nie masz doświadczenia w OOP.
źródło
Właściwie za pomocą tego symbolu możemy wywołać metodę klasy, która jest statyczna i nie może być zależna od innej inicjalizacji ...
Tutaj
doWrite()
funkcja nie jest zależna od żadnej innej metody lub zmiennej i jest to metoda statyczna. Dlatego możemy wywołać tę metodę przez ten operator bez inicjowania obiektu tej klasy.Test::doWrite('Mrinmoy'); // Output: Hello Mrinmoy.
Ale jeśli chcesz wywołać
write
metodę w ten sposób, wygeneruje błąd, ponieważ jest ona zależna od inicjalizacji.źródło
=>
Operatora jest stosowane par klucz wartość przeniesienia na tablicy asocjacyjnej. Na przykład:Jego znaczenie jest podobne w
foreach
stwierdzeniu:źródło
Różnica między metodami statycznymi a instancjami i właściwościami wydaje się być jedną z największych przeszkód dla osób rozpoczynających pracę z OOP PHP w PHP 5.
Operator podwójnego dwukropka (zwany hebrajskim Paamayim Nekudotayim - ciekawostki) jest używany podczas wywoływania obiektu lub właściwości z kontekstu statycznego . Oznacza to, że instancja obiektu nie została jeszcze utworzona.
I odwrotnie, operator strzałki wywołuje metody lub właściwości, które pochodzą z odwołania do instancji obiektu.
Metody statyczne mogą być szczególnie przydatne w modelach obiektów połączonych z bazą danych w celu tworzenia i usuwania metod, ponieważ można ustawić wartość zwracaną dla wstawionego identyfikatora tabeli, a następnie użyć konstruktora, aby utworzyć instancję obiektu według identyfikatora wiersza.
źródło
Tak, właśnie uderzyłem pierwszy
'PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM'
. Mój zły, miałem taki,$instance::method()
który powinien być$instance->method()
. Głupi ja.Dziwne jest to, że to nadal działa dobrze na mojej lokalnej maszynie (działającej w PHP 5.3.8) - nic, nawet ostrzeżenie z raportowaniem błędów = E_ALL - ale wcale nie działa na serwerze testowym, tam po prostu eksploduje z błędem składni i biały ekran w przeglądarce. Ponieważ rejestrowanie PHP zostało wyłączone na maszynie testowej, a firma hostingowa była zbyt zajęta, aby ją włączyć, nie było to zbyt oczywiste.
Zatem słowo ostrzeżenia: najwyraźniej niektóre instalacje PHP pozwolą ci użyć $ instance :: method (), podczas gdy inne nie.
Jeśli ktoś może wyjaśnić, dlaczego tak jest, proszę.
źródło