Mittwoch, 4. Juli 2007
Warning: Call-time pass-by-reference has been deprecated
Bei der Ausführung eines PHP-Scripts kann es zur folgenden Fehlermeldungen kommen:
Warning: Call-time pass-by-reference has been deprecated - argument passed by value
Was hat es mit dieser Meldung auf sich?
Der folgende PHP-Code sollte das Problem illustrieren:
- <?php
- function foo($v) {
- $v++;
- }
- function bar(&$v) {
- $v++;
- }
- $x = 1;
- $y = 1;
- // Erzeugt eine Warnung
- foo(&$x);
- // Ab PHP5 der einzig "richtige" weg.
- bar($y);
- ?>
Ihr sehen könnt werden zwei Funktionen deklariert. Einmal die Funktion foo() und einmal die Funktion bar(). In beiden Fällen wird eine Variable übergeben, die um eins hoch gezählt wird (Typprüfung werden in diesem Beispiel weggelassen).
Danach werden die Variablen x und y angelegt. Jetzt kommt der spannende Teil. Falls man die Variable via Call-by-reference übergeben möchte, und dies so wie in der Funktion foo() macht, kommt es zu der Warnung:
Warning: Call-time pass-by-reference has been deprecated - argument passed by value
Das bedeutet, falls man die Variable via Call-by-reference übergeben möchte, muss man dies bereits in der Funktionsdefinition, wie bei der Funktion bar(), machen.
Quickhacks
Es gibt aber noch zwei weitere Möglichkeiten um schnell das Problem zu umschiffen. Achtung das Problem wird hiermit nicht gelöst, sondern es wird nun nicht mehr angezeigt.
Erste Möglichkeit
Um die Unterdrückung der Fehlermeldungen und Warnungen zu erreichen, kann man ein Anfang des Skripts folgenden Code stellen:
- error_reporting(0);
Zweite Möglichkeit
Durch setzen des folgenden Eintrags in der php.ini, kann man die Warnung auch unterdrücken:
- allow_call_time_pass_reference = On
Dritte Möglichkeit
Ein .htaccess Datei mit folgedem Inhalt erstellen und diese ins Wurzelverzeichnis kopieren:
- php_value allow_call_time_pass_reference 1
brimbrambrum - #2 - 16.01.2009 00:46 - (Antwort)
Wie ist die erste Möglichkeit gleich nocheinmal?
Der Code wird nämlich nicht mehr angezeigt!
ich hab das problem nämlich auch und ich weiß nicht wie ich es lösen kann!
MfG
Mr. Foo - #2.1 - 16.01.2009 11:58 - (Antwort)
Hi brimbrambrum,
der entsprechende Codeteil wird wieder angezeigt.
brimbrambrum - #2.1.1 - 16.01.2009 13:27 - (Antwort)
danke!
nur leider funktioniert das nicht bei mir und auf die PHP.ini hab ich keinen zugriff!
was könnte ich sonst noch machen? kann ich an der php wo der fehler auftaucht sonst was ändern? kann ich sie vll mal zeigen an jmd der sich damit auskennt? ![]()
wär echt sehr lieb!
MfG
Mr. Foo - #2.1.1.1 - 16.01.2009 15:21 - (Antwort)
Das muss funktionieren. Hast du die error_reporting Anweisung auch an den Anfang deines Scripts gepackt?
brimbrambrum - #2.1.1.1.1 - 17.01.2009 12:06 - (Antwort)
ja gleich an den Anfang in die erste Zeile!
Wenn ich die Anweisung reinpacke, dann wird sie nur unter dem Fehler angezeigt aber der fehler wird weiterhin angezeigt! leider!
Mr. Foo - #2.1.1.1.1.1 - 17.01.2009 21:42 - (Antwort)
Was meinst du mit die Anweisung wird angezeigt?
Such mal in dem Script nach error_reporting - vielleicht wird es ja an einer anderen Stelle wieder eingeschalten.
Hast du das Script selbst geschrieben?
brimbrambrum - #2.1.1.1.1.1.1 - 17.01.2009 23:27 - (Antwort)
nein das script hab ich nicht selbst geschrieben - es ist ein script von joomla - wenn dir das was sagt!
Die Funktion des Scripts ist nicht beeinträchtigt, aber es steht über dem script immer:
Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in [...] .php on line 22
Und wenn ich error_reporting(0); an den Anfang des betroffenen Scriptes setzte dann erscheint die gleiche Meldung, nur mit error_reporting(0); darunter!
Ich hoffe du verstehst was ich meine.
Hättest du noch einen Tipp?
MfG
Mr. Foo - #2.1.1.1.1.1.1.1 - 18.01.2009 00:20 - (Antwort)
Du bekommst also in der Ausgabe im Browser das error_reporting(0) zu sehen?
Kann es sein, dass du die Anweisung nicht im PHP-Block reingeschreiben hast? Also nicht innerhalb von < ?php und ?>
brimbrambrum - #2.1.1.1.1.1.1.1.1 - 18.01.2009 14:14 - (Antwort)
ja du hast recht gehabt ich hab die anweisung nicht in den PHP-Block geschrieben! mein fehler sry!
jetzt hab ich sie aber reingeschrieben aber sie bewirkt nichts!
also der fehler bleibt der alte!
tut mir echt leid wenn ich dich jetzt die ganze zeit nerve ![]()
Mr. Foo - #2.1.1.1.1.1.1.1.1.1 - 18.01.2009 17:31 - (Antwort)
Ist doch kein Thema ![]()
Hast du jetzt mal in den Dateien nach der error_reporting Anweisung gesucht? Wie schon erwähnt, kann es sein, dass der Wert wieder irgendwo überschrieben wird.
Zusätzlich erstelle mal die Datei .htaccess und lege sie mit folgendem Inhalt in das Wurzelverzeichnis - also das in dem sich auch die index.php befindet:
php_value allow_call_time_pass_reference 1
php_value error_reporting 0
php_value display_errors 0
Madman - #3 - 02.05.2011 08:18 - (Antwort)
Für alle, die diesen Artikel noch mal lesen und der Teil oben nicht funktioniert:
Man kann auch vor die betreffende Zeile ein @-Zeichen setzen, das unterdrückt die Fehlermeldung auch.
Beispiel:
@foo(&$x);
