gpt4 book ai didi

PHP运行时类修改

转载 作者:可可西里 更新时间:2023-11-01 12:50:22 27 4
gpt4 key购买 nike

所以我希望能够在运行时添加/删除类方法。在你告诉我在 oop 中这是可怕的做法之前,它可能是,但我真的不在乎。我希望能够做到这一点的原因是因为我希望应用程序非常模块化,因此一些插件可以扩展一些基类并向其添加方法而不会杀死主应用程序。

例如,假设我有以下类(class):

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[userid],但这使得事情不像我希望的那样面向对象。

下一个想法是制作一个辅助类,像这样:

class UserHelper {
public function SetVisiblity($user_object,value);
}

然后,我可以使用 __get 和 __set 来实现“ friend ”方法/类,但这听起来太老套了。如果我要那样做,还不如重载 __call、__get 和 __set。此外,我不太确定这是好的 OOP 实践,而且看起来也很丑陋。

我的最后一个想法是通过使用 eval() 来拥有一些在运行时动态创建类的功能(这也是我能想到的 eval 的唯一有效用法)。基本上,从文件中获取类定义,进行一些简单的括号查找以找到类的左括号和右括号并将其发送给 eval。

使用 runkit 是不可能的,因为它已经过时了,我不想强​​迫用户安装一些扩展。

当我查看我的想法时,最简单且 cpu 密集度较低的方法似乎是重载 _call 并添加一种在类中注册方法的方法。

请感谢任何不是“不要这样做”的想法。

最佳答案

RunKit扩展可以做到这一点(runkit_method_add() 等)

然而,这是一个实验性的扩展,你已经瞄准了你的脚......

您还有其他选择:

  • 使用 __get()__call() 模拟新字段和方法
  • 使用子类化和工厂模式(class Plugin extends BaseImplementation 并让工厂实例化 Plugin 而不是 BaseImplementation)。 Zend Plugin Loader 做了类似的事情。
    这是开销最少的解决方案,但也仅限于一个插件扩展一个类。
  • 添加 Hook 并使用委托(delegate)(策略模式)($this->plugin->onFoo())。 There's library for this .

关于PHP运行时类修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1593497/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com