php中的动态类名
我有一个名为php中的动态类名,php,oop,wordpress,Php,Oop,Wordpress,我有一个名为字段的基类,以及扩展此类的类,如文本,选择,无线电,复选框,日期,时间,数字,等等 使用include_once()在目录中递归地动态调用扩展字段的类。我这样做是为了我(和其他人)只需添加一个文件就可以轻松地添加一个新的字段类型 我想知道的是:有没有一种方法可以从这些动态包含的从变量名扩展类中证实一个新对象 e、 g.名称为复选框的类: $field_type = 'checkbox'; $field = new {$field_type}(); 也许这样行吗?但事实并非如此 $
字段
的基类,以及扩展此类的类,如文本
,选择
,无线电
,复选框
,日期
,时间
,数字
,等等
使用include_once()
在目录中递归地动态调用扩展字段的类。我这样做是为了我(和其他人)只需添加一个文件就可以轻松地添加一个新的字段类型
我想知道的是:有没有一种方法可以从这些动态包含的从变量名扩展类中证实一个新对象
e、 g.名称为复选框的类
:
$field_type = 'checkbox';
$field = new {$field_type}();
也许这样行吗?但事实并非如此
$field_type = 'checkbox';
$field = new $$field_type();
这可以使用字符串变量值实例化类:
$type = 'Checkbox';
$field = new $type();
echo get_class($field); // Output: Checkbox
我想你的代码应该能用。你的问题是什么
如果您想创建一个包含所有扩展类的类,那么这是不可能的。PHP中的类不是这样工作的。只是
$type = 'checkbox';
$filed = new $type();
是必需的。您不需要添加括号,这就足够了:
$field_type = 'checkbox';
$field = new $field_type();
我在PHP5.3中测试的代码
$c = 'stdClass';
$a = new $c();
var_dump($a);
>> object(stdClass)#1 (0) {
}
如果您需要参数:
$field_type = 'checkbox';
$field = new $field_type(5,7,$user);
您还可以使用反射,$class=newreflectionclass($class\u name)$实例=$class->newInstance(arg1,arg2,…)代码>如果您使用的是名称空间,则即使您位于名称空间内,也需要添加该名称空间
namespace Foo;
$my_var = '\Foo\Bar';
new $my_var;
否则它将无法获得该类。花了一些时间来解决这个问题。来自PHP文档:
请注意,因为合格的和合格的
动态类名、函数名或
常量名称,不需要前导反斜杠
我不想扩展多个类,尽管如果可能的话,这不会击败OOP。有些语言实际上允许lultiple继承,您可以通过:$my\u var=\uu\u名称空间\uuuu'对PHP>=5.3进行自动化\巴'代码>。
namespace Foo;
$my_var = '\Foo\Bar';
new $my_var;
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