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

2021-01-11 17:49:38 +08:00
 frozenway
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();

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

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

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

$channelClass = "\\common\\services\\sms\\" . ucfirst($channel);
if (!class_exists($channelClass)) {
throw new NotFoundExceptions("短信发送类{$channelClass}不存在");
}
zpfhbyx
2021-01-11 18:49:27 +08:00

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

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

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

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

© 2021 V2EX