为 PHP 5.4 编写 C++ 扩展,示例代码已过时
Posted
技术标签:
【中文标题】为 PHP 5.4 编写 C++ 扩展,示例代码已过时【英文标题】:Writing a C++ extension for PHP 5.4, example code is obsolete 【发布时间】:2012-12-15 20:16:46 【问题描述】:我正在尝试为 php5.4 编写一个扩展,它基本上在 CPP 中包装了一个非常简单的类。
这是出于教育目的。
我发现在 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
【问题讨论】:
可能你最好的资源是PHP5.4源代码 @Mark Baker 我在 CPP 方面不是很好,如果有一个特定的扩展已经做到了,那将是很大的帮助。否则,是的,我会按照你的建议做 php.net/manual/en/internals2.structure.php ? @Marc B 那里有很多知识。我将阅读它,但通过快速阅读,我对包装 CPP 类一无所知。 也许您可以提供有关过去工作的细节以及现在阻止它工作的原因? 【参考方案1】: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
【讨论】:
以上是关于为 PHP 5.4 编写 C++ 扩展,示例代码已过时的主要内容,如果未能解决你的问题,请参考以下文章
PHP 5.2 5.3 5.4 5.5 memcache dll扩展