0

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

谢谢!

4

3 回答 3

6

与其复制粘贴,不如将__constructand__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)

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

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


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

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

您只需要$code动态构造变量。

我强烈建议不要这样做

  • 您的 IDE 中将没有代码辅助,因为它看不到该类
  • 你的班级不会有 phpdoc (同样的原因)
  • 总是有“ eval 是邪恶的”的东西——这是完全正确的,至少在这种情况下是这样。
  • new bicycle在没有声明类的情况下使用“ ”感觉不对!
  • 使用eval

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

于 2009-09-22T03:50:56.650 回答
0

好吧,对于__toString,你只要把它放在父类中。示例如下:

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

class bicycle extends BaseObject {
}

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

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

于 2009-09-22T03:26:18.010 回答
0

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

于 2009-09-22T13:47:18.913 回答