我需要一个在PHP上创建匿名类的想法。我不知道我的工作方式。
查看我的限制:
class {}
); class $name {}
); runkit
PECL。我需要什么,为什么:
好吧,我需要创建一个名为ie create_class()
的函数,它接收一个键名和一个匿名类。它对我有用,因为我想使用PHP无法接受的不同名称类符号。例如:
<?php
create_class('it.is.an.example', function() {
return class { ... }
});
$obj = create_object('it.is.an.example');
?>
所以,我需要一个接受这种用法的想法。我需要它,因为在我的框架中我有这条路:/modules/site/_login/models/path/to/model.php
。因此,model.php
需要声明一个名为site.login/path.to.model
的新类。
在调用create_object()
时,如果内部缓存具有$class
定义(如it.is.an.example
,则只返回新的类对象。如果不是,则需要加载。所以我将使用{{ 1}}内容可以快速搜索什么是类文件。
答案 0 :(得分:6)
您可以使用stdClass
创建一个虚拟类$the_obj = new stdClass();
答案 1 :(得分:6)
所以基本上你想要实现工厂模式。
Class Factory() {
static $cache = array();
public static getClass($class, Array $params = null) {
// Need to include the inc or php file in order to create the class
if (array_key_exists($class, self::$cache) {
throw new Exception("Class already exists");
}
self::$cache[$class] = $class;
return new $class($params);
}
}
public youClass1() {
public __construct(Array $params = null) {
...
}
}
在其中添加缓存以检查重复
答案 2 :(得分:5)
在PHP 7.0中,将有anonymous classes。我不完全理解您的问题,但您的create_class()
函数可能如下所示:
function create_class(string $key, array &$repository) {
$obj = new class($key) {
private $key;
function __construct($key) {
$this->key = $key;
}
};
$repository[$key] = $obj;
return $obj;
}
这将实例化一个具有匿名类类型的对象,并将其注册到$repository
。要获取对象,请使用您创建的密钥:$repository['it.is.an.example']
。
答案 3 :(得分:0)
如果您真的需要,可以使用eval()
$code = "class {$className} { ... }";
eval($code);
$obj = new $className ();
但众神不赞成这一点。如果你这样做,你会下地狱。