我收到警告: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;
}
它是什么原因以及如何解决?
答案 0 :(得分:144)
从&
处移除&$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
,无论是调用时还是其他方式)。特别是,您的代码不需要它。
答案 1 :(得分:20)
万一你想知道,通过引用传递一个调用时间是一个不推荐使用的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
?>