在PHP中,uopz 是一个扩展,它公开了在编译和执行阶段通常使用的 Zend Engine 功能。这个扩展的主要目的是允许开发者修改 PHP 代码的内部结构,并使用户代码能够与虚拟机(VM)进行交互。
一、uopz支持
uopz 支持以下操作:
1、重载操作码:这包括 ZEND_EXIT 和 ZEND_NEW 等操作码。
2、备份和恢复:可以备份和恢复函数和方法的功能。
3、重命名:可以重命名已有的函数和方法。
4、复制:可以复制已有的函数和方法。
5、删除:可以删除已有的函数和方法。
6、重新定义常量:可以重新定义全局常量和类常量。
7、删除常量:可以删除全局常量和类常量。
8、运行时修改:允许在运行时组合和修改类。
二、uopz安装配置
1、要求
- 自 uopz 5.0 起,需要 PHP 7.0;
- 从 uopz 5.1 起,需要 PHP 7.1+。
2、安装
uopz 扩展可通过 PECL(PHP Extension Community Library)获取,并且其源代码托管在 GitHub 上。要安装 uopz,你可以遵循标准的 PECL 安装流程,访问这个链接来获取:https://pecl.php.net/package/uopz
对于 Windows 用户,可以从 PECL 网站下载预编译的二进制文件来简化安装过程。
值得注意的是,从 uopz 版本 5.0.0 开始,该扩展需要作为扩展来加载(使用 extension=uopz.so)。而在 5.0.0 版本之前,它是作为 zend_extension 来加载的(使用 zend_extension=uopz.so)。
3、运行时配置
这是配置指令的简短说明:
- uopz.disable bool:如果启用,则 uopz 应停止对引擎产生任何影响;
- uopz.exit bool:是否允许执行退出操作码,此设置可在运行时通过调用 uopz_allow_exit()重载;
- uopz.overloads bool:是否允许使用 uopz_overload()。
三、预定义常量
下列常量由此扩展定义,且仅在此扩展编译入 PHP 或在运行时动态载入时可用:
以下操作码在 5.0.0 之前被 uopz 定义为常量:
- ZEND_EXIT (int):由 exit() 和 die() 调用,不接收参数。返回布尔值 “true “表示退出,”false “表示继续;
- ZEND_NEW (int):由对象构造调用,唯一的参数是创建对象的类;
- ZEND_THROW (int):由抛出构造调用,接收被抛出异常的类别作为唯一参数;
- ZEND_FETCH_CLASS (int):在连接时调用,作为唯一参数接收正在获取的类的名称;
- ZEND_ADD_TRAIT (int):关闭时调用,第一个参数是要添加特质的类,第二个参数是特质的名称;
- ZEND_ADD_INTERFACE (int):在关闭时调用,第一个参数是要添加接口的类,第二个参数是接口的名称;
- ZEND_INSTANCEOF (int):由 instanceof 操作符调用,接收作为第一个参数的被验证对象和作为第二个参数的该对象所属类的名称。
以下常量控制虚拟机在调用用户处理程序后的行为,请务必小心!这些常量已从 uopz 5.0.0 中删除:
- ZEND_USER_OPCODE_CONTINUE (int):前进 1 个操作码并继续;
- ZEND_USER_OPCODE_ENTER (int): 进入新的操作码数组。进入新的操作码数组,不递归;
- ZEND_USER_OPCODE_LEAVE (int):返回到同一执行器中调用的操作数列;
- ZEND_USER_OPCODE_DISPATCH (int):调度至原始操作码处理程序;
- ZEND_USER_OPCODE_DISPATCH_TO (int):调度至特定处理程序(与 ZEND 操作码常量 OR 对应);
- ZEND_USER_OPCODE_RETURN (int):从执行器退出(从函数返回)。
以下修改器被 uopz 注册为常量:
- ZEND_ACC_PUBLIC (int):将函数标记为公共函数,默认值;
- ZEND_ACC_PROTECTED (int):将函数标记为受保护;
- ZEND_ACC_PRIVATE (int):将函数标记为私有;
- ZEND_ACC_STATIC (int):将函数标记为静态;
- ZEND_ACC_FINAL (int):将函数标记为 final;
- ZEND_ACC_ABSTRACT (int):将函数标记为抽象函数;
- ZEND_ACC_CLASS (int):为保持一致性而注册的虚函数,默认的类条目类型。从 uopz 5.0.0 起已删除;
- ZEND_ACC_INTERFACE (int):将类标记为接口。从 uopz 5.0.0 起删除;
- ZEND_ACC_TRAIT (int):将类标记为特质。自 uopz 5.0.0 起移除;
- ZEND_ACC_FETCH (int):仅用于获取标志。自 uopz 5.0.0 起移除。
四、Uopz函数
- uopz_add_function – 添加不存在的函数或方法;
- uopz_allow_exit – 允许控制禁用的退出操作码;
- uopz_backup – 备份函数;
- uopz_compose – 组合一个类;
- uopz_copy – 复制一个函数;
- uopz_del_function – 删除先前添加的函数或方法;
- uopz_delete – 删除一个函数;
- uopz_extend – 在运行时扩展一个类;
- uopz_flags – 获取或设置函数或类的标记;
- uopz_function – 在运行时创建一个函数;
- uopz_get_exit_status – 获取上次设置的退出状态;
- uopz_get_hook – 获取函数或方法先前设置的钩子;
- uopz_get_mock – 获取类的当前mock;
- uopz_get_property – 获取类或实例属性的值;
- uopz_get_return – 获取函数先前设置的返回值;
- uopz_get_static – 获取函数或方法作用域中的静态变量;
- uopz_implement – 在运行时实现一个接口;
- uopz_overload – 重载一个虚拟机操作码;
- uopz_redefine – 重定义一个常量;
- uopz_rename – 在运行时重命名一个函数;
- uopz_restore – 恢复先前备份的函数;
- uopz_set_hook – 设置进入函数或方法时要执行的钩子;
- uopz_set_mock – 对新对象使用 mock 而不是类;
- uopz_set_property – 设置现有类或实例属性的值;
- uopz_set_return – 为现有函数提供返回值;
- uopz_set_static – 设置函数或方法作用域中的静态变量;
- uopz_undefine – 解除一个常量的定义;
- uopz_unset_hook – 删除函数或方法中先前设置的钩子;
- uopz_unset_mock – 取消先前设置的 mock;
- uopz_unset_return – 取消设置函数的返回值。