Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Klasy i objekty
Forum PHP.pl > Forum > Przedszkole
jeremieblanc
Witam,

czy ktoś mógłby mi wytłumaczyć dlaczego w klasie, która jest rozszerzeniem głównej klasy w której nie ma żadnych zmiennych członkowskich ani metod statycznych możemy wywoływać zmienną czy metodę klasy głównej nie tylko pseudo-zmienną $this ale także przez parent:: questionmark.gif wydawało mi się, że self:: (odnosi się do klasy głównej) natomiast parent:: owszem do klasy dziedziczącej ale tylko w odniesieniu do definiowania statycznego.
Damonsson
self:: też wywoła każdą niestatyczną metodę w klasie, jak dasz zamiast $this->. Mieli to chyba zmienić, kiedyś coś czytałem.

A tu masz jakieś rzeczowe info, od kogoś kto się na tym zna:
http://stackoverflow.com/questions/151969/...se-self-vs-this
jeremieblanc
Dobrze, niemniej jednak dalej nie rozumiem zagadnienia o które było pytanie. W dokumentacji pisze : It is possible to access the overridden methods or static properties by referencing them with parent::. ale nie rozumiem do czego odnosi się overridden methods ? zastąpionej metody ale jakiej ? czy jednak mimo wszystko poprawnie jest wywoływać niestatyczną metodę tylko przez $this czy użycie parent:: też jest poprawne ?
  1. class SimpleClass
  2. {
  3. // property declaration
  4. public $var = 'a default value';
  5.  
  6. // method declaration
  7. public function displayVar() {
  8. echo $this->var;
  9. }
  10. }
  11. class ExtendClass extends SimpleClass
  12. {
  13. // Redefine the parent method
  14. function displayVar()
  15. {
  16. echo "Extending class\n";
  17. parent::displayVar();
  18. }
  19. }
  20.  
  21. $extended = new ExtendClass();
  22. $extended->displayVar();

jeżeli zmienię nazwę funkcji na displayFoo() i wywołam ją ($extended->displayFoo(); )nic się nie zmienia więc jakie tu występuje zastąpienie metody jak ma ona inną nazwę czy to zastąpienie odnosi się do metody w środku Foo ?

// Dzięki
z tego wychodzi, że statyka to :: jak nie to $this i chyba tego się trzeba trzymać i nie zaprzątać sobie głowy wink.gif
by_ikar
Używając "parent" wiesz że odnosisz się do klasy którą dziedziczysz, i nie tylko jest kod wówczas czytelniejszy (bo od razu wiadomo że ta metoda/właściwość jest w innej klasie), oraz zapobiegasz późniejszej refaktoryzacji, jeżeli przyjdzie ci do rozbudowy twojej klasy. Ten drugi argument może trochę chybiony, ale czasami tak bywa.
jeremieblanc
A do zmiennych środowiskowych należących do klasy głównej odwołuję się tylko poprzez $this questionmark.gif
Dzięki za odpowiedź. Pozdrawiam.
by_ikar
Można coś takiego robić, ale wówczas właściwości musza być stateczne (statyczne?), tyle że wtedy otrzymasz coś, nad czy później możesz mieć problemy. Bo tworząc obiekt A i obiekt B w którym są właściwości statyczne, nadpisujesz je, poprzez utworzenie takich samych nazw, to wówczas dostęp będziesz miał do dwóch identycznych zmiennych, ale z różną zawartością. Jeżeli musisz nadpisać zmienną, to ustaw jej inną wartość, zamiast tworzyć dwa obiekty, z niemal identycznymi metodami i/oraz właściwościami.

Dam sobie rękę uciąć że w manualu pod parent jest dużo komentarzy na ten temat. Polecam ci zajrzenie tam i sprawdzenie.
jeremieblanc
Dzięki za poświęcony dla mnie czas. Na pewno skorzystam z twoich rad. Jeszcze raz dziękuję !
Crozin
1. Do odwoływania się właściwości i metod obiektu używasz $this->. Jeżeli chcesz odwołać się do właściwości bądź metody obiektu-rodzica używasz parent::. Dlaczego raz ->, a raz ::? Bo cholera to wie. Tak sobie to wymyślili twórcy PHP, nie powiedziałbym by była to mądra decyzja. wink.gif
2. Do odwoływania się do właściwości i metod klasy (statyczne) używaj zawsze NazwaKlasy::$właściwość, bądź NazwaKlasy::metodaStatyczna(). Ewentualnie z wewnątrz klasy możesz skorzystać w tym celu z self::$xxx/static::$xxx.
3. PHP co prawda pozwala na inne warianty, np. $this->metodaStatyczna() ale nie powinieneś z tego korzystać. Twórcy języka, znowu próbowali na siłę stworzyć idiotoodporne rozwiązanie, które standardowo nie wprowadza niczego poza zamieszaniem.
jeremieblanc
Cytat(Crozin @ 20.04.2014, 10:08:21 ) *
1. Do odwoływania się właściwości i metod obiektu używasz $this->. Jeżeli chcesz odwołać się do właściwości bądź metody obiektu-rodzica używasz parent::. Dlaczego raz ->, a raz ::? Bo cholera to wie. Tak sobie to wymyślili twórcy PHP, nie powiedziałbym by była to mądra decyzja. wink.gif
2. Do odwoływania się do właściwości i metod klasy (statyczne) używaj zawsze NazwaKlasy::$właściwość, bądź NazwaKlasy::metodaStatyczna(). Ewentualnie z wewnątrz klasy możesz skorzystać w tym celu z self::$xxx/static::$xxx.
3. PHP co prawda pozwala na inne warianty, np. $this->metodaStatyczna() ale nie powinieneś z tego korzystać. Twórcy języka, znowu próbowali na siłę stworzyć idiotoodporne rozwiązanie, które standardowo nie wprowadza niczego poza zamieszaniem.


Dzięki za swoje uwagi.
Do jedynki dodałbym tylko, że
$this-> używamy do metod, zmiennych niestatycznych zarówno w klasie głównej jak w klasie, która dziedziczy. Możemy także użyć w takim przypadku również parent:: ale tylko do metody.
Drugi punkt wszystko jasne.
Trzeci także, szkoda, że po prostu jeśli coś kodujemy źle nie wywala błędów a pozwala na takie działanie. Co prawda prowadzi to moim zdaniem PRZEDSZKOLAKA (którym zresztą ja jestem jeśli chodzi o PHP) do pisania błędnego poprzez obserwacje właśnie takich złych nawyków. Jednak jeśli ktoś chce pisać w miarę poprawnie na pewno zwróci uwagę na tego typu problemy wink.gif

Jeszcze raz dziękuje wszystkim za pomoc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.