【问题标题】:Dynamic Child Class generation - PHP动态子类生成 - PHP
【发布时间】:2009-09-22 02:26:51
【问题描述】:

我有一个抽象的“对象”类,它提供基本的 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 的力量?

谢谢!

【问题讨论】:

    标签: php oop class autoload


    【解决方案1】:

    与其复制粘贴,不如将__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 一定会对性能产生影响

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

    【讨论】:

      【解决方案2】:

      好吧,对于 __toString,您只需将它放在父类中即可。示例如下:

      class BaseObject {
          public function __toString() {
              return $this->name;
          }
      }
      
      class bicycle extends BaseObject {
      }
      
      $b = new bicycle();
      $b->name = 'foo';
      echo $b;
      

      我不确定您通过重写构造函数以传入 CLASS 来完成什么。

      【讨论】:

      • 子类将它的名称传递给父类的构造函数,以通过一系列测试运行,最终,使用命名系统,它确定表名(如果存在)并提供一个自动轨道-esque 脚手架环境。这节省了我很多工作时间,因为我必须想出一些基本的小应用程序来安抚一些经理。 :)
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-07
        • 1970-01-01
        • 2014-08-07
        • 2013-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多