Динамические имена классов в php
У меня есть базовый класс под названием field
и классы, которые расширяют этот класс, такие как text
, select
, radio
, checkbox
, date
, time
, number
и т.д.
Классы, расширяющие класс field
, динамически вызывают в каталоге рекурсивно, используя include_once()
. Я делаю это так, чтобы я (и другие) мог легко добавить новый тип поля только путем добавления одного файла
Что я хочу знать: есть ли способ обосновать новый объект из одного из этих динамически включенных расширяющих классов из имени переменной?
например. класс с именем checkbox
:
$field_type = 'checkbox';
$field = new {$field_type}();
Может, это сработает? но это не так?
$field_type = 'checkbox';
$field = new $$field_type();
Ответы
Ответ 1
Это должно работать, чтобы создать экземпляр класса со значением переменной строки:
$type = 'Checkbox';
$field = new $type();
echo get_class($field); // Output: Checkbox
Итак, ваш код должен работать, я бы себе. Каков ваш вопрос снова?
Если вы хотите создать класс, который включает все расширенные классы, это невозможно. Это не то, как классы работают в PHP.
Ответ 2
Если вы используете пространство имен, вам нужно будет добавить его, даже если вы находитесь в пространстве имен.
namespace Foo;
$my_var = '\Foo\Bar';
new $my_var;
В противном случае он не сможет получить класс.
Ответ 3
просто
$type = 'checkbox';
$filed = new $type();
. вам не нужно добавлять скобки
Ответ 4
Этого должно быть достаточно:
$field_type = 'checkbox';
$field = new $field_type();
Код, который я тестировал в PHP 5.3
$c = 'stdClass';
$a = new $c();
var_dump($a);
>> object(stdClass)#1 (0) {
}
Ответ 5
$field_type = 'checkbox';
$field = new $field_type;
Если вам нужны аргументы:
$field_type = 'checkbox';
$field = new $field_type(5,7,$user);
Ответ 6
Вы также можете использовать отражение, $class = new ReflectionClass($class_name); $instance = $class->newInstance(arg1, arg2, ...);
Ответ 7
Провел некоторое время, поняв это. Из документации PHP Пространства имен и динамические языковые функции:
Обратите внимание, что, поскольку нет никакой разницы между квалифицированным и полное имя в имени динамического класса, имени функции или постоянное имя, ведущая обратная косая черта не требуется.
namespace namespacename;
class classname
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function funcname()
{
echo __FUNCTION__,"\n";
}
const constname = "namespaced";
/* note that if using double quotes, "\\namespacename\\classname" must be used */
$a = '\namespacename\classname';
$obj = new $a; // prints namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // also prints namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // prints namespacename\funcname
$b = '\namespacename\funcname';
$b(); // also prints namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // prints namespaced
echo constant('namespacename\constname'), "\n"; // also prints namespaced