Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> $this w zwykłej metodzie wywoływanej statycznie
hausner15
post
Post #1





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 5.02.2007

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


Witam,

Przypadkowo wpadłem na pewne rozwiązanie które ułatwi mi pracę, aczkolwiek nie wiem czy nie jest to po prostu bugiem w PHP i z czasem mój skrypt przez to może nie działać.

Otóż mam sobie 2 klasy:

  1. <?php
  2. class A {
  3. public function test() {
  4. var_dump($this);
  5. }
  6. }
  7.  
  8. class B {
  9. public $zmienna;
  10.  
  11. public function __construct() {
  12. A::test();
  13. }
  14. }
  15.  
  16. new B;
  17. ?>


Wynikiem tego kodu jest:
Kod
object(B)#1 (1) { ["zmienna"]=> NULL }


Jak widać $this w klasie A zawiera obiekt z którego metoda test została wykonana - czyli B - czy jest to normalne zjawisko? (IMG:style_emoticons/default/smile.gif)

Proszę o wytłumaczenie bo w manualu nic na ten temat nie znalazłem.

Pozdrawiam.

EDIT:
Proszę o przeniesienie na podforum o obiektówce - dopiero teraz zobaczyłem że instnieje takie forum (IMG:style_emoticons/default/smile.gif)

Ten post edytował hausner15 5.12.2010, 15:33:14
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
Mephistofeles
post
Post #2





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


A::test() to wywołanie statyczne, więc jest do jak dla mnie uzasadnione. Funkcje, które tak wywołujesz, powinieneś poprzedzić słowem kluczowym static.
Go to the top of the page
+Quote Post
hausner15
post
Post #3





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 5.02.2007

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


Tak wiem, jak poprzedzę słowem static to wtedy przy $this sypie błędem. Jednak przy takim wywołaniu działanie PHPa jest ciekawe - i nie powiem dla mnie przydatne.

Chodzi mi bardziej o to czy jest to ficzer czy błąd - ponieważ musiałbym wiedzieć czy w przyszłości nic się nie zmieni.

Pozdrawiam

Ten post edytował hausner15 5.12.2010, 15:42:15
Go to the top of the page
+Quote Post
Quadina
post
Post #4





Grupa: Zarejestrowani
Postów: 200
Pomógł: 38
Dołączył: 1.12.2010
Skąd: Wrocław

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


Misie kolorowe....

Jeżeli funkcja jest statyczna to nie ma $this! jest self!

  1. class A {
  2. public static $zmienna = array('tablica sobie jestem');
  3. public static function test() {
  4. var_dump(self::$zmienna);
  5. }
  6. }
  7. A::test();


Toż to podstawy programowania są - druga kartka książek o obiektowości.


Innymi słowy, wcale nie wykosałeś test() w klasie A, ale PHP w swojej jak to już napisał niżej Crozin, wywołał ją inline w klasie B, zatem to jest tylko i wyłącznie Twój błąd przy wykonaniu funkcji nie stetycznej jako statyczną - Strict Standards (co również jest napisane w dokumentacji) wywołuje wtedy taką metodę inline. czyli tak jakby była w tym miejscu, a nie w innej klasie. To żaden błąd, ani feature ;-)

Ten post edytował Quadina 5.12.2010, 15:53:21
Go to the top of the page
+Quote Post
Crozin
post
Post #5





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

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


Zacznijmy od tego, że kod ten wywala błąd:
Cytat
Strict Standards: Non-static method A::test() should not be called statically, assuming $this from incompatible context in...
Niestety PHP w swojej idiotoodporności nie wywali całego skryptu tylko zgłosi pewnego rodzaju informację.
Go to the top of the page
+Quote Post
hausner15
post
Post #6





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 5.02.2007

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


Crozin to ciekawe bo u mnie ten kod jak najbardziej działa (PHP 5.2.5)...

Właśnie dlatego się pytam bo DZIAŁA pomimo że jest niepoprawne (myśląc logicznie).

Pozdrawiam

Dobra mój błąd: E_ALL nie obejmuje E_STRICTów i przez to nie wywalało mi błędów.

Teraz już wszystko wiem.

Dziękuję i pozdrawiam

Ten post edytował hausner15 5.12.2010, 16:01:24
Go to the top of the page
+Quote Post
Crozin
post
Post #7





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

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


Cytat
Crozin to ciekawe bo u mnie ten kod jak najbardziej działa (PHP 5.2.5)...
Włącz raportowanie błędów: http://ideone.com/pL1lP
Cytat
Właśnie dlatego się pytam bo DZIAŁA pomimo że jest niepoprawne (myśląc logicznie).
Bo w PHP wszystko, nawet najbardziej absurdalne konstrukcje zadziałają.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.12.2025 - 14:05