动态子类生成 - PHP

Kyl*_*Dye 0 php oop class autoload

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

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

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

谢谢!

Pas*_*TIN 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 {

}
Run Code Online (Sandbox Code Playgroud)

并称之为:

$a = new bicycle();
var_dump($a);
Run Code Online (Sandbox Code Playgroud)

你得到 :

object(bicycle)[1]
  protected 'name' => string 'bicycle' (length=7)
Run Code Online (Sandbox Code Playgroud)

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

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


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

$code = 'final class bicycle extends object {}';
eval($code);
Run Code Online (Sandbox Code Playgroud)

您只需$code动态构造变量.

我强烈建议不要这样做:

  • 您将无法在IDE中获得代码帮助,因为它无法看到该类
  • 你的班级不会有phpdoc (同样的原因)
  • 总有" eval is evil "的东西 - 这是非常正确的,至少在这种情况下如此.
  • 使用" new bicycle"而没有宣布课程感觉不对!
  • 使用时必须有一些性能影响 eval

声明一个新类并不是那么痛苦,我肯定更喜欢复制粘贴 - 修改几行而不是使用这样的东西.