Предупреждение PHP: время прохода по ссылке устарело

Я получаю предупреждение: 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 ?>