【问题标题】:Call-time pass-by-reference does not generate E_DEPRECATED error调用时传递引用不会生成 E_DEPRECATED 错误
【发布时间】:2011-12-11 01:50:21
【问题描述】:

我遇到了E_DEPRECATED 消息的一致性问题。

我有以下sn-p的代码可以在命令行运行来演示。

php -d error_reporting=-1 -d display_errors=1 -r 'function foo(&$bar) {return $bar->title . ".";} $bar = new stdClass(); $bar->title = "foobar";打印 foo(&$bar) 。 PHP_EOL 。 PHP_VERSION 。 PHP_EOL;'

可读版本:

// error reporting set to E_ALL via command-line
function foo(&$bar) {
  return $bar->title . ".";
} 

$bar = new stdClass(); 
$bar->title = "foobar"; 

print foo(&$bar) . PHP_EOL . PHP_VERSION . PHP_EOL;
//        ^ this should raise E_DEPRECATED

我正在尝试使用此 sn-p foo(&$bar) 触发 PHP Deprecated: Call-time pass-by-reference has been deprecated 消息,但由于某种原因,它没有在我的本地安装中引发。

我已经将它传递给其他几个运行各种版本的 php、不同的操作系统等的环境,并得到了不同的结果:

预期:

mike@server:~$ php -d error_reporting=-1 -d display_errors=1 -r 'function foo(&$bar) {return $bar->title . ".";} $bar = new stdClass(); $bar->title = "foobar";打印 foo(&$bar) 。 PHP_EOL 。 PHP_VERSION 。 PHP_EOL;' 不推荐使用 PHP:第 1 行的命令行代码中不推荐使用调用时传递引用 富吧。 5.3.5-1ubuntu7.2

在我的环境中:

mike@local:~$ php -d error_reporting=-1 -d display_errors=1 -r 'function foo(&$bar) {return $bar->title . ".";} $bar = new stdClass(); $bar->title = "foobar";打印 foo(&$bar) 。 PHP_EOL 。 PHP_VERSION 。 PHP_EOL;' 富吧。 5.3.5-1ubuntu7.2

这可能是什么原因造成的?

更新:

我执行了以下操作来验证我的环境中是否仍在抛出已弃用的错误:

mike@local:~$ php -d error_reporting=-1 -d display_errors=1 -r 'eregi("test", "test");' 已弃用:函数 eregi() 在第 1 行的命令行代码中已弃用

【问题讨论】:

  • (tip) error_reporting(-1) 启用所有错误级别的报告。
  • @Gordon 很高兴知道!这对将来会有帮助。注意:我尝试更新我的命令以使用 error_reporting=-1 但得到了相同的结果。
  • php -d error_reporting=-1 -d display_errors=1 -r 'function f(&$b) {} f(&$c); var_dump(ini_get("error_reporting"), PHP_VERSION);' 提供了什么?
  • @salathe string(2) "-1" string(16) "5.3.5-1ubuntu7.2" 在我的机器上。但在其他人身上,它会抛出 Deprecated msg。另外,您的示例比我的示例要干净得多。介意我更新我的问题以使用它吗?

标签: php


【解决方案1】:

您的allow_call_time_pass_reference 设置是否已在 php.ini 中启用?

;该指令允许您启用和禁用 PHP 将发出的警告 ;如果您在函数调用时通过引用传递值。传递值 ;函数调用时的引用是一个已弃用的功能,将被删除 ;在不久的将来某个时候从 PHP 开始。通过a的可接受方法 ;引用函数的值是通过在函数中声明引用 ;定义,而不是在调用时。该指令不会禁用此功能,它 ;只决定 PHP 是否会警告你。这些警告 ;应仅在开发环境中启用。 ;默认值:开(禁止警告) ;开发值:关闭(发出警告) ;生产值:关闭(发出警告) ; http://www.php.net/manual/en/ini.core.php#ini.allow-call-time-pass-reference allow_call_time_pass_reference = 关闭

特别注意:

;默认值:开(禁止警告)

【讨论】:

  • 宾果游戏。一旦我将allow_call_time_pass_reference=0 添加到上面的测试中,我就开始收到错误。不确定该设置是如何进入我的 php.ini 的。再次感谢!
【解决方案2】:

通过引用传递给函数已经被弃用了很长一段时间(我相信自从 PHP 5 被引入以来?)这就是你收到警告的原因。只需调用foo($bar) 将通过引用传递参数,因为您已在函数定义中声明了这一点。

您得到不同结果的事实意味着 php.ini 文件中存在不同或错误报告编号已关闭(我相信它会在版本之间发生变化)。

【讨论】:

  • 我知道错误的含义以及如何解决它。我需要知道为什么在我明确设置 error_reporting 的情况下没有提出它。 “php.ini 文件中存在不同”这就是我要问的问题。什么 php 设置会影响这个?
  • -1:您还没有在这里回答问题。我怀疑你也没看过!
  • 我的第二段直接解决了所提出的问题,尽管不是结论性的。我不明白我是如何没有阅读问题的。
猜你喜欢
  • 2014-11-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 2013-11-17
相关资源
最近更新 更多