Я получаю предупреждение: Call-time pass-by-reference has been deprecated
для следующих строк кода:
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; }
Что это значит и как это исправить?
Удалите &
from &$this
везде, это не нужно. На самом деле, я думаю, вы можете удалить &
везде в этом коде – это совсем не нужно.
Длительное объяснение
PHP позволяет передавать переменные двумя способами: «по значению» и «по ссылке». Первый способ («по значению»), вы не можете изменить их, другой второй способ («по ссылке») вы можете:
function not_modified($x) { $x = $x+1; } function modified(&$x) { $x = $x+1; }
Обратите внимание на знак &
. Если я вызову modified
для переменной, он будет изменен, если я вызову not_modified
, после того, как он вернет значение аргумента, будет таким же.
Старая версия PHP позволяла моделировать поведение modified
с not_modified
, делая это: not_modified(&$x)
. Это «время вызова по ссылке». Он устарел и никогда не должен использоваться.
Кроме того, в очень древних версиях PHP (читайте: PHP 4 и ранее), если вы изменяете объекты, вы должны передать их по ссылке, поэтому использование &$this
. Это уже не необходимо и не рекомендуется, поскольку объект всегда изменяется при передаче функции, т. Е. Это работает:
function obj_modified($obj) { $obj->x = $obj->x+1; }
Это изменило бы $obj->x
даже если оно формально передается «по значению», но передается дескриптор объекта (например, в Java и т. Д.), А не копия объекта, как это было в PHP 4.
Это означает, что, если вы не делаете что-то странное, вам почти никогда не нужно передавать объект (и, следовательно, $this
по ссылке, будь то время вызова или иначе). В частности, ваш код ему не нужен.
На всякий случай, когда вам интересно, время вызова по ссылке – это устаревшая функция PHP, которая способствует неуправляемой печати PHP. В принципе, он позволяет передать ссылку (вроде как указатель C) функции, которая специально не запрашивала ее. Это решение PHP для квадратной привязки в проблеме с круглым отверстием.
В вашем случае никогда не ссылайтесь на $this
. Вне класса ссылка на его $this
не позволит вам получить доступ к его частным методам и полям.
Пример:
<?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 ?>