2017-02-25 18:54:28 3912次浏览 3条回答 0 悬赏 30 金钱
namespace common\models;
class Post extends \yii\db\ActiveRecord{
    public function test(){
         return 'test';
    }

}

在控制器中,比如

namespace frontend\controllers;
use common\models\Post;
class PostController extends \yii\web\Controller{
     public function actionIndex(){
         $a=Post::test();
     }
}

为何不报错呢?
public function test() 也不是静态方法,被静态调用也不报错。。。希望知道的指点下

  • 回答于 2017-02-26 09:24 举报

    是的,可以的,但不是yii2的问题,是php4引入的时候就支持了这个事情,不过不建议,内存也没省,还容易混淆,还是不要这样用吧。

    1 条回复
    回复于 2017-02-26 11:48 回复

    但我用原生的php就会报错。
    Strict Standards: Non-static method MyClass::showConstant() should not be called statically

    觉得很赞
  • 回答于 2017-02-27 09:16 举报

    跟php版本有关,高版本的php会提示,似乎5.5以下的没有提示

    1 条回复
    回复于 2018-01-06 21:54 回复

    谢谢,(^o^)/~

    觉得很赞
  • 回答于 2017-09-01 12:03 举报

    在C++等其它语言中看来这属于非法调用,因为它增加了代码理解难度,代码的可读性变得很差,但在PHP中,是可以的,但也是不推荐的。之所以可以这么调用,是因为PHP的过程式语言过渡到面向对象时,对处理子类继承父类并覆盖了父类的函数,同时又想在子类中使用父类的该函数时,做的一个奇怪的决定,使用 :: 符号引用父类的该函数,该符号在这里不代表静态调用,而只是单纯的想调用父类的函数的意思,并且其calling scope 还是子类的,也就是说父类函数中使用$this->的地方仍然在子类的调用空间内。同时这种使用方法当时做了合法性判断,只用于以上的继承覆盖调用父类函数的情况,但由于效率问题,后来取消了该判断,交由程序员自己规范此类代码。

    但现在来说,很多程序在非以上情况下使用这种特性,虽然php又重新用parent::方式重新定义了以上场景的使用方法,但为了向下兼容,不得已,仍然可以静态调用非静态方法,但不推荐使用,所以出现了题主遇到的警告信息。

    Strict Standards: Non-static method MyClass::showConstant() should not be called statically只是一个警告,并非至命错误,仍然是可以执行成功的,yii2里面将Strict Error这个警告去掉了,所以看不见

    1 条回复
    回复于 2018-01-06 21:54 回复

    谢谢,(^o^)/~

    觉得很赞
您需要登录后才可以回答。登录 | 立即注册
沐风待雨
经理

沐风待雨 shenzhen

注册时间:2015-01-07
最后登录:2018-03-03
在线时长:16小时22分
  • 粉丝8
  • 金钱350
  • 威望50
  • 积分1010

热门问题