2012-11-06 2 views
11

alle über das Internet [1][2][3], heißt es, dass seit PHP 5.0.0 „den Rückgabewert der neuen durch Verweis zuweisen“ eine Version E_DEPRECATED oder E_STRICT je nach PHP gibt (E_DEPRECATED nicht existiere bis 5.3, also war es vorher E_STRICT).New durch Verweis nicht Warnung geben

Als solche ist sie mein Verständnis ist, dass dieser Code eine solche Warnung geben sollte:

error_reporting(E_ALL | E_STRICT); 

class A 
{ 
} 

$a =& new A(); 

Allerdings habe ich schon versucht, diese auf zwei völlig verschiedenen Servern (ein mit PHP 5.3 und eine laufende PHP 5.2) und weder gibt tatsächlich irgendeine Nachricht! Was ist los? Ist mein Verständnis falsch oder ist auf diesen beiden Servern etwas Seltsames passiert?

(ich denke auch, es seltsam ist, dass diese veraltet ist, zu sehen, dass $a = null; $b =& $a; $b = new A(); nicht die gleiche wie $a = null; $b =& $a; $b =& new A(); tut, aber das ist nur ein Teil der Frage, ob ich was falsch verstanden ist veraltet ...)

+0

Seltsamerweise bekomme ich nur diesen Fehler, wenn ich dies auf 'phpsh',' PHP veraltet ausführen: Zuweisen des Rückgabewerts von neuen durch Verweis ist veraltet in /Library/Python/2.7/site-packages/phpsh/phpsh.php (578): eval() 'd code in Zeile 1', aber nicht, wenn ich es direkt von cli aus führe. – Dogbert

+0

@Dogbert: Das ist in der Tat seltsam. Ich habe es nur aus externen Apache-Servern selbst versucht, aber wenn ich die Zeit habe, werde ich schauen, es von der Kommandozeile und 'phpsh' selbst ausgeführt – Jasper

+1

Es würde mich überhaupt nicht überraschen, wenn das Problem hier woanders liegt: versuchen Sie es mit'E_ALL | E_STRICT' direkt in Ihrer php.ini, vergessen Sie nicht, auch die php-cli.ini zu ändern, wenn Sie diesen Code in der Kommandozeile ausführen. Überprüfen Sie auch, ob die Fehler nicht versteckt sind, indem Sie ein 'ini_set ('display_errors', 1);'. Wenn Sie dies auf einer Windows-Box ausführen, gibt es [einige Fehler] (https://bugs.php.net/bug.php?id = 46326) mit dieser in der Vergangenheit –

Antwort

2

Als Reaktion auf die OP, zeigte dieser Kommentar in die richtige Richtung:

Es würde mich überhaupt nicht überraschen, wenn das Problem hier woanders liegt: versuchen Sie Einstellung E_ALL | E_STRICT in Ihrer php.ini direkt, vergessen Sie nicht, auch die php-cli.ini zu ändern, wenn Sie diesen Code in der Befehlszeile ausführen.
Überprüfen Sie auch, ob die Fehler nicht ausgeblendet werden, indem Sie eine ini_set('display_errors',1);1 ausführen. Wenn Sie dies auf einer Windows-Box ausführen, gab es some bugs mit dieser in der Vergangenheit. Da das OP auch darauf hinwies, dass die Warnungen erzeugt wurden, bevor ein Code ausgeführt wurde, hatte ich die Vermutung, dass die erwarteten Warnungen zur Kompilierungszeit und nicht zur Laufzeit ausgelöst wurden, also sah ich mich erneut the docs an. Dort fand ich diesen großen roten Feld Note, die meinen Verdacht bestätigt:

meisten E_STRICT Fehler werden bei der Kompilierung damit solche Fehler gemeldet werden nicht in der Datei ausgewertet, wo error_reporting verstärkt wird E_STRICT Fehler enthalten (und umgekehrt).

Seit der Version 5 von PHP ist effektiv ein "kompiliert" Sprache (ähnlich wie Java, den Code zu Zend Bytecode kompiliert wird). Wenn die Zend-Engine Code mit Fehlern kompiliert, die zum kompilierten Zeitpunkt ausgegeben werden, hat ein In-Skript-Aufruf error_reporting keinen Einfluss auf das Wetter oder diese Fehler werden nicht gemeldet: Der Aufruf error_reporting gilt nur für die Laufzeitfehler/Warnungen.
Vielleicht ist dies: error_reporting(E_ALL | E_STRICT | E_COMPILE_ERROR); ist auch einen Blick wert

Bottom line:
Legen Sie die Fehlerberichte in den php.ini-Dateien, wann immer Sie können.

+0

Tatsächlich ist der Punkt, an dem die Fehler gemacht werden, bevor irgendein Code ausgeführt wird (was eine andere Art ist, die Kompilierungszeit zu sagen), eine Schlussfolgerung, die ich aus der Tatsache gezogen habe, dass die 'error_reporting' aus dem Skript nicht funktioniert und gesetzt hat Es hat extern funktioniert. Natürlich hat der Code es auch gezeigt, aber zu diesem Zeitpunkt habe ich die Fehler an der Spitze erwartet, wenn überhaupt. – Jasper

+0

@Jasper, ich dachte, du wüsstest Kompilieren-vs-Laufzeit, aber es ist etwas, das nicht jeder weiß, deshalb habe ich diese Unterscheidung in meine Antwort aufgenommen, also ist dies hauptsächlich dazu bestimmt, andere zu informieren. Ihr Problem, wie Sie jetzt nur allzu gut wissen, war nur, um die .ini-Datei beschäftigt sich mit den Einstellungen, wenn die Zend-Engine von Anfang bis Ende, 'error_reporting' überschreibt nur diese Einstellungen, sobald der Code kompiliert wurde und bereit ist Lauf. Ich dachte nur, dass nicht jeder das als Antwort ausreichend gefunden hätte ;-P ... wie auch immer, gute Frage: Ich habe auf dem Weg auch ein paar neue Dinge herausgefunden, –

+1

Es ist gut, dass du es in deine Antwort aufgenommen hast und das wars nicht Worüber ich eigentlich gesprochen habe. Worüber ich gesprochen habe, war die Formulierung "da das OP auch auf [..]" hingewiesen hat. Ja, ich kann manchmal wählerisch sein. Aber egal, es ist nah genug an der Wahrheit: D – Jasper