gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:34:08 25 4
gpt4 key购买 nike

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

函数,spl_object_hash()可从 PHP 5.2 获得,但我想知道是否有针对旧 PHP 版本的解决方法。

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

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

不适用于 native 对象(例如 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;
}

看起来它可能是一个主要的性能克星!

有人有什么 secret 吗?

最佳答案

我进行了几次快速测试。我真的认为您最好使用 bind('evt_name', array($obj, 'callback_function')) 在 bind() 函数中存储真正的回调。如果你绝对想走 spl_object_hash 路线,而不是用事件绑定(bind)存储引用,你正在看这样的东西:

一个 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;
}

你最终得到 results that look like this .总结:基于类的引用实现在 n/50 个类附近表现最佳——在最佳状态下,它的性能是基于 var_dump 的实现的 1/3,而且通常很多 更糟。

var_dump 实现似乎可以接受,但并不理想。但是,如果您没有进行太多此类查找,那么它不会成为您的瓶颈。特别是作为 PHP < 5.2 boxen 的后备。

关于php - PHP < 5.2 的 spl_object_hash(对象实例的唯一 ID),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2299463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com