所以,我希望能够在运行时添加/删除类的方法。 之前你告诉我这是在接力可怕的初步实践,它可能是,但我真的不关心。 我希望能够做到这一点的原因是因为我想要的应用程序是非常模块化的,所以一些插件可以扩展一些基本的类和方法添加到它而不杀死的主要应用。
例如,说我有下面的类:
class User {
protected $Id;
protected $Name;
protected $Password;
protected $PostsPerPage;
}
并说,有些插件添加的可能性为用户更改其可见性设置,增加了$ Visible属性的类。 类将成为:
class User {
protected $Id;
protected $Name;
protected $Password;
protected $PostsPerPage;
protected $Visible;
}
这可以通过__get和__set来实现,但最常见的实现是获取和设置运行时生成的属性,它会是一个麻烦,以电码伪getter和setter每个添加的属性,以及使用__set是无糖没有在我看来。
其他的想法我是单独存储用户设置,在像$ UserVisiblitySettings [用户ID]另一个数组,但这会使事情并不像面向对象,因为我想他们是。
接下来的想法是使一个辅助类,是这样的:
class UserHelper {
public function SetVisiblity($user_object,value);
}
然后,我可以用__get和__set实行“朋友”的方法/类,但听起来太hackish的。 如果我一直这样下去还不如干脆超载__call,__get和__set。 此外,我不敢肯定这是很好的OOP初步实践,并且它会显得难看了。
最后我提出的想法是有一定的函数,在运行时使用的eval()(这是唯一有效的使用eval我能想出太)动态地创建类。 基本上,从文件中获取类的定义,做一些简单的支架找到找到类的开闭括号,然后邮寄到EVAL。
使用runkit是毫无疑问的,因为它已经过时,我宁可不强迫用户安装一些扩展。
当我仰望我的想法,最简单的一个,少CPU密集型似乎是超载_call并添加在类中注册方法的一种方式。
请未“不这样做”任何想法表示赞赏。