如何在PHP扩展类中设置静态类属性?

时间:2014-07-10 21:01:28

标签: php c php-extension

我在C中编写了一个PHP扩展,其中包含在C中定义的PHP类。我想在其中一个类上设置静态属性。特别是,我想在C中做相当于

的事情
class Example{
  public static $member;
}

Example::member = new Example();

我不能使用REGISTER_*_CONSTANT宏来执行此操作,因为该值必须是一个对象。我检查了官方文档,但关于类的部分是空的。

2 个答案:

答案 0 :(得分:1)

您实际上无法注册静态属性,只需更新它,并让PHP为您进行注册。

http://php.undmedlibrary.org/manual/en/zend-api.zend-update-static-property.php

// int zend_update_static_property         ( zend_class_entry* $scope, char* $name, int $name_length, zval* $value,        magic $TSRMLS_DC )
int prop_set = zend_update_static_property ( my_example_class_entry,   "member",    7,                my_instance          TSRMLS_CC);

答案 1 :(得分:1)

在我的特定情况下,我的类包装了一个C结构,所以我显然无法在模块初始化时初始化它。我采用了下一个最佳选项,即声明一个返回静态声明实例的静态方法。我通过放行

来做到这一点
PHP_ME(Example, member, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)

在我的example_methods数组中,通过在我的头文件中全局声明zval *php_example_static_member,并将该函数写为

PHP_METHOD(Example, member){
  if(php_example_static_member == NULL){
    php_example_static_member = create_example_instance(); //However the new instance is created
  }
  RETURN_ZVAL(php_example_static_member, false, false);
}