f000666 2024-02-20 14:11 采纳率: 50%
浏览 5
已结题

think php 利用反射,调用模型的find方法,失败:

think php 利用反射,调用模型的find方法,失败:

错误提示:

{"code":0,"message":"Method app\model\User::find() does not exist"}


public static function UpdateEntity($modelClass, $pid, $pidValue, $entity) : void
    {

        $reflection = new ReflectionClass($modelClass);
        $method = $reflection->getMethod('find');
        $instance = $method->invokeArgs(null, [$pidValue]);
        if ($instance)
        {
            $method = $reflection->getMethod('setAttr');
            foreach($entity as $propertyName=>$propertyValue)
            {
                if ($propertyName == $pid) continue;
                $method->invokeArgs($instance, [$propertyName, $propertyValue]);
            }
        }

        $method = $reflection->getMethod('save');                      
        $method->invokeArgs($instance, []);
    }
  • 写回答

1条回答 默认 最新

  • GISer Liu 2024-02-20 15:24
    关注

    该回答引用自GPT-3.5,由博主GIS_Liu编写:

    根据你提供的代码和错误提示,问题出在使用反射调用模型的 find 方法时报错,提示方法不存在。这是因为在 ThinkPHP 中,模型的 find 方法是动态调用的,而不是直接定义在模型类中的。因此,你需要修改代码以正确调用模型的 find 方法。

    你可以尝试以下解决方案:

    1. 修改反射调用的方法名:将 find 修改为 get,因为在 ThinkPHP 中,查询方法通常是 get 而不是 find
    $method = $reflection->getMethod('get');
    
    1. 使用静态调用:如果模型中确实定义了 find 方法,但是通过反射无法正确调用,可以尝试直接使用静态调用来执行方法。
    $instance = $modelClass::find($pidValue);
    
    1. 直接调用模型的方法:如果以上方法都无法解决问题,可以考虑直接调用模型类的方法,而不使用反射。
    $instance = $modelClass::where($pid, $pidValue)->find();
    

    以上是针对你提出的问题的解决方案,你可以根据实际情况选择适合你的方式进行修改。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月21日
  • 创建了问题 2月20日

悬赏问题

  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?
  • ¥15 QQ邮箱过期怎么恢复?
  • ¥15 登录他人的vue项目显示服务器错误
  • ¥15 (标签-android|关键词-app)
  • ¥15 comsol仿真压阻传感器