Уведомление о безопасности Из-за небезопасности разрешения конечному пользователю создавать экземпляры любого класса с помощью этого метода я настоятельно рекомендую не делать этого и не следовать моему примеру внизу.
Импорт классов не оценивается во время выполнения.Вы должны использовать полный путь к классу, чтобы динамически создать его экземпляр, как показано в этом примере:
<?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";
}
}
}
https://3v4l.org/LTdQN
Хотя вы можете сделать это, этопросить неприятностей.Что может помешать кому-либо извлекать данные из какой-либо модели, к которой у него нет доступа?
Вместо этого создайте массив доступных классов и разрешите ему передавать ключ массива вместо того, чтобы передавать имя класса.
$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];
}