我正在尝试在我的扩展中实现原型(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/