Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z $this
tomahawk
post
Post #1





Grupa: Zarejestrowani
Postów: 74
Pomógł: 1
Dołączył: 5.02.2007

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


Witam.

Mam sobie dwie klasy (to tylko przykład):

  1. class Controller{
  2. function index_action(){
  3. Klasa::metoda();
  4. }
  5. }
  6.  
  7. class Klasa{
  8. function metoda(){
  9. print_r($this);
  10. }
  11. }


I teraz jeśli zrobię tak:
  1. $controller=new Controller();
  2. $controller->index_action();

To wyświetla mi obiekt $controller. Czyli zmienna $this jest dostępna w metodzie metoda. Więc co jest grane? Gdzie ta cała teoria o zasięgu zmiennych? Jak zrobić żeby zmienna $this była dostępna tylko i wyłącznie w obrębie obiektu/klasy i nie wędrowała po metodach innych klas.
Go to the top of the page
+Quote Post
Spawnm
post
Post #2





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




masz błąd, daj error_reporting(E_ALL|E_STRICT); a dowiesz się gdzie co i jak.
Go to the top of the page
+Quote Post
tomahawk
post
Post #3





Grupa: Zarejestrowani
Postów: 74
Pomógł: 1
Dołączył: 5.02.2007

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


Mam tylko coś takiego:
Cytat
Strict Standards: Non-static method Klasa::metoda() should not be called statically, assuming $this from incompatible context in


Z tym że nie chcę deklarować metody jako statyczną bo ta metoda jest wywoływana jako statyczna i jako niestatyczna. Wewnątrz niej sprawdzane jest czy istnieje $this i jeżeli nie istnieje to jest tworzony obiekt klasy.

Ten post edytował tomahawk 4.08.2010, 11:15:20
Go to the top of the page
+Quote Post
zelu
post
Post #4





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

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


Wywołujesz statyczną metodę, a nie zadeklarowałeś jej jako statyczna w klasie Klasa
Go to the top of the page
+Quote Post
tomahawk
post
Post #5





Grupa: Zarejestrowani
Postów: 74
Pomógł: 1
Dołączył: 5.02.2007

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


No tak. Ale jak zadeklaruję jako statyczną to będzie znowu problem przy wywoływaniu jej jako niestatyczną. :/
Go to the top of the page
+Quote Post
Spawnm
post
Post #6





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Metodę statyczną możesz wywołać jak nie statyczną.
Go to the top of the page
+Quote Post
thek
post
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Nic nie może iść jednocześnie w prawo i w lewo. W php i tak masz o wiele łatwiej. W takim C++ na zmienne/pole klasy statyczne mogły wpływać tylko metody statyczne, konstruktor i destruktor (z tego co kojarzę). Poza tym zastanawiam się czy wiesz czy rozumiesz co oznacza static przy metodzie, czy po prostu ten specyfikator Ci się podoba z nazwy winksmiley.jpg W wielu przypadkach bowiem jest on nadużywany bez potrzeby.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
tomahawk
post
Post #8





Grupa: Zarejestrowani
Postów: 74
Pomógł: 1
Dołączył: 5.02.2007

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


To jak w końcu? Jak będę wywoływał metodę statyczna jako niestatyczną to będzie poprawnie czy nie?

Tak rozumiem co to znaczy static:) i nie wiem skąd wywnioskowałeś że nadużywam jak nawet w moim przykładzie nie było static ani o tym nie wspomniałem. Chyba odwrotnie chciałeś zasugerować.

A w cpp moim zdanie jest łatwiej ;] Jest przeciążanie funkcji smile.gif

Go to the top of the page
+Quote Post
Spawnm
post
Post #9





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Cytat
To jak w końcu? Jak będę wywoływał metodę statyczna jako niestatyczną to będzie poprawnie czy nie?

Na prawdę masz tak duży problem aby dodać 3-4 linijki i to sprawdzić ?
Go to the top of the page
+Quote Post
phpion
post
Post #10





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(tomahawk @ 4.08.2010, 12:50:03 ) *
Tak rozumiem co to znaczy static:)

Chyba nie do końca, bo chcesz wywołać metodę w sposób statyczny, a wewnątrz niej chcesz dobrać się do $this. Metody statyczne nie powodują tworzenia obiektu, więc nie ma wewnątrz nich czegoś takiego jak $this.
Go to the top of the page
+Quote Post
zelu
post
Post #11





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

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


