2016-06-11 19 views
0

クラスを持つPHPエクステンションを作成しようとしていますが、そのうちの1つが文字列の配列であると考えられています。私が以下のようにしようとすると、test_init_test()に配列を作成して実装しようとしたときのコメントを外すと、エラー "PHP Fatal error: Internal zval's can't be arrays, objects or resources in Unknown on line 0"が出ます。PHPエクステンションのクラスに配列を追加する

私は配列の作成方法を理解していないか、zend_declare_propertyの機能を理解していません。私はどうしたらいい?

#include "php.h" 
#include "php_myextension.h" 
#include "test.h" 

zend_class_entry *test_ce_test; 

static zend_function_entry test_methods[] = { 
    PHP_ME(Test, __construct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) 

    {NULL, NULL, NULL} 
}; 

void test_init_test(TSRMLS_D) { 
    zend_class_entry ce; 

    // zval *cachedirs_array = emalloc(sizeof(zval)); 
    // array_init(cachedirs_array); 

    INIT_CLASS_ENTRY(ce, "Test", test_methods); 
    test_ce_test = zend_register_internal_class(&ce TSRMLS_CC); 

    zend_declare_property_string(test_ce_test, "arch", sizeof("arch"), "", ZEND_ACC_PUBLIC TSRMLS_CC); 
    // zend_declare_property(test_ce_test, "cachedirs", sizeof("cachedirs"), cachedirs_array, ZEND_ACC_PUBLIC TSRMLS_CC); 
    // zend_declare_property(test_ce_test, "cachedirs", sizeof("cachedirs"), cachedirs_array, ZEND_ACC_PUBLIC TSRMLS_CC); 
    zend_declare_property_string(test_ce_test, "dbpath", sizeof("dbpath"), "", ZEND_ACC_PUBLIC TSRMLS_CC); 
    zend_declare_property_string(test_ce_test, "root", sizeof("root"), "", ZEND_ACC_PUBLIC TSRMLS_CC); 
} 

PHP_METHOD(Test, __construct) { 
    char *rootpath; 
    char *dbpath; 
    size_t rp, dp; 

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &rootpath, &rp, &dbpath, &dp) == FAILURE) { 
     RETURN_NULL() 
    } 

    object_init_ex(return_value, test_ce_test); 

    zend_update_property_stringl(test_ce_test, getThis(), "root", sizeof("root"), rootpath, rp TSRMLS_CC); 
    zend_update_property_stringl(test_ce_test, getThis(), "dbpath", sizeof("dbpath"), dbpath, dp TSRMLS_CC); 
} 

答えて

0

空のzvalを宣言して、それをコンストラクタの配列で更新する必要があります。

void test_init_test(TSRMLS_D) { 
    zend_class_entry ce; 

    zval *cd = (zval*)malloc(sizeof(zval)); /* empty zval */ 

    INIT_CLASS_ENTRY(ce, "Test", test_methods); 
    test_ce_test = zend_register_internal_class(&ce TSRMLS_CC); 

    zend_declare_property_string(test_ce_test, "arch", sizeof("arch"), "", ZEND_ACC_PUBLIC TSRMLS_CC); 
    zend_declare_property(test_ce_test, "cachedirs", sizeof("cachedirs"), cd, ZEND_ACC_PUBLIC TSRMLS_CC); /* declare with empty zval */ 
    zend_declare_property_string(test_ce_test, "dbpath", sizeof("dbpath"), "", ZEND_ACC_PUBLIC TSRMLS_CC); 
    zend_declare_property_string(test_ce_test, "root", sizeof("root"), "", ZEND_ACC_PUBLIC TSRMLS_CC); 
} 

PHP_METHOD(Test, __construct) { 
    char *rootpath; 
    char *dbpath; 
    size_t rp, dp; 

    /* create zval */ 
    zval cd; 

    /* init array */ 
    array_init(&cd); 

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &rootpath, &rp, &dbpath, &dp) == FAILURE) { 
     RETURN_NULL() 
    } 

    object_init_ex(return_value, test_ce_test); 

    /* update property with new array */ 
    zend_update_property(alpm_ce_handle, getThis(), "cachedirs", sizeof("cachedirs") - 1, &cd TSRMLS_CC); 

    zend_update_property_stringl(test_ce_test, getThis(), "root", sizeof("root"), rootpath, rp TSRMLS_CC); 
    zend_update_property_stringl(test_ce_test, getThis(), "dbpath", sizeof("dbpath"), dbpath, dp TSRMLS_CC); 
} 
関連する問題