2016-01-18 12 views
5

ho il seguente codice:PHP codice errato funziona bene

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


$a = A::methodB(); 

Non dovrebbe mai lavorare e funziona su quella macchina! Ritorna 1. Davvero, giuro che non sono ubriaco.

Ovviamente se lo eseguo sulla mia macchina o sul server di produzione non funzionerà. Perché non è possibile chiamare metodi non statici come statici. La classe dovrebbe sempre essere istanziata all'inizio.

Ero preoccupato per questo. Pensato oggi quando ho installato una macchina da lavoro separata per testare il progetto, ho avuto di nuovo l'ambiente in cui funziona questo codice.

Le cose peggiorano: ho sviluppatori in team che ancora non ottengono chiaramente la differenza tra metodi statici e non statici. Come risultato hanno il codice che funziona bene sulla loro macchina ma non funziona su nessun altro ambiente.

PERCHÉ funziona? Voglio che un tale codice fallisca. Non dovrebbe funzionare.

La configurazione della macchina in cui funziona è la seguente:

vagabondo @ vagabondo-ubuntu-fidato-32:/var/www/Apotheke $ php -v PHP 5.6.17-3 + deb. sury.org ~ trusty + 1 (cli) Copyright (c) 1997-2015 Il gruppo PHP Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies con Zend OPcache v7.0.6-dev, Copyright (c) 1999 -2015, di Zend Technologies

Davvero, mi sento così stupido. Mi manca qualcosa?

+3

Controlla questo: - http://stackoverflow.com/questions/3754786/calling-non-static-method-with –

+0

Finché non usi '$ this', puoi farla franca con questo codice PHP –

+0

Voglio che fallisca ...... (controllando i documenti, ci deve essere qualche settaggio per farlo fallire spero) – Tebe

risposta

4

Il codice di cui sopra è valido in PHP 5. From the docs:

In PHP 5, chiamando i metodi non statici staticamente genera un avvertimento E_STRICT livello.

Se si attiva la rigorosa segnalazione degli errori un avvertimento come la seguente sarà uscita:

PHP standard rigorosi: metodo non statico A :: MethodB() non dovrebbe essere chiamato in modo statico in php codice shell sulla linea 1

Si prega di notare che il metodo sarà ancora eseguito e restituire un valore.

È obsoleto in PHP 7 e non è consigliato per l'uso.

In PHP 7, chiamare i metodi non statici in modo statico è deprecato e genera un avviso E_DEPRECATED. Il supporto per la chiamata statica di metodi non statici può essere rimosso in futuro.

2

Hai trovato seguente avviso:

norme severe: metodo non statico A :: MethodB() non dovrebbe essere chiamato staticamente

ma PHP presuppone si voleva correre comunque lo esegue

Per impedirlo, è possibile modificare il metodo di:

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

L'errore E_STRICT sarà gettato in ogni caso (che è possibile disattivare), ma PHP non assumerà si intende eseguire lo stesso.