动态子类生成 - PHP

时间:2009-09-22 02:26:52

标签: php oop class autoload

我有一个抽象的“对象”类,提供基本的CRUD功能以及验证等。通常我会使用__autoload($ name)魔术函数来加载一个存在于自己的文件中的类,命名方式与我希望懒惰加载的类。代码看起来像这样,你可以想象它变得非常重复。

final class bicycle extends object {
    public function __construct($id=null) {
      parent::__construct($id, __CLASS__);
    }
    public function __toString() {
      return($this->name);
    }
}

我的问题是我能否以某种方式动态生成这些类,因此我不必反复创建相同的功能 - 从而减少开销和设计时间。 PHP5甚至支持这个还是我只是高估了OO PHP的强大功能?

谢谢!

3 个答案:

答案 0 :(得分:6)

为什么不将__construct__toString方法的代码放在object类的定义中,而不是复制粘贴?

这样的事情应该做:

class object {
    public function __construct($id = null) {
        $this->name = get_class($this);
    }
    public function __toString() {
      return($this->name);
    }
    protected $name;
}

final class bicycle extends object {

}

并且,称之为:

$a = new bicycle();
var_dump($a);

你得到:

object(bicycle)[1]
  protected 'name' => string 'bicycle' (length=7)

这意味着类bicycle的实例,名称property的值正确。

无需复制粘贴任何代码 - 除了bicycle类本身的定义。


作为旁注,如果你真的想动态生成一个类,你可以使用这样的东西:

$code = 'final class bicycle extends object {}';
eval($code);

您只需动态构建$code变量。

我强烈建议不要这样做

  • 您的IDE中没有代码帮助,因为它无法看到类
  • 你的班级没有phpdoc (同样的理由)
  • 总有“ eval is evil ”的东西 - 这是完全正确的,至少在这种情况下。
  • 使用“new bicycle”而没有声明课程感觉错误!
  • 使用eval
  • 会有一些性能影响

声明一个新类并不是一件很痛苦的事情,我肯定更喜欢复制粘贴修改几行而不是使用这样的东西。

答案 1 :(得分:0)

嗯,对于__toString,你只需将它放在父类中。示例如下:     

class BaseObject {
    public function __toString() {
        return $this->name;
    }
}

class bicycle extends BaseObject {
}

$b = new bicycle();
$b->name = 'foo';
echo $b;

我不确定你要覆盖的构造函数要传递的内容 CLASS

答案 2 :(得分:0)

PHP5中不存在此功能。它可能在PHP6中可用,但由于ubuntu没有包,但我不会继续。