Подтвердить что ты не робот

Предупреждение 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;
}

Что это значит и как его исправить?

4b9b3361

Ответ 1

Удалите & из &$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 по ссылке, будь то время вызова или иначе). В частности, ваш код ему не нужен.

Ответ 2

На всякий случай, когда вам интересно, время вызова по ссылке - это устаревшая функция 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
?>