V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JingNi
V2EX  ›  PHP

关于 ThinkPHP 可变量类名的问题,类名用变量代替就报错。

  •  
  •   JingNi · 2020-07-10 14:48:15 +08:00 · 1231 次点击
    这是一个创建于 1358 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为什么会报错啊

    • $className = 'User' ;
    • new $className; 报错
    • new User; 不报错

    我用原生 PHP 写了一个例子,测试了是可以用变量表示类名的,但在 ThinkPHP 里面就出现了这样的问题:

    public function index(){
        //请求视图
        $name = $_GET['name'];
    
        $tmp = Db::name('menu')->where('url','=',$name)->find();
        //判断视图是否为顶级
        if($tmp['upper']!=0){
            
            //查询上级名称
            $tmp = Db::name('menu')->where('id','=',$tmp['upper'])->find();
            
            //重新设置模板
            $template = $tmp['type']=='list' ?  $template = $tmp['url'] . '/' . $name : $name ;
            
            $className = ucfirst($tmp['url']);
            
            $data = new $className();
            $data = $data->$name();
        }else{
            //是顶级则默认模板
            $template = $name;
            $data = $this->$name();
        }
        //记录现行操作
        session('current',$name);
        
        //返回视图和数据
        return view($template,['data' => $data]);
    }
    
    liuguang
        1
    liuguang  
       2020-07-10 14:53:01 +08:00   ❤️ 1
    目测没加命名空间,new User 能直接用,是因为导入了这个类到当前的命名空间.
    但是如果 new $className; 那么$className 就必须是带命名空间的完整类名,例如$className= 'App\Models\User';
    JingNi
        2
    JingNi  
    OP
       2020-07-10 15:01:21 +08:00
    @liuguang 谢谢是这样的,第 2 条这应该和 autoload 的机制有关,当访问了一个不存在本文件中的 class 时命名空间会被自动带上.在根据 composer 里面 psr4.php 这些替换规则进行替换。spl_autoload
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5370 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:34 · PVG 16:34 · LAX 01:34 · JFK 04:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.