Tencent / Biny

Biny is a tiny, high-performance PHP framework for web applications
BSD 3-Clause "New" or "Revised" License
1.69k stars 258 forks source link

在同一个方法中调用两个不同的$model 时, 后面的那个无法正常调用 #139

Open 3DMXM opened 2 years ago

3DMXM commented 2 years ago

我创建了两个 model,一个 redis 缓存相关, 一个 user 用户相关。 经过测试,如果只单独使用其中一个,没有问题,但如果两个混合使用,后面的那个model无法正常定位到方法。 如果把前面的 $data = App::$model->redis->GetWikiDataForPath($path); 注释掉, 后面的 $user_id = App::$model->user->GetUserId(); 就能正常获取到用户id了, 但如果前面的存在,后面的就会报错找不到 GetUserId 方法,原因是因为它去 redis 里面找的 。 将两个方法反过来, 如果先用 App::$model->user 之后,再调用 App::$model->redis ,它则会去 user 里面去找 redis 的方法,

image

image

billge1205 commented 2 years ago

不应该有这个问题 lib\models\Models.php 这个文件有改过吗? 可以分别把 App::$model->redis 和 App::$model->user 两个对象打印出来看看

billge1205 commented 2 years ago

我好像知道了 你的redis model对象 和 user model对象是不是用了同一个单例对象维护的? 当你第二个model获取的时候 因为有单例对象 所以就直接返回了上一个对象

billge1205 commented 2 years ago

App::$model->redis 本质是 返回了 app\model\redis::init() App::$model->user 本质是 返回了 app\model\user::init() 你看看是不是有用同一个单例类做了处理导致的

3DMXM commented 2 years ago

原来还要写 init() 的。。。 我压根就没写 init 和 construct 函数, 看了一眼 默认的 person.php , 加上 init 和 construct 函数之后问题解决了,感谢

billge1205 commented 2 years ago

嗯 优先init() 其次 construct 都不写的话 就走到了基类的construct 大概就是这个原因导致的 init() 的作用就是可以实现获取对应的model对象 例如 $user = App::$model->user($userid) 这样