php扩展开发笔记(1)创建类的数组属性
来源:互联网 发布:crt如何ping端口 编辑:程序博客网 时间:2024/06/09 13:54
初始化一个类非常容易,例如下面的代码
MYCLASS_PROTERTY_* 这个相关是 define 的宏字符串
zend_class_entry *myclass_ce;zend_function_entry myclass_methods[] = { PHP_FE_END};PHP_MINIT_FUNCTION(myext){ zend_class_entry ce; INIT_CLASS_ENTRY(ce, "MyClass", myclass_methods); myclass_ce = zend_register_internal_class(&ce TSRMLS_CC); zend_declare_class_constant_string(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_VERSION), PHP_SLIM_VERSION); zend_declare_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_CONTAINER), ZEND_ACC_PUBLIC TSRMLS_CC); zend_declare_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_APPS), ZEND_ACC_STATIC|ZEND_ACC_PROTECTED TSRMLS_CC); zend_declare_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_NAME), ZEND_ACC_PROTECTED TSRMLS_CC); zend_declare_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_ERROR), ZEND_ACC_PROTECTED TSRMLS_CC); zend_declare_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_NOTFOUND), ZEND_ACC_PROTECTED TSRMLS_CC); zend_declare_property_null(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_MIDDLEWARE), ZEND_ACC_PROTECTED TSRMLS_CC); return SUCCESS;}
以上的代码都是一些简单的属性。
当想要给myclass这个类初始化一个数组的属性的时候,失败了,相对于php的代码如下
class MyClass { public $myArray = array();}/* 对应的C代码 */zval *myArray;MAKE_STD_ZVAL(myArray);array_init(myArray);zend_declare_property(myclass_ce, ZEND_STRL(MYCLASS_PROTERTY_NAME_MYCLASS), myArray, ZEND_ACC_PUBLIC TSRMLS_CC);
上面这段C代码变异的时候并没有发现什么问题,在执行 new MyClass() 的时候就出现问题了,报错如下:
Internal zval's can't be arrays, objects or resources
翻看zend的源代码如下:
if (ce->type & ZEND_INTERNAL_CLASS) { switch(Z_TYPE_P(property)) { case IS_ARRAY: case IS_CONSTANT_ARRAY: case IS_OBJECT: case IS_RESOURCE: zend_error(E_CORE_ERROR, "Internal zval's can't be arrays, objects or resources"); break; default: break; } }
当我们在调用zend_register_internal_class的时候,myclass_ce 已经初始化为ZEND_INTERNAL_CLASS了,而此时的zend_declare_property的myArray参数则是IS_ARRAY类型的,所以产生了这样的错误。
为什么会产生这样的错误呢?
我搜索下得到的结果是:http://grokbase.com/t/php/php-internals/07a4b14xvb/php-dev-how-declare-protected-array-property-at-internal-class-properly 这个是2007年的结果,我这个是采用的php5.4版本的,暂时还是有这个问题的,文中也给了变相实现数组属性的方法,通过在构造函数里面实现。
PHP_METHOD(myclass, __construct) { zval *apps, *pThis; pThis = getThis(); MAKE_STD_ZVAL(apps); array_init(apps); add_property_zval_ex(pThis, ZEND_STRL(SLIM_SLIM_PROTERTY_NAME_APPS), apps);}
这种实现的方式对应的php代码
class MyClass { function __construct() { $this->app = array(); }}
欢迎交流
0 0
- php扩展开发笔记(1)创建类的数组属性
- php扩展开发笔记(3)类的静态数组属性定义
- php扩展开发笔记(5)一些数组操作相关的宏和简单示例
- PHP扩展开发-创建扩展
- PHP扩展开发-类成员属性
- PHP扩展开发(1)-创建基础框架
- PHP扩展开发之创建一个类
- PHP扩展开发笔记
- PHP Windows 扩展的开发(1)
- php 创建一个扩展开发环境的正确姿势
- PHP扩展开发-08-数组的使用以及HashTable简介
- PHP 扩展开发笔记一
- PHP的扩展模块的试用笔记(1)
- ECMAScript6-学习笔记(数组的扩展)
- PHP Windows 扩展的开发(3) 类的实现
- php的扩展和嵌入--c++类的扩展开发
- php学习笔记(7):PHP数组的创建修改使用
- PHP内核的学习--创建PHP扩展
- Project Euler:Problem 24 Lexicographic permutations
- 长沙甲壳虫教育 留学
- 第五章t2
- 努力去前进 让自己进步
- apache 无法访问根目录下的子目录——(笔记)
- php扩展开发笔记(1)创建类的数组属性
- struct time定义
- 给定一个正整数数组,找所有元素组合起来最大的值(答案)
- C#值类型
- 阻止OSX休眠
- 进程、线程小结(2)
- Apriori 算法学习
- Linux下date命令,格式化输出,时间设置
- android listview & toolbar形成的一种炫酷效果(外加一个圆形图片的实现)