我有一个抽象的“对象”类,提供基本的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的强大功能?
谢谢!
答案 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
变量。
但我强烈建议不要这样做:
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没有包,但我不会继续。