Strenge Standards: Nur Variablen sollten als Referenz übergeben werden
$el = array_shift($instance->find(..))
Den obigen code irgendwie berichten die strengen Normen, die Warnung,aber das wird es nicht:
function get_arr(){
return array(1,2);
}
$el = array_shift(get_arr());
Wann wird es Bericht die Warnung überhaupt?
Kommentar zu dem Problem - Öffnen
Was bedeutet $instance->finden(..) zurück?
Hier ist die Lösung: stackoverflow.com/questions/9848295/...
Ich glaube, die Beispiele (oder Logik) sein könnte, die falsch herum in der Frage, seit dem 2. Beispiel (
get_arr()
- Funktion) nicht produzieren, die den strengen Normen feststellen (getestet mit PHP 5.2 und PHP 5.5). InformationsquelleAutor der Frage user198729 | 2010-03-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Betrachten Sie den folgenden code:
Diese erzeugt die folgende Ausgabe:
Den Grund? Die
test::get_arr()
Methode ist nicht eine variable und unter strengen Modus wird dies eine Warnung generieren. Dieses Verhalten ist extrem nicht-intuitiv, wie dieget_arr()
Methode gibt einen array-Wert.Zu bekommen, um diesen Fehler im strict-Modus ändern Sie die Signatur der Methode, so dass es nicht Referenz:
Da können Sie nicht ändern Sie die Signatur der
array_shift
Sie können auch verwenden Sie eine temporäre variable:InformationsquelleAutor der Antwort leepowers
$instance->find()
gibt Referenz auf die variable.Erhalten Sie den Bericht, wenn Sie versuchen, verwenden Sie diese Referenz als argument an die Funktion,
ohne es zu speichern in variable erste.
Dies hilft bei der Vorbeugung von Speicherlecks, und wahrscheinlich Fehler in der nächsten PHP-Versionen.
Deinem 2. code-Fehler werfen würde, wenn er schrieb wie (beachte das & im funktionskopf):
So eine schnelle (und nicht so schöne) fix wäre:
Im Grunde haben Sie eine Zuweisung an temporäre Variablen zuerst, und schicken Sie die variable als argument.
InformationsquelleAutor der Antwort Sagi
Die Ursache für den Fehler ist die Verwendung des internen PHP-Programmierung-Datenstrukturen-Funktion array_shift() [ php.net/end ]. Die Funktion nimmt ein array als parameter. Obwohl ein kaufmännisches und-Zeichen wird angezeigt, in den der Prototyp des "array_shift()" in Der Bedienungsanleitung" gibt es keine warnenden Dokumentation folgenden in der erweiterten definition der Funktion, noch gibt es eine offensichtliche Erklärung, dass die parameter tatsächlich per Referenz übergeben. Vielleicht ist das /verstehen/. Ich Verstand Sie nicht, aber so war es für mich schwierig zu erkennen, die Ursache des Fehlers.
Reproduzieren-code:
InformationsquelleAutor der Antwort Biju B Adoor
Dem zweiten snippet funktioniert auch nicht und das ist, warum.
array_shift
ist eine modifier-Funktion, dass änderungen in seiner Argumentation, deshalb wird es erwartet, dass der parameter eine Referenz, und Sie kann nicht auf etwas, das nicht ist eine variable. Siehe Rasmus' Erklärungen hier: http://bugs.php.net/bug.php?id=48937InformationsquelleAutor der Antwort user187291
Diesem code:
Edit:
InformationsquelleAutor der Antwort user6031348
Gut, in offensichtlichen Fällen, wie diesem, können Sie immer sagen, PHP zu unterdrücken Nachrichten, die durch die Verwendung von "@" vor der Funktion.
$monthly_index = @array_shift(unpack('H*', date('m/Y')));
Kann es nicht sein, einer der besten Programmier-Praktiken zu unterdrücken alle Fehler auf diese Weise, aber in bestimmten Fällen (wie dieser) es kommt praktisch und akzeptabel ist.
Als Ergebnis, ich bin sicher, dass Ihr Freund SysAdmin gerne mit einer weniger verschmutzten "Fehler.log". 😉
InformationsquelleAutor der Antwort Julio Marchi