【问题标题】:PHP warning: Call-time pass-by-reference has been deprecatedPHP 警告:调用时传递引用已被弃用
【发布时间】:2011-06-07 15:18:16
【问题描述】:

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

这是什么原因造成的,如何解决?

【问题讨论】:

标签: php


【解决方案1】:

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

详细解释

PHP 允许以两种方式传递变量:“按值”和“按引用”。第一种方式(“按值”),您不能修改它们,其他第二种方式(“按引用”)您可以:

     function not_modified($x) { $x = $x+1; }
     function modified(&$x) { $x = $x+1; }

注意& 符号。如果我在一个变量上调用modified,它将被修改,如果我调用not_modified,它返回后参数的值将是相同的。

旧版本的 PHP 允许通过 not_modified(&$x) 模拟 modifiednot_modified 的行为:not_modified(&$x)。这是“调用时通过引用传递”。它已被弃用,不应使用。

此外,在非常古老的 PHP 版本(阅读:PHP 4 及之前)中,如果您修改对象,您应该通过引用传递它,因此使用&$this。这既没有必要也不再推荐,因为对象在传递给函数时总是会被修改,即这样有效:

   function obj_modified($obj) { $obj->x = $obj->x+1; }

这将修改$obj->x,即使它正式“按值”传递,但传递的是对象句柄(如在 Java 等中)而不是对象的副本,就像在 PHP 4 中那样。

这意味着,除非您正在做一些奇怪的事情,否则您几乎不需要传递对象(因此 $this 通过引用,无论是调用时间还是其他方式)。特别是,您的代码不需要它。

【讨论】:

  • 我还要指出,如果您尝试使用call_user_func('myfunc', &$param) 调用函数,则会显示上述错误,但如果您使用call_user_func_array('myfunc', array(&$param)) 则不会。不过,我不知道为什么,如果有人想解释一下:)
  • @MattFletcher 因为前者是调用时引用语法,已经被弃用很久了。后者只是将参数传递给一个函数(恰好是 call_user_func_array),所以它没有任何问题。所以是的,您可以使用后一种语法来进行调用时引用的雷达形式,或者您可以将其用于合法目的 - 例如为 by-ref 变量参数函数制作包装器(PDO 中的参数化绑定可能是一个例子)。差异是前者总是不合法且不需要,后者可能是合法的或不合法的,具体取决于使用情况。
  • First way, you can modify them, other way you can't 反过来:)
【解决方案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
?>

【讨论】:

  • “基本上,它允许您将引用(有点像 C 指针)传递给没有特别要求的函数。”
  • 明确一点,PHP 引用根本不像 C 指针。如果需要类比的话,它们更像是 UNIX 硬链接。
猜你喜欢
  • 2012-06-03
  • 2013-05-21
  • 1970-01-01
  • 2011-07-07
  • 2021-02-19
  • 1970-01-01
相关资源
最近更新 更多