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

2020-07-10 14:48:15 +08:00
 JingNi

为什么会报错啊

我用原生 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]);
}
1260 次点击
所在节点    PHP
2 条回复
liuguang
2020-07-10 14:53:01 +08:00
目测没加命名空间,new User 能直接用,是因为导入了这个类到当前的命名空间.
但是如果 new $className; 那么$className 就必须是带命名空间的完整类名,例如$className= 'App\Models\User';
JingNi
2020-07-10 15:01:21 +08:00
@liuguang 谢谢是这样的,第 2 条这应该和 autoload 的机制有关,当访问了一个不存在本文件中的 class 时命名空间会被自动带上.在根据 composer 里面 psr4.php 这些替换规则进行替换。spl_autoload

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/688876

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX