Edit report at https://bugs.php.net/bug.php?id=52657&edit=1
ID: 52657
Updated by: rmf@php.net
Reported by: marco dot weber at uni-trier dot de
-Summary: Implement function to get a truly unique object id
+Summary: Object id function where its uniqueness persists
through entire script execution
Status: Assigned
Type: Feature/Change Request
Package: SPL related
Operating System: ANY
PHP Version: PHP >= 5.2.0
Assigned To: rmf
Block user comment: N
Private report: N
New Comment:
As noted in the original title, a name of spl_object_id was suggested. I would like to propose
something more suggestive of the intent: spl_object_uuid.
While I went ahead and assigned this to myself because I would like to find a solution for my own
needs, this is not high priority, and I am not a regular PHP contributor, so the following two
things must fall into line for this to become a reality:
1. I can manage the time to investigate and implement an elegant and proper solution.
2. My patch is accepted.
I can absolutely guarantee this will not be in PHP 7. Based on my current schedule it'll likely
be a few minor releases after.
If anyone else have more ample time and wants to tackle this, feel free to snatch it away and assign
it to yourself ;-).
Previous Comments:
------------------------------------------------------------------------
[2014-10-08 12:47:30] adrien dot crivelli at gmail dot com
The workaround suggested by "maciej dot sz at gmail dot com" does not work, as it has the
exact same pitfall as the existing spl_object_hash() function.
I am in favor of modifying existing spl_object_hash(). Even if it is to return an int, instead of
string. I am pretty sure anybody using the function would actually be happier if we could guarantee
uniqueness for the entire PHP process lifetime.
------------------------------------------------------------------------
[2013-09-19 22:41:38] metamarkers at gmail dot com
Here's a chopped down version of my current solution.
function id ( $object ) {
static $id = 0;
if (!isset($object->__id) || $object->__id[0] !== spl_object_hash($object))
{
$object->__id = [spl_object_hash($object),++$id];
}
return $object->__id[1];
}
It works for clones to a degree. Clones can be made through this function to
automatically refresh the id.
function dupe ( $object ) {
$clone = clone $object;
id($clone);
return $clone;
}
------------------------------------------------------------------------
[2013-09-19 22:29:56] metamarkers at gmail dot com
Could be made into a magic property ->__id
The id could just be a signed 64-bit counter that ticks up every time an object
is created. What would happen when you create more than 9,223,372,036,854,775,807
objects? Refactor, probably.
------------------------------------------------------------------------
[2013-02-14 12:42:59] maciej dot sz at gmail dot com
An implementation of this is avaliable, and can be compiled as an extension: http://stackoverflow.com/a/3089587/1697320
------------------------------------------------------------------------
[2012-11-15 14:55:08] maciej dot sz at gmail dot com
@rasmus at mindplay dot dk: the thing is PHP already creates internal unique index for each
instantiated object. The requested spl_object_id() function would only have to return it. You may
have seen the value of this variable while debugging your scripts. Have you not noticed the
overhead? ;) Just kidding.
Anyway, your idea for workaround seemed reasonable to me, and now thanks to the traits in 5.4
I'm able to apply this unique object id to every class that I need. Just use the below trait.
It is also immune to the __get/__set issue. The downside of this is that the id is a string
containing class name. But if I'd need an id that is unique only within a specific class scope
I can use integer value without the class name:
<?php
/**
* Provides unique object's identifier.
*/
trait TObjectUniqueId
{
/**
* Object's unique id.
*
* @var int
*/
protected $__oid__ = null;
/**
* @return string
*/
public function getObjectUniqueId()
{
static $__object_index = 1;
if ( null === $this->__oid__ ) {
$this->__oid__ = __CLASS__ . '\\' . $__object_index++;
}
return $this->__oid__;
}
}
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=52657
--
Edit this bug report at https://bugs.php.net/bug.php?id=52657&edit=1