php extension 声明类属性

http://blog.00rz.com/2010/09/php-extension-delcare-class-array-property.html


在弄一个php扩展, 想把 扩展写成类的 形式, 于是在声明的时候 想给类加个array 属性
于是expect 代码是这样的

  1.  
  2. PHP_MINIT_FUNCTION (concurrency )
  3. {
  4.         zend_class_entry ce;
  5.         INIT_CLASS_ENTRY (ce, PHP_CONCURRENCY_CLASSNAME, concurrency_class_methods );
  6.         concurrency_class_entry = zend_register_internal_class (&ce TSRMLS_CC );
  7.  
  8.         zval *requests;
  9.  
  10.         MAKE_STD_ZVAL (requests );
  11.  
  12.         array_init (requests );
  13.  
  14.         zend_printf ( "%d", requests->type );
  15.         zend_declare_property (concurrency_class_entry,  "requests", strlen ( "requests" ), requests, ZEND_ACC_PUBLIC );
  16.  
  17.          return SUCCESS;
  18. }
  19.  

结果报错,
PHP Fatal error: Internal zval’s can’t be arrays, objects or resources in Unknown on line 0
把requests->type 用zend_printf打出来发现 结果是4 是 ZEND定义的IS_ARRAY,
继续翻代码
发现在Zend/zend_API.c 里面zend_declare_property的原型 有这样的定义

  1.  
  2.          if  (ce->type & ZEND_INTERNAL_CLASS )  {
  3.                  switch (Z_TYPE_P (property ) )  {
  4.                          case IS_ARRAY:
  5.                          case IS_CONSTANT_ARRAY:
  6.                          case IS_OBJECT:
  7.                          case IS_RESOURCE:
  8.                                 zend_error (E_CORE_ERROR,  "Internal zval’s can’t be arrays, objects or resources" );
  9.                                  break;
  10.                          default:
  11.                                  break;
  12.                  }
  13.          }
  14.  

不知何意看
staceflow 上也有人遇到这种问题

http://stackoverflow.com/posts/1105360/revisions

,没办法,
于是就改成在构造函数里面 增加属性的声明
just as follow

  1.  
  2. PHP_METHOD (Concurrency, __construct )
  3. {
  4.         zval *pThis;
  5.         pThis = getThis ( );
  6.        
  7.         zval *requests;
  8.         MAKE_STD_ZVAL (requests );
  9.         array_init (requests );
  10.  
  11.         add_property_zval_ex (pThis,  "requests"sizeof ( "requests" ), requests );
  12. }
  13.  

在这里记下!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值