【问题标题】:PHP wrong code works finePHP错误代码工作正常
【发布时间】:2016-01-18 10:25:23
【问题描述】:

我有以下代码:

 class A  {
   public function methodB() 
  {
    // do something
     return 1;
  }
 }


$a = A::methodB();

它永远不会起作用 它可以在那台机器上运行!它确实返回 1。真的,我发誓我没有喝醉。

当然,如果我在我的机器或生产服务器上运行它,它将无法工作。 因为你不能调用像静态这样的非静态方法。类应该总是首先被实例化。

我很担心。今天想,当我设置一个单独的工作机器来测试项目时,我再次获得了该代码工作的环境。

情况变得更糟 - 我的团队中有一些开发人员仍然不清楚静态和非静态方法之间的区别。结果,他们的代码在他们的机器上运行良好,但在任何其他环境下都失败了。

为什么它有效?我希望这样的代码失败。它不应该工作。

它工作的机器配置如下:

vagrant@vagrant-ubuntu-trusty-32:/var/www/apotheke$ php -v PHP 5.6.17-3+deb.sury.org~trusty+1 (cli) 版权所有 (c) 1997-2015 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies Zend OPcache v7.0.6-dev,版权所有 (c) 1999-2015,由 Zend Technologies 提供

真的,我觉得自己很愚蠢。 我错过了什么吗?

【问题讨论】:

  • 只要不使用$this,PHP中的这段代码就可以逍遥法外
  • 我希望它失败......(检查文档,我希望必须有一些设置让它失败)
  • 感谢上帝,我可以玩 config )

标签: php apache object static


【解决方案1】:

以上代码在 PHP 5 中有效。From the docs:

在 PHP 5 中,静态调用非静态方法会生成 E_STRICT 级别警告。

如果开启严格报错,会输出如下警告:

PHP 严格标准:非静态方法 A::methodB() 不应在第 1 行的 php shell 代码中静态调用

请注意该方法仍将运行并返回一个值。

在 PHP 7 中已弃用,不推荐使用。

在 PHP 7 中,静态调用非静态方法已被弃用,并且会生成 E_DEPRECATED 警告。将来可能会删除对静态调用非静态方法的支持。

【讨论】:

    【解决方案2】:

    您收到以下警告:

    严格标准:不应调用非静态方法 A::methodB() 静态的

    但 PHP 假定您无论如何都想运行它,所以执行它。

    为了防止它,您可以将方法更改为:

    class A  {
       public function methodB(){
           if(isset($this)){ 
               // do something
               return 1;
           }
       }
    }
    

    E_STRICT 错误无论如何都会被抛出(您可以禁用它),但 PHP 不会假定您打算运行它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      相关资源
      最近更新 更多