• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

[翻译][php扩展开发和嵌入式]第11章-php5对象

php 搞代码 3年前 (2022-01-22) 20次浏览 已收录 0个评论

php5对象

将php5的对象和它的先辈php4对象进行比较实在有些不公平, 不过php5对象使用的API函数还是遵循php4的API构建的. 如果你已经阅读了第10章"php4对象", 你将会对本章内容多少有些熟悉. 在开始本章之前, 可以像第10章开始时一样, 重命名扩展为sample3并清理多余的代码, 只保留扩展的骨架代码.

进化史

在php5对象变量中有两个关键的组件. 第一个是一个数值的标识, 它和第9章"资源数据类型"中介绍的数值¥本文来源gaodai#ma#com搞@@代~&码网^搞gaodaima代码资源ID非常相似, 扮演了一个用来在对应表中查找对象实例的key的角色. 在这个实例表中的元素包含了到zend_class_entry的引用以及内部的属性表.

第二个元素是对象变量的句柄表, 使用它可以自定义Zend引擎对实例的处理方式. 在本章后面你将看到这个句柄表.

zend_class_entry

类条目是你在用户空间定义的类的内部表示. 正如你在前一章所见, 这个结构通过调用INIT_CLASS_ENTRY()初始化, 参数为类名和它的函数表. 接着在MINIT阶段使用zend_register_internal_class()注册.

zend_class_entry *php_sample3_sc_entry;#define PHP_SAMPLE3_SC_NAME "Sample3_SecondClass"static function_entry php_sample3_sc_functions[] = {    { NULL, NULL, NULL }};PHP_MINIT_FUNCTION(sample3){    zend_class_entry ce;    INIT_CLASS_ENTRY(ce, PHP_SAMPLE3_SC_NAME,                            php_sample3_sc_functions);    php_sample3_sc_entry =                zend_register_internal_class(&ce TSRMLS_CC);    return SUCCESS;}

方法

如果你已经阅读了上一章, 你可能就会想"到现在为止看起来几乎一样啊?", 到现在为止, 你是对的. 现在我们开始定义一些对象方法. 你将开始看到一些非常确定的并且大受欢迎的不同.

PHP_METHOD(Sample3_SecondClass, helloWorld){    php_printf("Hello World\n");}

在Zend引擎2中引入了PHP_METHOD()宏, 它是对PHP_FUNCTION()宏的封装, 将类名和方法名联合起来, 不用像php4中手动定义方法名了. 通过使用这个宏, 在扩展中你的代码和其他维护者的代码的名字空间解析规范就保持一致了.

定义

定义一个方法的实现, 和其他函数一样, 只不过是将它连接到类的函数表中. 除了用于实现的PHP_METHOD()宏, 还有一些新的宏可以用在函数列表的定义中.

发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址