php中的动态类名

时间:2011-08-20 10:50:37

标签: php oop wordpress

我有一个名为field的基类和扩展此类的类,例如textselectradiocheckbox,{{1} },datetime

使用number以递归方式在目录中动态调用扩展field类的类。我这样做是为了让我(和其他人)只需添加一个文件

即可轻松添加新的字段类型

我想知道的是:有没有办法从其中一个动态包含的变量名扩展类中证实一个新对象?

e.g。一个名为include_once()的小组:

checkbox

也许这会奏效吗?但它没有?

$field_type = 'checkbox';

$field = new {$field_type}();

7 个答案:

答案 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, ...);