PHP警告:已不再推荐按引用传递调用时间。

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (7)

我收到警告: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;
}

它造成了什么原因,以及如何解决它?

提问于
用户回答回答于

移除&&$this在任何地方,它都是不需要的。事实上,我认为你可以&在这个代码中的任何地方--根本不需要它。

长篇解释

PHP允许以两种方式传递变量:“by value”和“by Reference”。第一种方法(“按值”),不能修改它们,另一种方法(“通过引用”)您可以:

     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
?>

扫码关注云+社区