динамические имена классов в php - PullRequest
15 голосов
/ 20 августа 2011

У меня есть базовый класс с именем 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();

Ответы [ 7 ]

30 голосов
/ 20 августа 2011

Это должно работать для создания экземпляра класса со значением строковой переменной:

$type = 'Checkbox'; 
$field = new $type();
echo get_class($field); // Output: Checkbox

Так что твой код должен работать, я себе представляю. Какой у тебя вопрос снова?

Если вы хотите создать класс, который включает все расширенные классы, то это невозможно. Это не то, как классы работают в PHP.

13 голосов
/ 10 февраля 2014

Если вы используете пространство имен, вам нужно будет добавить его, даже если вы находитесь внутри пространства имен.

namespace Foo;

$my_var = '\Foo\Bar';
new $my_var;

В противном случае он не сможет получить класс.

6 голосов
/ 20 августа 2011

просто

$type = 'checkbox';
$filed = new $type();

требуется.вам не нужно добавлять скобки

1 голос
/ 29 января 2018

Потратил некоторое время на выяснение этого.Из документации 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
0 голосов
/ 20 августа 2011

Вы также можете использовать отражение, $class = new ReflectionClass($class_name); $instance = $class->newInstance(arg1, arg2, ...);

0 голосов
/ 20 августа 2011
$field_type = 'checkbox';
$field = new $field_type;

Если вам нужны аргументы:

$field_type = 'checkbox';
$field = new $field_type(5,7,$user);
0 голосов
/ 20 августа 2011

Этого должно быть достаточно:

$field_type = 'checkbox';
$field = new $field_type();

Код, с которым я тестировал его в PHP 5.3

$c = 'stdClass';

$a = new $c();

var_dump($a);

>> object(stdClass)#1 (0) {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...