2016-01-18 22 views
5

Mam następujący kod:PHP niewłaściwy kod działa poprawnie

class A { 
    public function methodB() 
    { 
    // do something 
    return 1; 
    } 
} 


$a = A::methodB(); 

To nigdy nie powinno pracować i działa na tej maszynie! Powraca 1. Naprawdę, przysięgam, że nie jestem pijany.

Oczywiście, jeśli uruchomię go na moim komputerze lub serwerze produkcyjnym, nie będzie działać. Ponieważ nie można wywoływać metod niestacjonarnych, takich jak statyczne. Klasa powinna być zawsze tworzona z instancji.

Martwiłem się tym. Pomyślałem dzisiaj, że kiedy utworzę oddzielną maszynę roboczą do testowania projektu, znowu mam środowisko, w którym działa ten kod.

Sytuacja się pogarsza - mam programistów w zespole, którzy wciąż nie dostrzegają wyraźnej różnicy między metodami statycznymi i niestatycznymi. W rezultacie mają kod, który działa dobrze na ich komputerze, ale zawiedzie w innych środowiskach.

DLACZEGO to działa? Chcę, żeby taki kod zawodził. To nie powinno działać.

Konfiguracja komputera, na którym to działa jest następujący:

włóczęga @ włóczęga-ubuntu-wierny-32:/var/www/Apotheke $ php -v PHP 5.6.17-3 + deb. sury.org ~ trusty + 1 (cli) Copyright (c) 1997-2015 Grupa PHP Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies z Zend OPcache v7.0.6-dev, Copyright (c) 1999 -2015, przez Zend Technologies

Naprawdę, czuję się tak głupio. Czy coś mi brakuje?

+3

Zaznacz to: - http://stackoverflow.com/questions/3754786/calling-non-static-method-with –

+0

Dopóki nie użyjesz '$ this', możesz uciec z tym kodem w PHP –

+0

Chcę, żeby to się nie udawało ...... (sprawdzanie dokumentów, musi być jakieś ustawienie, żeby zawieść, mam nadzieję) – Tebe

Odpowiedz

4

ten kod jest ważny w PHP 5. From the docs:

W PHP 5, wywoływanie metod niestatycznych statycznie generuje ostrzeżenie E_STRICT poziomu.

Po włączeniu ścisłe raportowanie błędów ostrzeżenia takie jak poniżej będzie wyjście:

PHP surowe normy: metoda statyczna Non-A :: metodaB() nie powinien być nazywany statycznie w php kod powłoki na linii 1

Należy pamiętać, że metoda będzie nadal działać i zwróci wartość.

Jest przestarzała w PHP 7 i nie jest zalecana do użytku.

W języku PHP 7 wywoływanie metod statycznych metodami statycznymi jest przestarzałe i generuje ostrzeżenie o wartości E_DEPRECATED. Obsługa statycznego wywoływania metod statycznych może zostać w przyszłości usunięta.

2

Otrzymujesz następujące ostrzeżenie:

surowe normy: metoda statyczna Non-A :: metodaB() nie powinien być nazywany statycznie

ale PHP zakłada, że ​​chciał uruchomić i tak to wykonuje.

Aby temu zapobiec, można zmienić metodę:

class A { 
    public function methodB(){ 
     if(isset($this)){ 
      // do something 
      return 1; 
     } 
    } 
} 

Błąd E_STRICT zostanie rzucony w każdym razie (który można wyłączyć), ale PHP nie przyjmie pan na myśli, aby go uruchomić w każdym razie.