c - 如何从 PHP 扩展克隆对象

标签 c clone php-extension

我正在尝试在我的扩展中实现原型(prototype)设计模式。如何从 zval* 克隆对象。是否有一个 zend 函数相当于用户态 clone 运算符?

更新

我编写了以下函数来克隆对象。不知道是否有更好的方法。

/**
 * Clones an object from src to dest
 */
static int php_custom_clone(zval *src, zval *dest TSRMLS_DC) {
    zend_class_entry *ce;
    zend_object_clone_obj_t clone_call;

    ce = Z_OBJCE_P(src);
    clone_call =  Z_OBJ_HT_P(src)->clone_obj;

    if (!clone_call) {
        if (ce) {
            zend_throw_exception_ex(Custom_Exception_ce_ptr, 0 TSRMLS_CC, "Trying to clone an uncloneable object of class %s", ce->name);
        } else {
            zend_throw_exception_ex(Custom_Exception_ce_ptr, 0 TSRMLS_CC, "Trying to clone an uncloneable object");
        }
    } else {
        if (!EG(exception)) {
            Z_OBJVAL_P(dest) = clone_call(src TSRMLS_CC);
            Z_TYPE_P(dest) = IS_OBJECT;
            Z_SET_REFCOUNT_P(dest, 1);
            // Z_SET_ISREF_P(dest);
            if (EG(exception)) {
                zval_ptr_dtor(&dest);
            } else {
                return 1;
            }
        }
    }
    return 0;
}

最佳答案

通用克隆方法...

zend_object_value val =  zend_objects_clone_obj(zval *zobject TSRMLS_DC);

关于c - 如何从 PHP 扩展克隆对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30003525/

相关文章:

delphi - 在我的特定类中实现Clone()的最佳方法

javascript - 克隆整个 JavaScript ScriptEngine

基于外部库的PHP扩展

c - 如何禁用 CLion 中代码导航的函数重载检测?

php - 克隆如何创建单例的新版本?

c - Linux 上的 OpenGL : dlopen libGL. 所以

php - 在 XAMPP 中安装 dBase 扩展

C++ PHP 扩展

c++ - 如何用HDF5源代码编译c程序?

c - 类似于 memcached 的简单 C/C++ 进程内缓存