我正在尝试为我正在处理的项目动态创建数据库实体泛化的基础。我基本上想为扩展它的任何类中的属性动态创建一组标准方法和工具。就像您通过 Python/Django 免费获得的工具一样。
我从这个人那里得到了这个想法:http: //www.stubbles.org/archives/65-Extending-objects-with-new-methods-at-runtime.html
所以我已经实现了上面帖子中描述的 __call 函数,
public function __call($method, $args) {
echo "<br>Calling ".$method;
if (isset($this->$method) === true) {
$func = $this->$method;
$func();
}
}
我有一个函数,它通过 get_object_vars 为我提供对象公共/受保护的属性,
public function getJsonData() {
$var = get_object_vars($this);
foreach($var as &$value) {
if (is_object($value) && method_exists($value, 'getJsonData')) {
$value = $value->getJsonData;
}
}
return $var;
}
现在我想为他们创建一些方法:
public function __construct() {
foreach($this->getJsonData() as $name => $value) {
// Create standard getter
$methodName = "get".$name;
$me = $this;
$this->$methodName = function() use ($me, $methodName, $name) {
echo "<br>".$methodName." is called";
return $me->$name;
};
}
}
感谢 Louis H. 在下面指出了“使用”关键字。这基本上会即时创建一个匿名函数。该函数是可调用的,但它不再位于其对象的上下文中。它会产生“致命错误:无法访问受保护的财产”
不幸的是,我绑定到 PHP 5.3 版,它排除了 Closure::bind。因此,在 PHP中延迟加载类方法中建议的解决方案在这里不起作用。
我在这里很困惑......还有其他建议吗?
更新
为简洁起见进行了编辑。