在PHP中,如果我可以定义一个函数或类似
的变量名的类,那将会很好$myfunctionname="test";
function $myfunctionname(){
//...
}
所以它会创建函数test()
或类似于:
$foo = bar;
class $foo {
// lots of complicated stuff
// ...
}
但这不起作用。 就像这样会产生解析错误!
有解决方法吗?
(我知道,这不是一个好习惯,但作为一种解决方法,它会很方便)
编辑:我的实际问题:
我有一个迁移过程的框架,其中每个迁移步骤都在一个文件夹中的单独的php包含文件中。
每个文件只包含一个包含包含文件名称的迁移类。
因为类必须具有该特定名称,所以我想将类的名称创建为由文件名常量__FILE__
答案 0 :(得分:1)
是的,你可以,但我不想要你。
$classname = "test";
eval("class {$classname}{ public function hello(){ echo \"hello!\"; } }");
$evil_class = new $classname();
$evil_class->hello(); // echo's "hello!"
现在,如果你不介意我,我就去洗个澡。
答案 1 :(得分:1)
您可以使用工厂模式:
class poly_Factory {
public function __construct() {
$class = 'poly';
return new $class();
}
}
如果那是你想去的地方。
http://net.tutsplus.com/tutorials/php/understanding-and-applying-polymorphism-in-php/ 向下滚动到第4步,最后一部分......
我知道你没有要求这样做,但你的问题对你有什么好处呢?
答案 2 :(得分:0)
没有。由于$
:
$foo = 'bar';
class $foo {
function hello() {
echo "World";
}
}
$mybar = new bar();
$mybar->hello();
结果:
解析错误:语法错误,意外的T_VARIABLE,期望第3行的T_STRING
正如Jan Dvorak在评论中所指出的那样:即使你想办法做到这一点,也不要这样做。
答案 3 :(得分:0)
如果要创建值对象,可以使用stdClass内置类型。
$object = new stdClass;
$object->someValue = "Hello World";
echo $object->someValue;
如果你想分配方法,那么你必须使用魔法__call函数,我就是这样做的。
class AnonObject{
private $properties = array();
private $methods = array();
public function __get($property){
return array_key_exists($property, $this->properties)?$this->properties[$property]:null;
}
public function __set($property, $value){
if (!is_string($value) && is_callable($value)){
if ($value instanceof \Closure){
// bind the closure to this object's instance and static context
$this->methods[$property] = $value->bindTo($this,get_class($this));
} else {
// invokable objects
$this->methods[$property] = $value;
}
} else {
$this->properties[$property] = $value;
}
}
public function __call($method, $args){
if (array_key_exists($method, $this->methods)){
call_user_func_array($this->methods[$method], $args);
} else {
throw new RuntimeException("Method ".$method." does not exist on object");
}
}
}
注意,正如其他几个人所说,这是不好的做法。如果本练习的目标是在运行时编写对象实例的行为,则更易于维护的解决方案是使用Strategy Pattern