通过基本结构ZVAL实现PHP实现中的类型.
每种类型都是结构ZVAL(Zend值).
据我们所知
A resource is a special variable, holding a reference to an external
resource. Resources are created and used by special functions.
例如fopen返回类型resurce.
$fp = fopen('/proc/cpuinfo', 'r');
$fp-是资源类型,这意味着在php核心中已按结构创建了成分数据:
struct _zend_resource {
zend_refcounted_h gc;
int handle;
int type;
void *ptr;
};
其中zend_refcounted_h-我们类型的标头,它完成了内存管理并表示哈希;
handle是一个整数,引擎在内部使用该整数将资源定位到内部资源表中. php在创建资源过程中创建它.
该类型用于将相同类型的资源重新组合在一起.这意味着我们需要资源的调用析构函数,它有助于我们找到已注册的析构函数.
ptrit是我们的抽象数据.
阶段创建资源:
1.使用zend_register_list_destructors_ex()的注册析构函数.它需要清理垃圾收集器中的内存.
2.注册新资源zend_register_resource()并将指针附加到析构函数.这是返回zend_register_list_destructors_ex()的类型
完整的例子.
static void file_destructor(zend_resource *rsrc)
{
fclose((FILE *)rsrc->ptr);
}
type = zend_register_list_destructors_ex(
file_destructor, // pointer to destructor
NULL, // pointer to destructor for persistent resource, that non deleted after end request (example BD connection resource)
"file_resource", // name
module_number // PHP extension number
);
fp = fopen("/proc/cpuinfo", "r");
file_resource = zend_register_resource((void *)fp, type);
ZVAL_RES(&my_val, file_resource);
Resource types are just a way for the engine to mix different kind of
resources (of type “file”, “gzip” or even “mysql connection”) into the
same resource table.
有关资源类型,创建,删除和在phpinternalsbook中工作的更多详细信息