2012-05-26 6 views
25

Zur Zeit aufgerufen werden eine große Plattform in PHPWie kann ich „Nicht-statische Methode xxx lösen: xxx() sollte nicht statisch in PHP 5.4

Der Server es gehostet wurde kürzlich auf PHP 5.4 aufgerüstet. .

Da ich viele Fehlermeldungen wie vollständig erhalten haben:

[Sa 26. Mai 2012 19.04.41] [Fehler] PHP strenge Standards: Nicht-statische Methode Config :: getData() sollte nicht statisch aufgerufen werden, angenommen $ inkompatibler Kontext in /xxx/Config.inc.php in Zeile 35

Das beispielhafte Verfahren ist wie folgt definiert (das Fehlen eines ‚statischen‘ Schlüsselwort beachten):

function &getData() { 
      $configData =& Registry::get('configData', true, null); 

    if ($configData === null) { 
     // Load configuration data only once per request, implicitly 
     // sets config data by ref in the registry. 
     $configData = Config::reloadData(); 
    } 

    return $configData; 
} 

Dies hat keine Probleme verursacht vor, und ich nehme an, die Fehlermeldungen (die die Anwendung zum Absturz bringen) könnte mit dem kürzlich erfolgten Upgrade auf PHP5.4 zusammenhängen.

Gibt es eine PHP-Einstellung, die ich modifizieren kann, um das Fehlen eines statischen Schlüsselwortes zu "ignorieren"?

+0

Erstellen Sie eine Instanz von Config und rufen Sie getData() daraus – Musa

+0

Könnten Sie ein Beispiel für den Inhalt von '& getData()' einschließen? Genauer gesagt, was genau zurückgegeben wird und wie. –

+0

Der Inhalt von & getData() wurde zur ursprünglichen Frage hinzugefügt - ich muss jedoch betonen, dass dieser Fehler erst seit dem Upgrade auf 5.4 aufgetreten ist, also bin ich zuversichtlich, dass die Logik in Ordnung ist – kaese

Antwort

39

Sie können entweder E_STRICT von error_reporting() entfernen, oder Sie können Ihre Methode einfach statisch machen, wenn Sie sie statisch aufrufen müssen. Soweit ich weiß, gibt es keine (strikte) Möglichkeit, eine Methode zu haben, die sowohl als statische als auch als nicht-statische Methode aufgerufen werden kann. Außerdem, was ärgerlicher ist, können Sie nicht zwei Methoden mit dem gleichen Namen haben, wobei einer statisch und der andere nicht statisch ist.

+0

Danke lanzz - das ist auch mein Gedanke. Ich zögere, sie rein statisch zu machen, weil ich unsicher bin, ob sie auch aus einem nicht-statischen Kontext aufgerufen werden. Ich werde versuchen, E_STRICT aus error_reporting() zu entfernen und auf Sie zurückzukommen. Vielen Dank. – kaese

+0

Mit Ihrer getData() - Implementierung wäre es nicht erforderlich, einen nicht statischen Kontext aufzurufen, da die Instanzdaten in keiner Weise manipuliert werden. und wenn es mit Instanzdaten funktioniert, können Sie es nicht im statischen Kontext aufrufen. – lanzz

+0

Danke lanzz - aber es gibt andere Methoden, die die gleiche Warnung werfen, die nicht statisch genannt werden kann. Ihr Vorschlag, die strikten Fehler in error_reporting() einfach abzuschalten, scheint das Problem unterdrückt zu haben. Vielen Dank! – kaese

-5

Ich löste dies mit einer Code-Zeile, wie folgt: In der Datei index.php, bei der Vorlage Wurzel, nach dieser Codezeile:

definiert ('_JEXEC') oder den ('Eingeschränkter Zugriff') ;

Diese Zeile einfügen: ini_set ('display_errors', 'Off');

Keine Sorge, glücklich sein ...

von Jenio geschrieben.

+3

Dies wird alle Fehler verbergen. Es ist eine gute Idee, dem Benutzer aus Sicherheitsgründen keine Fehler anzuzeigen, sie werden jedoch möglicherweise weiterhin in Protokolldateien oder bei der Entwicklung angezeigt. Andere, echte Probleme könnten bei diesem Ansatz unbemerkt bleiben. – amoebe

+0

Dies löst keine Probleme und erschwert die Erkennung anderer Probleme. –

+0

Auf einer belebten Website können Sie jeden Tag mehrere 100 MB Logdaten ('error_log' Datei) haben, wenn Sie sie einfach nicht anzeigen (in der HTML-Datei/zum Client), aber dennoch aktivieren (in PHP' E_STRICT')). Ist mir auch passiert. – Ned64

23

Das Deaktivieren der Warnmeldung ist keine Möglichkeit, das Problem zu lösen. Obwohl der PHP-Kern weiterhin funktioniert, macht er gefährliche Annahmen und Aktionen.

Nie den Fehler ignorieren, wo PHP eine Vermutungen von etwas machen sollte !!!!

Wenn die Klasse als Singleton organisiert man immer Funktion getInstance() verwenden können, und verwenden Sie dann getData()

Likse:

$classObj = MyClass::getInstance(); 
$classObj->getData(); 

Wenn die Klasse nicht ein Singleton ist, verwenden

4

Ich schlage nicht vor, Sie nur die strengsten Fehler in Ihrem Projekt verstecken. Intead, sollten Sie Ihre Methode, um statische drehen oder versuchen, eine neue Instanz des Objekts Creat:

$var = new YourClass(); 
$var->method(); 

Sie können auch die neue Art und Weise verwenden die gleiche seit PHP 5.4 zu tun:

(new YourClass)->method(); 

Ich hoffe es hilft dir!