PHP < 5.2 的 spl_object_hash (对象实例的唯一 ID)

2024-01-16

我正在尝试获取 PHP 5+ 中对象实例的唯一 ID。

功能,spl_object_hash() http://php.net/manual/en/function.spl-object-hash.php从 PHP 5.2 开始可用,但我想知道是否有针对旧 PHP 版本的解决方法。

php.net 上的评论中有几个功能,但它们对我不起作用。第一个(简化):

function spl_object_hash($object){
    if (is_object($object)){
        return md5((string)$object);
        }
    return null;
    }

不适用于本机对象(例如 DOMDocument),第二个:

function spl_object_hash($object){
    if (is_object($object)){
        ob_start();
        var_dump($object);
        $dump = ob_get_contents();
        ob_end_clean();
        if (preg_match('/^object\(([a-z0-9_]+)\)\#(\d)+/i', $dump, $match)) {
            return md5($match[1] . $match[2]);
            }
        }
    return null;
    }

看起来它可能会成为一个重大的性能破坏者!

有人有什么锦囊妙计吗?


我进行了一些快速测试。我真的认为你最好使用以下方法将真实的回调存储在你的bind()函数中bind('evt_name', array($obj, 'callback_function'))。如果您绝对想采用 spl_object_hash 路线,而不是使用事件绑定存储引用,那么您将看到如下所示的内容:

var_dump / extract 和 hash id 实现:

function spl_object_hash_var_dump($object){
    if (is_object($object)){
        ob_start();
        var_dump($object);
        $dump = ob_get_contents();
        ob_end_clean();
        if (preg_match('/^object\(([a-z0-9_]+)\)\#(\d)+/i', $dump, $match)) {
            return md5($match[1] . $match[2]);
            }
        }
    return null;
}

一个简单的引用实现:

function spl_object_dumb_references(&$object) {
    static $hashes;

    if (!isset($hashes)) $hashes = array();

    // find existing instance
    foreach ($hashes as $hash => $o) {
        if ($object === $o) return $hash;
    }

    $hash = md5(uniqid());
    while (array_key_exists($hash, $hashes)) {
        $hash = md5(uniqid());
    }

    $hashes[$hash] = $object;
    return $hash;
}

这个基本上比基于类的参考函数差 5-50 倍,所以不值得担心。

按类实现存储引用:

function spl_object_hash_references(&$object) {
    static $hashes;

    if (!isset($hashes)) $hashes = array();

    $class_name = get_class($object);
    if (!array_key_exists($class_name, $hashes)) {
        $hashes[$class_name] = array();
    }

    // find existing instance
    foreach ($hashes[$class_name] as $hash => $o) {
        if ($object === $o) return $hash;
    }

    $hash = md5(uniqid($class_name));
    while (array_key_exists($hash, $hashes[$class_name])) {
        $hash = md5(uniqid($class_name));
    }

    $hashes[$class_name][$hash] = $object;
    return $hash;
}

你最终会得到结果看起来像这样 http://gist.github.com/334793。摘要:基于类的引用实现在 n/50 个类左右性能最佳——在最佳状态下,它能够实现 1/3 的性能var_dump基于实现,通常是much worse.

The var_dump实施似乎是可以忍受的,尽管并不理想。但如果您没有进行太多此类查找,那么它不会成为您的瓶颈。特别是作为 PHP

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP < 5.2 的 spl_object_hash (对象实例的唯一 ID) 的相关文章

