![]() |
![]() ![]() |
![]() |
![]()
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:: ![]() Ten post edytował jeremieblanc 19.04.2014, 17:47:49 |
|
|
![]()
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 |
|
|
![]()
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 ?
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 ![]() Ten post edytował jeremieblanc 19.04.2014, 18:28:03 |
|
|
![]()
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.
|
|
|
![]()
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
![]() Dzięki za odpowiedź. Pozdrawiam. Ten post edytował jeremieblanc 19.04.2014, 21:20:29 |
|
|
![]()
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. |
|
|
![]()
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ę !
|
|
|
![]()
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.
![]() 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 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 19.04.2014 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. ![]() 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 ![]() Jeszcze raz dziękuje wszystkim za pomoc. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 8.07.2025 - 04:46 |