Gibt es eine Möglichkeit, dieses Problem einfach zu beheben, oder muss ich wirklich den gesamten Legacy-Code neu schreiben?
Schwerwiegender PHP-Fehler: Die Referenz für die Anrufzeit wurde in ... in Zeile 30 entfernt
Dies geschieht überall, wenn Variablen als Referenzen im gesamten Code an Funktionen übergeben werden.
Antworten:
Sie sollten den Aufruf in der Funktionsdefinition als Referenz bezeichnen, nicht den tatsächlichen Aufruf. Da PHP die Versionalisierungsfehler in Version 5.3 anzeigt, würde ich sagen, dass es eine gute Idee wäre, den Code neu zu schreiben.
Aus der Dokumentation :
Zum Beispiel, anstatt zu verwenden:
Verwenden:
quelle
E_COMPILE_WARNING
Level-Fehler, als Referenz: php.net/manual/en/…Für alle, die dies wie ich lesen, weil sie ein riesiges Legacy-Projekt auf 5.6 aktualisieren müssen: Wie die Antworten hier zeigen, gibt es keine schnelle Lösung: Sie müssen wirklich jedes Auftreten des Problems manuell finden und beheben .
Der bequemste Weg, alle problematischen Zeilen in einem Projekt zu finden (abgesehen von der Verwendung eines vollständigen statischen Code-Analysators, der sehr genau ist, aber ich kenne keinen, der Sie sofort an die richtige Position im Editor bringt) verwendete Visual Studio Code, in den ein netter PHP-Linter integriert ist, und seine Suchfunktion, die die Suche nach Regex ermöglicht. (Natürlich können Sie dafür jeden IDE / Code-Editor verwenden, der PHP-Flusen und Regex-Suchen durchführt.)
Verwenden dieses regulären Ausdrucks:
Es ist möglich, projektweit nach dem Auftreten
&$
nur in Zeilen zu suchen , die keine Funktionsdefinition sind.Dies führt immer noch zu vielen Fehlalarmen, erleichtert jedoch die Arbeit.
Der Suchergebnisbrowser von VSCode erleichtert das Durchsuchen und Auffinden der fehlerhaften Zeilen erheblich: Sie klicken einfach durch jedes Ergebnis und achten auf diejenigen, die der Linter rot unterstreicht. Die müssen Sie reparieren.
quelle
(?<!function)[:> ][a-zA-Z0-9_]+(?<!foreach|array)\s?\([^()]*&\$
PHP und Referenzen sind etwas unintuitiv. Bei sachgemäßer Verwendung können Referenzen an den richtigen Stellen große Leistungsverbesserungen bewirken oder sehr hässliche Problemumgehungen und ungewöhnlichen Code vermeiden.
Folgendes führt zu einem Fehler:
Keines davon muss scheitern, da es den folgenden Regeln folgen könnte, aber zweifellos entfernt oder deaktiviert wurde, um eine Menge Verwirrung zu vermeiden.
Wenn sie funktioniert haben, beinhalten beide eine redundante Konvertierung in eine Referenz und die zweite beinhaltet auch eine redundante Konvertierung zurück in eine enthaltene Variable mit Gültigkeitsbereich.
Die zweite war früher möglich, um die Übergabe einer Referenz an Code zu ermöglichen, der nicht für die Verwendung mit Referenzen vorgesehen war. Dies ist für die Wartbarkeit äußerst hässlich.
Dies wird nichts tun:
Insbesondere wird die Referenz wieder in eine normale Variable umgewandelt, da Sie nicht nach einer Referenz gefragt haben.
Das wird funktionieren:
Dadurch wird angezeigt, dass Sie eine Nichtreferenz übergeben, aber eine Referenz möchten, sodass diese in eine Referenz umgewandelt wird.
Dies bedeutet, dass Sie keinen Verweis auf eine Funktion übergeben können, bei der ein Verweis nicht explizit aufgefordert wird, ihn zu einem der wenigen Bereiche zu machen, in denen PHP die Übergabe von Typen strengstens einschränkt oder in diesem Fall eher einen Metatyp darstellt.
Wenn Sie ein dynamischeres Verhalten benötigen, funktioniert dies:
Hier sehen Sie, dass Sie eine Referenz möchten und bereits eine Referenz haben, lassen Sie sie also in Ruhe. Es kann auch die Referenz verketten, aber ich bezweifle dies.
quelle