我收到警告:以下代码行为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个地方移除&个,这是不需要的.事实上,我认为你可以在这段代码的任何地方删除&个——这根本不需要.

Long explanation

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

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

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

旧版本的PHP允许用not_modified模拟modified的行为,方法是:not_modified(&$x).这是"Call-Time Pass by Reference".它已被弃用,不应使用.

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

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

这将修改$obj->x,即使它正式地"按值"传递,但是传递的是对象句柄(就像在Java中一样,等等).而不是对象的副本,就像在PHP4中一样.

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

Php相关问答推荐

如何使用动态键来获取Laravel Livewire表格中的错误?

Postgrid Webhook不叫laravel

如何使用URL链接(mdl)切换选项卡

无法使用DOMPDF在PDF中呈现非ANSI字符

FatFreeFramework上的不同路由

WordPress:将自定义单选输入字段添加到用户配置文件

保存PHP条带以备将来使用,不显示用户界面

RediSearch PHP希望我在每次使用时定义所有字段

在没有谷歌云客户端PHP库的情况下将图像上传到PHP中的Google存储API?

在WooCommerce中禁用特定日期之前的免费送货

创建一个新的可变产品及其属性以用于WooCommerce中的变体

有没有可能从composer 过时的输出中隐藏不需要的主要版本?

从字符串转换日期和/或时间时,Laravel转换失败

从WooCommerce管理订单汇总中隐藏原始小计行

未检测到laravel控制器

如何解决 Laravel 外键错误?

Shopware 6 插件:如何删除布尔配置并将其迁移到多选配置

添加产品标签以通过 WooCommerce 邮箱通知订购商品

使用 phpseclib 验证 RSA-PSS

计算数组中连续值的数量