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

如何实例化一个有命名空间的动态类?如下代码:

  •  
  •   frozenway · 2021-01-11 17:49:38 +08:00 · 1789 次点击
    这是一个创建于 1414 天前的主题,其中的信息可能已经有所发展或是发生改变。
    namespace app\index\model;
    
    function custom($bcids, $param){
        foreach($bcids as $custom){
            $file = env('extend_path').'custom/'.$custom['module'].'.php';
            if(file_exists($file)){
                $res = \custom\$custom['module']::instance()->run();
            }
        }
    }
    

    类文件在 custom 目录下,现在这样会报错,如果变量换成这样

    $res = \custom\Hello::instance()->run();
    

    则不会报错,大神,求助该怎么写?

    8 条回复    2021-01-11 18:49:27 +08:00
    frozenway
        1
    frozenway  
    OP
       2021-01-11 17:50:44 +08:00
    是 TP5.1 的
    Fishdrowned
        2
    Fishdrowned  
       2021-01-11 18:17:01 +08:00   ❤️ 1
    $res = "\\custom\\{$custom['module']}"::instance()->run();
    ben1024
        3
    ben1024  
       2021-01-11 18:22:40 +08:00   ❤️ 1
    1.字符拼接 "{$xxx}"
    2.exec 执行脚本
    jswh
        4
    jswh  
       2021-01-11 18:26:38 +08:00   ❤️ 1
    动态访问时基于字符串的,你可以简单的理解为编译器会先把字符替换到代码里,再执行代码,
    \custom\$custom['module'],这里的问题时不符合语法规范,namespace 不能后街变量。
    所以你得先搞出个完整的带 namespace 的类的字符串,然后再去调用。结果就是 2 楼。
    jswh
        5
    jswh  
       2021-01-11 18:28:12 +08:00   ❤️ 1
    @jswh
    动态访问是基于字符串的,你可以简单的理解为编译器会先把字符替换到代码里,再执行代码,
    \custom\$custom['module'],这里的问题是不符合语法规范,namespace 不能后接变量。
    所以你得先搞出个完整的带 namespace 的类名的字符串,然后再去调用。结果就是 2 楼。

    -------
    着急下班,一堆错字
    rophie123
        6
    rophie123  
       2021-01-11 18:29:03 +08:00 via iPhone
    PHP 牛逼
    wjfz
        7
    wjfz  
       2021-01-11 18:32:30 +08:00   ❤️ 1
    2 楼正解。
    我之前是这么弄的。

    $channelClass = "\\common\\services\\sms\\" . ucfirst($channel);
    if (!class_exists($channelClass)) {
    throw new NotFoundExceptions("短信发送类{$channelClass}不存在");
    }
    zpfhbyx
        8
    zpfhbyx  
       2021-01-11 18:49:27 +08:00   ❤️ 1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3565 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:59 · PVG 12:59 · LAX 20:59 · JFK 23:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.