9

基本的にCPPで非常に単純なクラスをラップするphp5.4の拡張機能を作成しようとしています。

これは教育目的のためです。

私はphp5.4でそれを行う方法がphp5.3から変更されていることを発見しました

その方法に関するドキュメントはどこにありますか? またはさらに良いのは、コード例、CPP クラスをラップし、php5.4 で動作する他の拡張機能です。

たとえば、以前は機能していた機能が機能しなくなった場合などです。http://devzone.zend.com/1435/wrapping-c-classes-in-a-php-extension/から取得

zend_object_value car_create_handler(zend_class_entry *type TSRMLS_DC)
{
    zval *tmp;
    zend_object_value retval;

    car_object *obj = (car_object *)emalloc(sizeof(car_object));
    memset(obj, 0, sizeof(car_object));
    obj->std.ce = type;

    ALLOC_HASHTABLE(obj->std.properties);
    zend_hash_init(obj->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0);
    zend_hash_copy(obj->std.properties, &type->default_properties,
        (copy_ctor_func_t)zval_add_ref, (void *)&tmp, sizeof(zval *));

    retval.handle = zend_objects_store_put(obj, NULL,
        car_free_storage, NULL TSRMLS_CC);
    retval.handlers = &car_object_handlers;

    return retval;
}

zend_hash_copy(obj->std.properties, &type->default_properties, (copy_ctor_func_t)zval_add_ref, (void *)&tmp, sizeof(zval *)); 構造体インスタンスtype(定義を忘れた) がメンバーを持たなくなったため、この行 は失敗します。default_properties

4

1 に答える 1

6

このPHP wikiページの情報は役に立ちますか?

具体的には、あなたの例に対処するためにzend_hash_copy(obj->std.properties, &type->default_properties, (copy_ctor_func_t)zval_add_ref, (void *)&tmp, sizeof(zval *));、次のことを提案しています。

#if PHP_VERSION_ID < 50399
    zend_hash_copy(tobj->std.properties, &(class_type->default_properties),
        (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval*));
#else
    object_properties_init(&tobj->std, class_type);
#endif
于 2013-01-01T14:35:00.903 に答える