从动态输入创建新的php对象(laravel/octobercms)
在laravel中拥有对象:从动态输入创建新的php对象(laravel/octobercms),php,laravel,object,octobercms,Php,Laravel,Object,Octobercms,在laravel中拥有对象: use AAA; use BBB; use CCC; ... 从输入中获取名称:“AAA…” 我能否做到这一点: $obj = new $from_input; return $obj::where('status', 1)->get(); “new”函数找不到类“AAA” 我帮不上忙。 请给我一些建议 安全注意事项由于允许最终用户通过此方法实例化任何类的不安全性,我强烈建议不要这样做并遵循下面的示例 类导入不会在运行时进行计算。您必须使用类的完整路径来动
use AAA;
use BBB;
use CCC;
...
从输入中获取名称:“AAA…”
我能否做到这一点:
$obj = new $from_input;
return $obj::where('status', 1)->get();
“new”函数找不到类“AAA”
我帮不上忙。
请给我一些建议
安全注意事项由于允许最终用户通过此方法实例化任何类的不安全性,我强烈建议不要这样做并遵循下面的示例
类导入不会在运行时进行计算。您必须使用类的完整路径来动态实例化它,如本例所示:
<?php
namespace One {
use Two\B;
class A {
function __construct($className) {
echo "Attempting to construct $className..";
new $className;
}
}
new A(B::class); // Works since the B import is evaluated before runtime.
try {
new A("B"); // Doesn't work since "B" is not evaluated until runtime
}
catch (\Throwable $e) {
echo $e->getMessage() . "\n";
}
new A("Two\B"); // Works since you use the full path to B.
}
namespace Two {
class B {
function __construct() {
echo "B constructed!\n";
}
}
}
安全注意事项由于允许最终用户通过此方法实例化任何类的不安全性,我强烈建议不要这样做并遵循下面的示例
类导入不会在运行时进行计算。您必须使用类的完整路径来动态实例化它,如本例所示:
<?php
namespace One {
use Two\B;
class A {
function __construct($className) {
echo "Attempting to construct $className..";
new $className;
}
}
new A(B::class); // Works since the B import is evaluated before runtime.
try {
new A("B"); // Doesn't work since "B" is not evaluated until runtime
}
catch (\Throwable $e) {
echo $e->getMessage() . "\n";
}
new A("Two\B"); // Works since you use the full path to B.
}
namespace Two {
class B {
function __construct() {
echo "B constructed!\n";
}
}
}
您可以调用IoC容器,该容器将为您构建具有任何注入依赖项的对象
$obj=app()->make($from_input)
或者干脆
$obj=app($from_input)
您可以调用IoC容器,该容器将为您构建具有任何注入依赖项的对象
$obj=app()->make($from_input)
或者干脆
$obj=app($from_input)
不$cat=‘AAA’$obj=应用程序($cat);dd($obj);未找到类AAA。这可能是命名空间问题,在您的示例中,您包含了use AAA代码>所以应该找到它。可能AAA
没有正确的名称空间。不,名称空间没有问题。另外,如果我使用的it应用程序(AAA::class)运行良好,那么这个应用程序不会运行,但是:$test='AAA';dd(应用程序(“Mishai\Sitemanager\Models\\{$test}”);做谢谢!)dd((应用程序(“Mishai\Sitemanager\Models\\{$test}”)::get());这一个也是在::where和其他方法也起作用之后。再次感谢你$cat=‘AAA’$obj=应用程序($cat);dd($obj);未找到类AAA。这可能是命名空间问题,在您的示例中,您包含了use AAA代码>所以应该找到它。可能AAA
没有正确的名称空间。不,名称空间没有问题。另外,如果我使用的it应用程序(AAA::class)运行良好,那么这个应用程序不会运行,但是:$test='AAA';dd(应用程序(“Mishai\Sitemanager\Models\\{$test}”);做谢谢!)dd((应用程序(“Mishai\Sitemanager\Models\\{$test}”)::get());这一个也是在::where和其他方法也起作用之后。再次感谢这不是很有活力,但很有效。因为我需要拿着字典上课。有机会吗:我可以将字符串名(AAA,BBB…)与类定义结合起来吗$obj=app($from_input.'::class');不起作用。@aleXela,那会破坏这个答案的目的,防御性编程。允许用户定义要实例化的类是非常不安全的::class
只是一个给出类全名的关键字,您不应该像示例中那样将::class
用作字符串。我知道,我可以在后端工作以使其更安全。你能告诉我怎么做吗?谢谢,lota完全同意,但我的天性要求我知道如何使用它,即使我不会使用它。)问题是在运行时不会对从use
导入进行评估。您需要使用类的完整路径:这不是动态的,但可以工作。因为我需要拿着字典上课。有机会吗:我可以将字符串名(AAA,BBB…)与类定义结合起来吗$obj=app($from_input.'::class');不起作用。@aleXela,那会破坏这个答案的目的,防御性编程。允许用户定义要实例化的类是非常不安全的::class
只是一个给出类全名的关键字,您不应该像示例中那样将::class
用作字符串。我知道,我可以在后端工作以使其更安全。你能告诉我怎么做吗?谢谢,lota完全同意,但我的天性要求我知道如何使用它,即使我不会使用它。)问题是在运行时不会对从use
导入进行评估。您需要使用类的完整路径:
$classes = [
'a' => AAA::class,
'b' => BBB::class,
'c' => CCC::class,
];
// $from_input being a, b, or c
if (isset($classes[$from_input])) {
$obj = new $classes[$from_input];
}