PHP 可以通过变量动态实例化类,比如:
$classname = "SubjectsImport";
$foobar = new $classname;
但是新手在使用这一功能时,几乎总会碰到类不存在的异常:
message: "Class \"SubjectsImport\" not found"
即便我们已经通过 use 引用了要实例化的类,但是还是会报错:
use App\Imports\SubjectsImport;
//直接使用类名实例化,可以正常运行
$foobar = new SubjectsImport();
//使用变量动态实例化类,即便已经引用了正确的类文件,仍然会报 class not found 的异常。
$classname = "SubjectsImport";
$foobar = new $classname;
这是因为在 php 中导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。因此我们如果需要动态实例化类,那么需要自己拼接好类的命名空间,下面的代码就可以正常运行了。
$type = $this->payload['type'];
$class = 'App\\Imports\\ScienceResearch\\'.Str::ucfirst($type) . 'sImport';
$foo = new $class;