thinkphp 门面 facade Non-static method?

基类

<?php

namespace app\service;

use think\Facade;
use think\Model;

abstract class BaseService extends Facade
{
    protected Model $model;
    public function IList(){}
    public function Test(){}
}

代理类

<?php

namespace app\service;

use app\model\AdminModel;
use think\Model;

class AdminService extends BaseService
{
  protected Model $model;
  function __construct()
  {
    $this->model = new AdminModel();
  }
  protected static function getFacadeClass()
  {
    return "app\service\AdminService";
  }
  function test()
  {
    echo 1;
  }
}

然后调用

<?php

namespace app\facade;

use app\service\AdminService;

class TestFacade
{

    function test()
    {
       AdminService::test();
    }
}

这里的调用会提示,没有静态方法。请问是我哪里写错了吗?

参考资料:

https://doc.thinkphp.cn/v8_0/facade.html

阅读 3.1k
1 个回答

当你继承自 Facade 时,如果 尝试静态调用一个不可访问的方法, 就会触发 Facade__callStatic 方法,他会去尝试解析 getFacadeClass 方法返回的类名,从而调用实际的方法。

而你这里的 AdminService::test(),因为 AdminService 已经存在有可访问的 test 方法了,所以不满足 __callStatic 的调用条件,而你这里的 test 方法并不是静态的,所以报错了。

还有,你这个 AdminService 实际就是为他自身创建了一个 Facade,虽然是可以这样做,但是一般为了方便管理,是不建议这样做,而是单独放一个文件。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题