热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

Iamtryingtoimplementtheprototypedesignpatterninmyextension.HowcanIcloneanobjectfro

I am trying to implement the prototype design pattern in my extension. How can I clone an object from an zval*. Is there a zend function equivalent to the userland clone operator?

我正在尝试在我的扩展中实现原型设计模式。如何从zval *克隆对象?是否有与用户态克隆运算符等效的zend函数?

Update

更新

I wrote the following function for cloning an object. Not sure if there is a better way.

我编写了以下用于克隆对象的函数。不确定是否有更好的方法。

/**
 * 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;
}

1 个解决方案

#1


2  

Generic clone method...

通用克隆方法......

zend_object_value val =  zend_objects_clone_obj(zval *zobject TSRMLS_DC);

推荐阅读
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文深入探讨了WPF框架下的数据验证机制,包括内置验证规则的使用、自定义验证规则的实现方法、错误信息的有效展示策略以及验证时机的选择,旨在帮助开发者构建更加健壮和用户友好的应用程序。 ... [详细]
  • 本文详细介绍了Java中HashSet的工作原理及其源码分析。HashSet实现了Set接口,内部通过HashMap来存储数据,不保证元素的迭代顺序,且允许null值的存在。文章不仅涵盖了HashSet的基本概念,还深入探讨了其内部实现细节。 ... [详细]
  • 默认情况下,Java 的克隆机制是浅克隆,即仅复制对象本身而不复制其内部引用的对象。本文将详细介绍如何通过深度克隆来确保对象及其内部引用的对象都能被正确复制。 ... [详细]
  • 本文分享了作者在使用LaTeX过程中的几点心得,涵盖了从文档编辑、代码高亮、图形绘制到3D模型展示等多个方面的内容。适合希望深入了解LaTeX高级功能的用户。 ... [详细]
  • Java多线程售票案例分析
    本文通过一个售票系统的实例,深入探讨了Java中的多线程技术及其在资源共享和并发控制中的应用。售票过程涉及查询、收款、找零和出票等多个步骤,其中对总票数的管理尤为关键。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • D17:C#设计模式之十六观察者模式(Observer Pattern)【行为型】
    一、引言今天是2017年11月份的最后一天,也就是2017年11月30日,利用今天再写一个模式,争取下个月(也就是12月份& ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • Hibernate全自动全映射ORM框架,旨在消除sql,是一个持久层的ORM框架1)、基础概念DAO(DataAccessorOb ... [详细]
  • 本文探讨了异步编程的发展历程,从最初的AJAX异步回调到现代的Promise、Generator+Co以及Async/Await等技术。文章详细分析了Promise的工作原理及其源码实现,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
  • 本文探讨了Python类型注解使用率低下的原因,主要归结于历史背景和投资回报率(ROI)的考量。文章不仅分析了类型注解的实际效用,还回顾了Python类型注解的发展历程。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
author-avatar
小鬼6Pi7
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有