我可以用$动态创建一个类吗? (美元符号)

时间:2014-01-29 16:31:36

标签: php

在PHP中,如果我可以定义一个函数或类似

的变量名的类,那将会很好
$myfunctionname="test";

function $myfunctionname(){
  //...
}

所以它会创建函数test()

或类似于:

$foo = bar;
class $foo {
  // lots of complicated stuff 
  // ...
}

但这不起作用。 就像这样会产生解析错误!

有解决方法吗?

(我知道,这不是一个好习惯,但作为一种解决方法,它会很方便)


编辑:我的实际问题:
我有一个迁移过程的框架,其中每个迁移步骤都在一个文件夹中的单独的php包含文件中。 每个文件只包含一个包含包含文件名称的迁移类。 因为类必须具有该特定名称,所以我想将类的名称创建为由文件名常量__FILE__

创建的通用名称。

4 个答案:

答案 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)

没有。由于$

,此代码在第3行引发了解析错误
$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;

See it in Action

如果你想分配方法,那么你必须使用魔法__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");
        }
    }
}

See it In Action

注意,正如其他几个人所说,这是不好的做法。如果本练习的目标是在运行时编写对象实例的行为,则更易于维护的解决方案是使用Strategy Pattern