我想从返回的字符串创建一个类的对象但是我收到错误Class **test_report** not found
。我的代码:
public function display_report_builder($report_name = null)
{
$column_listing = new $report_name;// gets the test_report
return view('column_list')->with(['column_list_names' => $column_listing->columns]);
}
答案 0 :(得分:0)
这不是更好的方法。你应该做的是使用Factory design pattern:
class ReportFactory
{
public static function create($report_name)
{
switch($report_name) {
case 'test_report': return new TestReport();
default: throw new Exception('report not found');
}
}
}
然后用$column_listing = ReportFactory::create($report_name);
为什么呢?因为你避免使用未知数据的“魔术变量”;你可以正确追踪错误;你可以使用命名空间;您可以轻松扩展功能,轻松激活或停用对象(或本例中的报告);你有一个更干净的代码,等等......
答案 1 :(得分:0)
测试类名(字符串)是否真的是一个有效的类:
public function display_report_builder($report_name = null)
{
$column_list_names = null;
if (class_exists($report_name) && is_a($report_name, App\reports\test_report::class, true)) {
$column_listing = new $report_name;
$column_list_names = $column_listing->columns;
}
return view('column_list', compact('column_list_names'));
}
is_a():检查给定对象是否属于此类或具有此类 作为其父母之一。