当前位置: 首页 > 面试题库 >

PHP警告:调用时传递引用已被弃用

端木桐
2023-03-14
问题内容

我收到警告: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允许通过两种方式传递变量:“按值”和“按引用”。第一种方式(“按值”)不能修改,而第二种方式(“按引用”)可以:

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

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

通过执行以下操作,较旧版本的PHP可以模拟modifiedwith
not_modified的行为:not_modified(&$x)。这是“通过引用传递时间”。不推荐使用,永远不要使用它。

另外,在非常古老的PHP版本中(阅读:PHP
4和更低版本),如果您修改对象,则应通过引用传递它,从而使用&$this。既不需要也不建议这样做,因为在将对象传递给函数时总是会对其进行修改,即可以:

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

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

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



 类似资料:
  • 这是我的代码,意味着在 youtube 上进行搜索测试,但是当我运行它时,youtube 打开并收到一条错误消息,说“弃用警告:executable_path已被弃用,请传入服务对象。我的chromedriver与我的python文件位于同一文件夹中。

  • 问题内容: 我正在使用react-navigation实现2个屏幕。但是导航到第二页时出现以下警告: 警告:isMounted(…)在纯Javascript类中已弃用。相反,请确保在componentWillUnmount中清除订阅和未决请求,以防止内存泄漏。 版本: 反应:16.3.1 反应本机:0.55.2 反应导航:1.5.11 效用:0.10.3 Login.js Home.js 我在这里

  • 问题内容: 我有一个React组件,我想在单击时切换一个CSS类。 所以我有这个: 这个问题是ESLint不断告诉我“ this.refs”已贬值。 我该怎么办?我如何解决它而不使用折旧的代码? 问题答案: 您要引用的Lint规则称为 no-string-refs, 并通过以下方式警告您: 之所以收到此警告,是因为已实现了不赞成使用的使用方式(通过使用字符串)。根据您的React版本,您可以执行以

  • 问题内容: 我刚刚更新到Django v1.8,并在更新项目之前测试了本地设置,并且发出了弃用警告,这是我从未见过的,对我也没有任何意义。我可能只是忽略了某些内容或误解了文档。 现在,这对我提出了3个问题。 根据文档,Options.app_label除非模型不在应用程序模块之外,否则不是必需的,在我看来,不是这样。其次,无论如何,此行为在1.7中已被弃用,那么为什么它甚至成为问题? 这些应用程序

  • 我刚刚卸载了我的旧版本Ruby,删除了我的所有gem(包括Rails),并安装了Ruby 2.0。换句话说,完全干净的重新安装。启动IRB后,我收到以下消息: 注意:我在一台视窗机器上。 这个信息是什么意思?

  • 在PHP7.4.0中,我看到了以下警告: 我的错误/异常处理程序无法捕获并记录它们。 示例: 警告仍显示在正常输出中,并且两个处理程序均未调用。 我想在自己的日志中记录所有错误、异常和警告,但处理程序无法捕获此警告。是否有这样的原因或解决方案来捕获并记录PHP抱怨的所有内容(无法访问服务器Apache/PHP日志)?