随机推荐

  • 如何在打开另一个 Javascript 下拉菜单时关闭另一个下拉菜单

    我不太熟悉 JavaScript 我希望能得到一些帮助来解决我似乎无法解决的问题 目前我的网站上有 2 个下拉菜单 一种是用于导航的下拉菜单 单击汉堡菜单图标时会激活该菜单 第二个下拉列表用于显示我网站上的类别 目前 当我单击一个下拉列表时
  • 检测浏览器缓存是否已满

    我们发现浏览器缓存已满是导致酒店后台出现问题的原因 它只影响我们的一小部分用户 但我们希望提醒他们该问题 并为他们提供一些如何自行解决问题的指导 我们希望使用与 GMail 使用的系统类似的系统 当它检测到您的浏览器缓存已满表现不正常时 它
  • Kafka中的延迟消息消费

    如何使用 Apache Kafka 生成 消费延迟消息 似乎标准 Kafka 和 Java kafka client 功能没有此功能 我知道我可以用标准的等待 通知机制自己实现它 但它看起来不太可靠 因此任何建议和良好实践都值得赞赏 Fou
  • Android Shake(Sensor) 服务,用于应用程序后台的震动检测

    我开发了一个具有晃动功能的应用程序 以便某些功能正常工作 因此我使用晃动类并实现了主活动 以便在应用程序运行时顺利工作 但我的问题是当我的应用程序进入睡眠或终止或停止时 如何检测背景震动 服务 我的摇摇班 public class Shak
  • 区别 - “e.preventDefault();”和“返回假;” [复制]

    这个问题在这里已经有答案了 有什么区别return false and e preventDefault e preventDefault 将防止默认事件发生并且return false停止传播
  • Android - Firebase 用户身份验证令牌会过期吗?

    我决定使用Volley并走 RESTful 路线Firebase因为当没有互联网连接时 他们的听众似乎会挂起 至少对于 Volley 它可以让我知道网络请求是否由于互联网连接而失败 我需要知道是否FirebaseUser身份验证令牌是否过期
  • 在基础对象中构造派生类型的对象

    vb net 中是否可以有一个方法来构造 bass 类中任何派生类的对象 在此代码中 x Clone 应返回一个 Bar 对象 这是使用两种不同对象类型在两个类中重复代码的唯一方法 Module Module1 Sub Main Dim x
  • .NET:我可以使用 DataContractJsonSerializer 序列化为 JSON 关联数组吗?

    使用时数据契约Json序列化器 http msdn microsoft com en us library system runtime serialization json datacontractjsonserializer aspx序
  • cellForRowAtIndexPath 返回 nil

    我正在尝试从表格视图中获取特定的单元格 以便我可以更改它的标签并停止活动指示器 我遇到的问题是cellForRowAtIndexPath返回零 我的表视图只有 1 行 Code id initWithNibName NSString nib
  • Android Thread.sleep 有时等待时间太长

    Edit 这里不是说精度问题 从下面的代码和日志可以看到 我请求休眠1秒 但结果差不多是200秒 有时会跳到600秒 这不可能是精度问题 我之前使用过 handlerthread 有时发布到处理程序的作业没有按时启动 为了获得更多详细信息
  • 如何在 Android 中以编程方式启动主屏幕 [重复]

    这个问题在这里已经有答案了 我想用我的应用程序启动 Android 的主屏幕 主要目标是当用户按下专用键时向用户显示所有应用程序 其实 方式并不重要 有想法这样做吗 这是启动 HomeActivity 的代码 Intent startMai
  • devDependency 会影响包大小吗?

    我仔细寻找 找不到这个问题的直接答案 执行我添加的软件包devDependencies实际上最终会出现在生产包 JS 文件中并从而影响其大小 或者只是dependencies进入捆绑包 不 它不会影响您的包大小 因为这些包仅在开发模式下使用
  • ActiveRecord 嵌套 SELECT

    我需要有关 SELECT FROM 嵌套 SELECT 的帮助 如何以 ActiveRecord 方式重写以下查询并获取 Relation 对象 SELECT candidates FROM SELECT candidates first
  • stringr、str_extract:如何进行正向后查找?

    很简单的问题 我只需要使用正则表达式正向查找捕获一些字符串 但我没有找到一种方法来做到这一点 这是一个例子 假设我有一些字符串 library stringr myStrings lt c MFG acme something else M
  • 具有重叠间隔时间序列的 groupby

    我在 python pandas dataframe 对象中有一个时间序列 我想根据索引创建一个组 但我想要重叠的组 即组不不同 header sec 是索引列 每组包含一个 2 秒的窗口 输入数据帧 header sec 1 17004
  • 如何在处理中计算从 mouseX、mouseY 到矩形的距离()

    如果它是一个点的距离 那就是 dist mouseX mouseY x y for point x y 但我如何计算从鼠标当前位置到 rectMode CORNERS rect x1 y2 x2 y2 Thanks 像这样的事情应该这样做
  • 如何调整滚动复合材料的大小以使其始终水平适合其内容?

    我有一个滚动复合材料 它包含一个 tableViewer 我的要求是 如果表格宽度增加 滚动组合不应显示水平滚动 但应扩展以适合表格的大小 我在这里使用滚动复合的唯一原因是我想显示垂直滚动条 如果你想控制滚动条Table在 SWT 中 它是
  • 将动画 Maya 模型转换为 JSON 以与三个 js 一起使用

    我有一个在 Maya 2008 中完成的 Maya 模型 我需要能够将其转换为 JSON 格式以便与三个 js 一起使用 到目前为止 我已经尝试过 1 ThreeJsFileTranslator py 它是一个用于导出模型的 Maya 插件
  • 如何在telnet客户端上实现命令历史记录? (向上/向下箭头)

    我有一台接受 telnet 连接进行管理的服务器 我错过了命令历史记录 因此我想让我的 telnet 会话支持它 我的问题 1 我是否必须在服务器端实现这一点 以便服务器将过去的命令发送到客户端 然后客户端可以重新执行 2 是否有办法在te
  • PHP < 5.2 的 spl_object_hash (对象实例的唯一 ID)

    我正在尝试获取 PHP 5 中对象实例的唯一 ID 功能 spl object hash http php net manual en function spl object hash php从 PHP 5 2 开始可用 但我想知道是否有针