Cytat
w moim przykładzie nie było static


Ale było wywołanie statycznej metody smile.gif

Cytat(Spawnm @ 4.08.2010, 12:53:36 ) *
Na prawdę masz tak duży problem aby dodać 3-4 linijki i to sprawdzić ?


Pewnie chodziło koledze o to czy tak można robić w sensie czy nie jest to jakieś sprzeciwianie się idei OOP. Przynajmniej ja to tak odebrałem winksmiley.jpg
Go to the top of the page
+Quote Post
tomahawk
post
Post #12





Grupa: Zarejestrowani
Postów: 74
Pomógł: 1
Dołączył: 5.02.2007

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


Cytat(Spawnm @ 4.08.2010, 12:53:36 ) *
Na prawdę masz tak duży problem aby dodać 3-4 linijki i to sprawdzić ?

Sprawdziłem i działa. Ale skąd mam wiedzieć czy jest poprawnie? Może w nowej wersji php już nie będzie działać? Może to tylko błąd.

Cytat(phpion @ 4.08.2010, 12:53:50 ) *
Chyba nie do końca, bo chcesz wywołać metodę w sposób statyczny, a wewnątrz niej chcesz dobrać się do $this. Metody statyczne nie powodują tworzenia obiektu, więc nie ma wewnątrz nich czegoś takiego jak $this.

Niema $this jeżeli wywołuję w sposób statyczny. A jeżeli wywołuję w sposób niestatyczny to jest. A skąd do licha ja mam wiedzieć kiedy jest wywoływana statycznie a kiedy niestatycznie? Nie wiem więc aby to sprawdzić sprawdzam czy jest $this.

Cytat(zelu @ 4.08.2010, 12:54:10 ) *
Ale było wywołanie statycznej metody smile.gif

Kiedy to nie jest metoda statyczna:
Cytat
Non-static method Klasa::metoda()


Ten post edytował tomahawk 4.08.2010, 12:01:50
Go to the top of the page
+Quote Post
zelu
post
Post #13





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

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


Cytat(tomahawk @ 4.08.2010, 12:50:03 ) *
Tak rozumiem co to znaczy static:)


Cytat(tomahawk @ 4.08.2010, 12:50:03 ) *
A skąd do licha ja mam wiedzieć kiedy jest wywoływana statycznie a kiedy niestatycznie?


Widzisz sprzeczność?
Go to the top of the page
+Quote Post
tomahawk
post
Post #14





Grupa: Zarejestrowani
Postów: 74
Pomógł: 1
Dołączył: 5.02.2007

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


Nie widzę sprzeczności.

Chodzi o informację w metodzie. Jak została ona wywołana. Napisałem wyraźnie że w tym celu sprawdzam czy jest $this. Pewnie Tobie chodzi o to że jakbym wiedział że przed wywołaniem jest :: lub -> to bym sobie odczytał wykonywany plik, przeparsował i sprawdził czy jest tam :: czy -> tongue.gif Ale skoro tak nie robię to nie wiem co to jest static

Ten post edytował tomahawk 4.08.2010, 12:25:50
Go to the top of the page
+Quote Post
thek
post
Post #15





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




To popatrz na kod i sam oceń... Masz zwykła metodę w klasie Klasa, czyli powinieneś do niej się odnosić Klasa->metoda() a co zrobiłeś? Klasa::metoda() :0 Czyli wywołałeś niestatyczną metodę w sposób statyczny i na to się zbulwersował interpreter pisząc, że nie ma takiej metody statycznej i użycie Klasa::metoda() jest niepoprawne. Zmień w klasie Controller to tak, by najpierw utworzyć normalny obiekt Klasa i dopiero potem się pchać z Klasa->metoda(), albo zmień w Klasa metodę na statyczną i zamiast this użyj self. Jak widzisz są różne drogi na osiągnięcie tego samego celu.

Innymi słowy: "Choć myślisz, że rozumiesz, to jednak nie rozumiesz co robisz." winksmiley.jpg


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
tomahawk
post
Post #16





Grupa: Zarejestrowani
Postów: 74
Pomógł: 1
Dołączył: 5.02.2007

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


Ech... rozumiem. Po prostu wygodnie mi było wywoływać metodę raz statycznie a raz niestatycznie.

Ten post edytował tomahawk 4.08.2010, 12:28:36
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 Aktualny czas: 21.08.2025 - 15:21