【问题标题】:Assigning the return value of new by reference is deprecated不推荐通过引用分配 new 的返回值
【发布时间】:2010-11-08 08:42:37
【问题描述】:

我刚刚遇到了一个错误。

当我尝试分配这样的对象时:

$obj_md = new MDB2();

我得到的错误是“不推荐使用通过引用分配新的返回值”。实际上我一直在寻找解决方案,但我看到的唯一一个就是拒绝 php.ini (error_reporting) 的策略。我也试过了,但是没有用。

这太令人困惑了..我希望你能帮助我。提前致谢。

【问题讨论】:

  • 你确定你的代码不是:$obj_md =& new MDB2(); 那确实应该发出警告。
  • 是的,我是。实际上 Zend 工作室告诉我有那个警告。
  • 我从 Zend 收到了同样的警告,但它是由我使用的另一个 libaray (xajax) 引起的。查看堆栈跟踪,您可能会发现此错误来自何处。无论如何,只需按照Johns answer 进行简单的搜索和替换即可修复它。

标签: php php-5.2


【解决方案1】:

在 PHP5 中,这个习语被弃用了

$obj_md =& new MDB2();

您确定您的示例代码中没有遗漏一个 & 符号吗?这会产生你所说的警告,但它不是必需的,可以删除。

要了解为什么在 PHP4 中使用此成语,请参阅 this manual page(请注意 PHP4 早已失效,此链接指向相关页面的存档版本)

【讨论】:

  • 不,我没有那个 & 号。 :(
  • 谢谢,手册的php4部分已重新排列,已更正链接。
  • 似乎MDB2源代码本身也使用了这种不推荐使用的赋值方法;每当创建 MDB2 对象时,几个人(包括我自己)都会在 PHP 5.3 上收到上述“已弃用”警告消息。看起来 MDB2 团队有一个错误:pear.php.net/bugs/bug.php?id=16508
  • 我在工厂方法中使用 tihs:$model=new $model_name(); 并有同样的错误,虽然我还没有调用该方法或类但它有同样的错误 Deprecated: Assigning the return value of new by reference is deprecated in D:\xampp\php\PEAR\Config.php on line 80
  • 这个答案很好,但可以通过解释用 =new 替换 =& new 是否有任何副作用来进一步改进。换句话说,为什么不推荐使用它? PHP 5 的新版本是否不再返回副本(因此使 =& 变得不必要),或者相反,如何处理通过引用进行分配实际上产生影响的情况?
【解决方案2】:

也许 MDB2 的构造函数有一些代码使用了 $variable =& new ClassName();

【讨论】:

    【解决方案3】:

    & 在 PHP 中用于将对象传递给方法/通过引用将新对象分配给变量。它在 PHP 5 中已被弃用,因为 PHP 5 默认通过引用传递所有对象。

    【讨论】:

    • "PHP 5 默认通过引用传递所有变量。"这不正确。 PHP5 通过引用传递所有 objects,但其他 vars 默认按值传递。 Fuller explanation
    • 正如@artfullrobot 所说。
    【解决方案4】:
    C:\wamp\www\..\libraries\pattemplate
    
    1.ini_set('display_errors', 0);
    
    $this->_modules[$moduleType][$sig]  =&new $moduleClass;   wrong
    
    $this->_modules[$moduleType][$sig]  =new $moduleClass;   Right
    

    【讨论】:

    • 这不是真正的解决方案,您在隐藏错误。您需要显示解决方案而不隐藏错误。
    【解决方案5】:

    这是因为 PHP 5.3 发生的,它包含在 WAMP 2.0i 包中,而不是 Joomla。

    你有两个选择来修复它,

    使用 WAMP 2h(以前的版本)或来自 WAMP 网站的 download PHP 5.2.9-2 插件。

    【讨论】:

      【解决方案6】:

      Nitin 是正确的 - 问题实际上出在 MDB2 代码中。

      根据Replacement for PEAR: MDB2 on PHP 5.3,您可以更新到MDB2 的SVN 版本,以获得与PHP5.3 兼容的版本。

      由于该答案是在 2010 年 3 月给出的,并且 http://pear.php.net/package/MDB2/ 显示几个月后的版本,我希望当前版本的 MDB2 也能解决这个问题。

      【讨论】:

        【解决方案7】:

        我最近将一个使用 SimplePie (http://simplepie.org/) 的站点从使用 PHP 5.2.17 的服务器移至使用 PHP 5.3.2 的服务器。正是在这一举动之后,我开始收到一系列错误消息,例如:

        不推荐使用:通过引用分配 new 的返回值是 在第 738 行的 .../php/simplepie.inc 中已弃用

        在查看了有关此问题的多次讨论后,我通过将 simplepie.inc 文件中的所有 =& new 实例替换为 = new 来澄清问题。 p>

        我没有足够的经验知道这是否适用于收到这些错误消息的所有情况,但它在这种特殊情况下有效,可能值得尝试。

        【讨论】:

          【解决方案8】:

          我遇到了同样的问题。我已经有了“&”,但它仍然给出了同样的警告。 我正在使用带有 WAMP 的 PHP 5.3,我所做的只是删除“&”符号并且警告消失了。

          $obj= new stdClass();  //Without '&' sign.
          

          【讨论】:

            【解决方案9】:

            从控制台升级您的 pear/MDB2:

            # pear upgrade MDB2-beta
            # pear upgrade MDB2_Driver_Mysql-beta
            

            Problem solved at version 2.5.0b3

            【讨论】:

              【解决方案10】:

              只需删除$obj_md =& new MDB2(); 中的new

              【讨论】:

                猜你喜欢
                • 2012-12-21
                • 1970-01-01
                • 2013-05-24
                • 2023-03-26
                • 2011-07-18
                相关资源
                最近更新 更多