Ich erhalte die Warnung: Call-time pass-by-reference has been deprecated
für die folgenden Codezeilen:
function XML() {
$this->parser = &xml_parser_create();
xml_parser_set_option(&$this->parser, XML_OPTION_CASE_FOLDING, false);
xml_set_object(&$this->parser, &$this);
xml_set_element_handler(&$this->parser, 'open','close');
xml_set_character_data_handler(&$this->parser, 'data');
}
function destruct() {
xml_parser_free(&$this->parser);
}
function & parse(&$data) {
$this->document = array();
$this->stack = array();
$this->parent = &$this->document;
return xml_parse(&$this->parser, &$data, true) ? $this->document : NULL;
}
Was verursacht es und wie kann es behoben werden?
Antworten:
&
Von&$this
überall entfernen , es wird nicht benötigt. Tatsächlich denke ich, dass Sie&
diesen Code überall entfernen können - er wird überhaupt nicht benötigt.Lange Erklärung
PHP ermöglicht die Übergabe von Variablen auf zwei Arten: "nach Wert" und "nach Referenz". Erster Weg ("nach Wert"), Sie können sie nicht ändern, anderer zweiter Weg ("nach Referenz") können Sie:
function not_modified($x) { $x = $x+1; } function modified(&$x) { $x = $x+1; }
Beachten Sie das
&
Schild. Wenn ichmodified
eine Variable aufrufe, wird sie geändert, wenn ich sie aufrufenot_modified
, nachdem sie zurückgegeben wurde, ist der Wert des Arguments der gleiche.Ältere Versionen von PHP können das Verhalten von
modified
mit simulieren,not_modified
indem Sie Folgendes tun :not_modified(&$x)
. Dies ist "Anrufzeit als Referenz". Es ist veraltet und sollte niemals verwendet werden.Wenn Sie in sehr alten PHP-Versionen (lesen Sie: PHP 4 und früher) Objekte ändern, sollten Sie diese als Referenz übergeben, also die Verwendung von
&$this
. Dies ist weder notwendig noch empfehlenswert, da Objekte immer geändert werden, wenn sie an function übergeben werden, dh dies funktioniert:function obj_modified($obj) { $obj->x = $obj->x+1; }
Dies würde sich ändern
$obj->x
, obwohl es formal "nach Wert" übergeben wird, aber was übergeben wird, ist das Objekthandle (wie in Java usw.) und nicht die Kopie des Objekts, wie es in PHP 4 war.Dies bedeutet, dass Sie, es sei denn, Sie tun etwas Seltsames, fast nie ein Objekt übergeben müssen (und somit als
$this
Referenz, sei es zur Anrufzeit oder auf andere Weise). Insbesondere benötigt Ihr Code es nicht.quelle
call_user_func('myfunc', &$param)
aber nicht, wenn Sie verwendencall_user_func_array('myfunc', array(&$param))
. Ich weiß aber nicht warum , wenn jemand Licht ins Dunkel bringen will :)First way, you can modify them, other way you can't
umgekehrt :)Nur für den Fall, dass Sie sich fragen, ist eine Anrufzeit als Referenz eine veraltete PHP-Funktion, die die lose Eingabe von PHP fördert. Grundsätzlich können Sie eine Referenz (ähnlich einem C-Zeiger) an eine Funktion übergeben, die nicht speziell nach einer solchen gefragt hat. Es ist PHPs Lösung für den quadratischen Stift in einem Problem mit runden Löchern.
In Ihrem Fall niemals referenzieren
$this
. Außerhalb einer Klasse können Sie durch einen Verweis auf ihre Klasse$this
nicht auf ihre privaten Methoden und Felder zugreifen.Beispiel:
<?php function test1( $test ) {} //This function doesn't want a reference function test2( &$test ) {} //This function implicitly asks for a reference $foo = 'bar'; test2( $foo ); //This function is actually given a reference test1( &$foo ); //But we can't force a reference on test1 anymore, ERROR ?>
quelle