Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Metody statyczne...
Forum PHP.pl > Forum > PHP > Object-oriented programming
Mejdej
Cześć,

dzisiaj odkryłem coś co mnie bardzo zdziwiło. Czy to normalne, że każdą metodę publiczną można odpalić jak statyczną mimo, że nie jest ona statyczna? Bardzo mnie to zdziwiło.

Oto przykład tego o czym mówię. Skrypt zwraca dwukrotnie napis "cos tam...", a według mnie nie powinien.

  1. <?php
  2. class A
  3. {
  4. public function cosu()
  5. {
  6. print 'cos tam...';
  7. }
  8.  
  9. }
  10.  
  11. class B
  12. {
  13. public function __construct()
  14. {
  15.  
  16. // tak nie powinno dzialac
  17. A::cosu();
  18.  
  19. // A to powinna być jedyna dopuszczalan metoda
  20. $zmm = new A();
  21. $zmm -> cosu();
  22.  
  23. }
  24. }
  25.  
  26. $zmienna = new B();
  27. ?>
wookieb
Jak włączysz wyższy poziom raportowanie błędów to PHP ci to zgłosi. Generalnie nie powinno się tego robić. Funkcje statyczne to pomocnicy w pewnej dziedzinie problemu. Np sformatowanie jakieś liczby według podanych parametrów. Często są tez używane we wzorcu "Fabryka".
LBO
Tak, to normalne. PHP jako język, z mnóstwem naleciałości z poprzednich wersji, nie wymaga podawania kwantyfikatora static dla metod statycznych. A jako język skryptowy ewentualny błąd wyrzuci dopiero runtime.
hind
Żeby było ciekawiej metody statyczne wywołane w obiekcie mają dostęp do $this z wywoływanego obiektu.

Kod
<?php

class a {

    public $name = 'a';

    public function show() {
        b::show2();
    }

}

class b {

    public $name = 'b';

    public function show2() {
        echo $this->name;
    }

}

$a = new a;
$a->show();
// wyświetla 'a'
LBO
Cytat(hind @ 16.08.2011, 15:25:35 ) *
[...]



Zachowanie tego kodu jest najdziwniejsze na całym świecie o_O
thek
Przyjrzyj sie temu kawałkowi kodu z a i b smile.gif
  1. $a = new a; //stworzenie obiektu a... proste...
  2. $a->show(); //tu jest tylko pozornie "cyrk"... na obiekcie $a wykonaj metodę show(), czyli wywołanie metody show2() klasy b, która wyświetla własność 'name' tego obiektu.
A jakie jest 'name' obiektu klasy a? Ano właśnie 'a' smile.gif Jaki jest więc de facto efekt? Jednoznaczność z napisaniem w klasie a:
  1. public function show() {
  2. $this->name;
  3. }
LBO
Cytat(thek @ 16.08.2011, 16:03:25 ) *
[...]


Ja rozumiem dlaczego tak się dzieje. Natomiast nie podoba mi się to, że są tak jakby 2 scope'y.

Co ciekawe, taka metoda ze słowem kluczowym static zachowuje się już poprawnie.
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.