潍坊知名网站建设服务商泰安seo推广
潍坊知名网站建设服务商,泰安seo推广,深圳网站开发,东软实训网站开发自定义对象 handlers为啥要自定义#xff1a;PHP 对象默认行为是属性读写#xff0c;但你写 C 扩展时对象里装的是 C 结构体#xff0c;需要告诉 Zend 引擎怎么创建、销毁、克隆这个对象。---先定义自己的对象结构#xff1a;// 自定义对象 zend_object 打底 自己的数据t…自定义对象 handlers 为啥要自定义PHP对象默认行为是属性读写但你写C扩展时对象里装的是C结构体需要告诉 Zend 引擎怎么创建、销毁、克隆这个对象。---先定义自己的对象结构// 自定义对象 zend_object 打底 自己的数据typedef struct{FILE*fp;// 你的C数据zend_object std;// 必须放最后}myfile_object;// 从 zend_object* 反推外层结构体staticinline myfile_object*myfile_from_obj(zend_object*obj){return(myfile_object*)((char*)obj-XtOffsetOf(myfile_object,std));}// 从 zval* 直接拿#define Z_MYFILE_P(zv) myfile_from_obj(Z_OBJ_P(zv))---注册 handlersstaticzend_object_handlers myfile_handlers;// 模块初始化时调用PHP_MINIT_FUNCTION(myext){// 复制默认handlers再改你需要的memcpy(myfile_handlers,zend_get_std_object_handlers(),sizeof(zend_object_handlers));myfile_handlers.offsetXtOffsetOf(myfile_object,std);myfile_handlers.free_objmyfile_free;// 析构myfile_handlers.clone_objmyfile_clone;// 克隆returnSUCCESS;}---create_object分配内存时挂上 handlersstaticzend_object*myfile_create(zend_class_entry*ce){myfile_object*objzend_object_alloc(sizeof(myfile_object),ce);obj-fpNULL;zend_object_std_init(obj-std,ce);object_properties_init(obj-std,ce);obj-std.handlersmyfile_handlers;// ← 挂上去returnobj-std;}// 注册类时绑定myfile_ce-create_objectmyfile_create;---free_obj对象销毁时清理C资源staticvoidmyfile_free(zend_object*obj){myfile_object*internmyfile_from_obj(obj);if(intern-fp){fclose(intern-fp);// 关文件句柄intern-fpNULL;}zend_object_std_dtor(obj);// 必须调清理属性表}---clone_obj克隆时深拷贝staticzend_object*myfile_clone(zend_object*old_obj){myfile_object*oldmyfile_from_obj(old_obj);zend_object*new_objmyfile_create(old_obj-ce);myfile_object*newmyfile_from_obj(new_obj);zend_objects_clone_members(new_obj,old_obj);// 复制PHP属性// 深拷贝你的C数据// new-fp dup_somehow(old-fp);returnnew_obj;}---其他可以覆盖的 handlers myfile_handlers.read_propertymyfile_read;// $obj-foomyfile_handlers.write_propertymyfile_write;// $obj-foo xmyfile_handlers.cast_objectmyfile_cast;// (string)$objmyfile_handlers.comparemyfile_compare;// $a $bmyfile_handlers.get_debug_infomyfile_debug;// var_dump($obj)---一句话 handlers 就是这个对象的类方法表告诉 Zend 引擎创建/销毁/克隆/读写属性时该怎么处理你藏在对象里的C数据。