runkit7 是一个 PHP 扩展,提供了修改常量、用户定义的函数和类的能力。此外,它还允许创建自定义的超全局变量。该软件包是 runkit 软件包的一个分支,专门为提供PHP 7支持而设计。本教程主要介绍了PHP runkit7的相关函数和使用方法。
一、运行时配置
runkit.superglobal 字符串:以逗号分隔的变量名列表,以超全局变量的形式处理。 此值应在系统范围的 php.ini 文件中设置,但可能有效 在 perdir 配置上下文中,具体取决于您的 SAPI。
示例:在 php.ini 中使用 runkit.superglobal=_FOO,_BAR 自定义超级全局
<?php function show_values() { echo "Foo is $_FOO\n"; echo "Bar is $_BAR\n"; echo "Baz is $_BAZ\n"; } $_FOO = 'foo'; $_BAR = 'bar'; $_BAZ = 'baz'; /* Displays foo and bar, but not baz */ show_values(); ?>
runkit.internal_override 布尔值:启用修改/重命名/删除内部功能的功能。
二、预定义常量
下列常量由此扩展定义,且仅在此扩展编译入 PHP 或在运行时动态载入时可用:
- RUNKIT7_IMPORT_FUNCTIONS (int):runkit7_import() 标志,表示应从指定文件导入常规函数;
- RUNKIT7_IMPORT_CLASS_METHODS (int):表示应从指定文件中导入类方法的 runkit7_import() 标志;
- RUNKIT7_IMPORT_CLASS_CONSTS (int):表示应从指定文件中导入类常量的 runkit7_import() 标志;
- RUNKIT7_IMPORT_CLASS_PROPS (int):表示应从指定文件中导入类标准属性的 runkit7_import() 标志;
- RUNKIT7_IMPORT_CLASS_STATIC_PROPS (int):runkit7_import() 标志,表示应从指定文件中导入类的静态属性,自 Runkit 1.0.1 起可用;
- RUNKIT7_IMPORT_CLASSES (int):runkit7_import() 标志,表示 RUNKIT7_IMPORT_CLASS_* 常量的 bitwise OR;
- RUNKIT7_IMPORT_OVERRIDE (int):runkit7_import() 标志, 表示如果任何已导入的函数、 方法、 常量或属性已经存在, 则应将其替换为新定义。如果未设置此标志,则会丢弃任何已存在的导入定义;
- RUNKIT7_ACC_RETURN_REFERENCE (int):包含此标志可使创建或重新声明的函数或方法返回引用;
- RUNKIT7_ACC_PUBLIC (int):用于 runkit7_method_add() 和 runkit7_method_redefine() 的标志,使方法成为公共方法;
- RUNKIT7_ACC_PROTECTED (int):用于 runkit7_method_add() 和 runkit7_method_redefine() 使方法受保护的标志;
- RUNKIT7_ACC_PRIVATE (int):用于 runkit7_method_add() 和 runkit7_method_redefine() 将方法设为私有的标志;
- RUNKIT7_ACC_STATIC (int):用于 runkit7_method_add() 和 runkit7_method_redefine() 使方法成为静态方法的标志;
- RUNKIT7_FEATURE_MANIPULATION (int):如果启用了运行时操作,则值为 1,否则为 0;
- RUNKIT7_FEATURE_SUPERGLOBALS (int):如果启用了自定义 superglobals,则值为 1,否则值为 0;
- RUNKIT7_FEATURE_SANDBOX (int):始终为 0,因为在 php 7 中实现沙箱功能不切实际。
三、runkit7函数
1、runkit7_constant_add
runkit7_constant_add — 类似于 define(),但也允许在类定义中定义,使用方法:
runkit7_constant_add(string $constant_name, mixed $value, int $newVisibility = ?): bool
2、runkit7_constant_redefine
重新定义已定义的常量,使用方法:
runkit7_constant_redefine(string $constant_name, mixed $value, int $new_visibility = ?): bool
3、runkit7_constant_remove
移除/删除已定义的常量,使用方法:
runkit7_constant_remove(string $constant_name): bool
4、runkit7_function_add
添加一个新函数,类似于 create_function(),使用方法:
runkit7_function_add( string $function_name, string $argument_list, string $code, bool $return_by_reference = null, string $doc_comment = null, string $return_type = ?, bool $is_strict = ? ): bool
runkit7_function_add( string $function_name, Closure $closure, string $doc_comment = null, string $return_type = ?, bool $is_strict = ? ): bool
5、runkit7_function_copy
将函数复制到新的函数名称,使用方法:
runkit7_function_copy(string $source_name, string $target_name): bool
6、runkit7_function_redefine
用新的实现替换函数定义,使用方法:
runkit7_function_redefine( string $function_name, string $argument_list, string $code, bool $return_by_reference = null, string $doc_comment = null, string $return_type = ?, bool $is_strict = ? ): bool
runkit7_function_redefine( string $function_name, Closure $closure, string $doc_comment = null, string $return_type = ?, bool $is_strict = ? ): bool
注意:默认情况下,仅在用户空间可删除,重命名,或者修改函数。为了覆盖内部函数,必须启用 php.ini 中的 runkit.internal_override 设置。
7、runkit7_function_remove
删除函数定义,使用方法:
runkit7_function_remove(string $function_name): bool
8、runkit7_function_rename
更改函数的名称,使用方法:
runkit7_function_rename(string $source_name, string $target_name): bool
注意: 默认情况下,仅在用户空间可删除,重命名,或者修改函数。 为了覆盖内部函数,必须启用 php.ini 中的 runkit.internal_override 设置。
9、runkit7_import
处理 PHP 文件导入函数和类定义,并在适当的情况下覆盖,使用方法:
runkit7_import(string $filename, int $flags = ?): bool
10、runkit7_method_add
动态地向给定类添加新方法,使用方法:
runkit7_method_add( string $class_name, string $method_name, string $argument_list, string $code, int $flags = RUNKIT7_ACC_PUBLIC, string $doc_comment = null, string $return_type = ?, bool $is_strict = ? ): bool
runkit7_method_add( string $class_name, string $method_name, Closure $closure, int $flags = RUNKIT7_ACC_PUBLIC, string $doc_comment = null, string $return_type = ?, bool $is_strict = ? ): bool
11、runkit7_method_copy
将方法从类复制到另一个类,使用方法:
runkit7_method_copy( string $destination_class, string $destination_method_name, string $source_class, string $source_method_name = ? ): bool
12、runkit7_method_redefine
动态更改给定方法的代码,使用方法:
runkit7_method_redefine( string $class_name, string $method_name, string $argument_list, string $code, int $flags = RUNKIT7_ACC_PUBLIC, string $doc_comment = null, string $return_type = ?, bool $is_strict = ? ): bool
runkit7_method_redefine( string $class_name, string $method_name, Closure $closure, int $flags = RUNKIT7_ACC_PUBLIC, string $doc_comment = null, string $return_type = ?, bool $is_strict = ? ): bool
13、runkit7_method_remove
动态删除给定的方法,使用方法:
runkit7_method_remove(string $class_name, string $method_name): bool
14、runkit7_method_rename
动态更改给定方法的名称,使用方法:
runkit7_method_rename(string $class_name, string $source_method_name, string $target_method_name): bool
15、runkit7_object_id
返回给定对象的整数对象句柄,使用方法:
runkit7_object_id(object $obj): int
16、runkit7_superglobals
返回已注册的超全局变量的数字索引数组,使用方法:
runkit7_superglobals(): array
17、runkit7_zval_inspect
返回有关传入值的信息,包括数据类型、引用计数等,使用方法:
runkit7_zval_inspect(string $value): array