我有一个名为field
的基类和扩展此类的类,例如text
,select
,radio
,checkbox
,{{1} },date
,time
等
使用number
以递归方式在目录中动态调用扩展field
类的类。我这样做是为了让我(和其他人)只需添加一个文件
我想知道的是:有没有办法从其中一个动态包含的变量名扩展类中证实一个新对象?
e.g。一个名为include_once()
的小组:
checkbox
也许这会奏效吗?但它没有?
$field_type = 'checkbox';
$field = new {$field_type}();
答案 0 :(得分:28)
这应该用于实例化具有字符串变量值的类:
$type = 'Checkbox';
$field = new $type();
echo get_class($field); // Output: Checkbox
所以你的代码应该可行。你的问题又是什么?
如果要创建包含所有扩展类的类,那么这是不可能的。这不是PHP中的类如何工作。
答案 1 :(得分:12)
如果您使用的是命名空间,即使您在命名空间内,也需要添加它。
namespace Foo;
$my_var = '\Foo\Bar';
new $my_var;
否则它将无法上课。
答案 2 :(得分:6)
只是
$type = 'checkbox';
$filed = new $type();
是必需的。你不需要添加括号
答案 3 :(得分:1)
花了一些时间搞清楚这一点。来自PHP文档Namespaces and dynamic language features:
请注意,因为qual和a之间没有区别 动态类名,函数名或内的完全限定名 常量名称,不需要前导反斜杠。
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
答案 4 :(得分:0)
这应该足够了:
$field_type = 'checkbox';
$field = new $field_type();
代码我在PHP 5.3中测试了它
$c = 'stdClass';
$a = new $c();
var_dump($a);
>> object(stdClass)#1 (0) {
}
答案 5 :(得分:0)
$field_type = 'checkbox';
$field = new $field_type;
如果你需要参数:
$field_type = 'checkbox';
$field = new $field_type(5,7,$user);
答案 6 :(得分:0)
您还可以使用反射$class = new ReflectionClass($class_name); $instance = $class->newInstance(arg1, arg2, ...);