Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Klasy i objekty, parent::
jeremieblanc
post 19.04.2014, 17:47:07
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 19.04.2014

Ostrzeżenie: (0%)
-----


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.

Ten post edytował jeremieblanc 19.04.2014, 17:47:49
Go to the top of the page
+Quote Post
Damonsson
post 19.04.2014, 18:11:48
Post #2





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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

Ten post edytował Damonsson 19.04.2014, 18:23:07
Go to the top of the page
+Quote Post
jeremieblanc
post 19.04.2014, 18:23:40
Post #3





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 19.04.2014

Ostrzeżenie: (0%)
-----


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

Ten post edytował jeremieblanc 19.04.2014, 18:28:03
Go to the top of the page
+Quote Post
by_ikar
post 19.04.2014, 19:18:34
Post #4





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
jeremieblanc
post 19.04.2014, 21:16:56
Post #5





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 19.04.2014

Ostrzeżenie: (0%)
-----


A do zmiennych środowiskowych należących do klasy głównej odwołuję się tylko poprzez $this questionmark.gif
Dzięki za odpowiedź. Pozdrawiam.

Ten post edytował jeremieblanc 19.04.2014, 21:20:29
Go to the top of the page
+Quote Post
by_ikar
post 19.04.2014, 22:09:42
Post #6





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
jeremieblanc
post 20.04.2014, 07:24:22
Post #7





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 19.04.2014

Ostrzeżenie: (0%)
-----


Dzięki za poświęcony dla mnie czas. Na pewno skorzystam z twoich rad. Jeszcze raz dziękuję !
Go to the top of the page
+Quote Post
Crozin
post 20.04.2014, 09:08:21
Post #8





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Crozin 20.04.2014, 09:08:53
Go to the top of the page
+Quote Post
jeremieblanc
post 20.04.2014, 20:03:11
Post #9





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 19.04.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 8.07.2025 - 04:46