Skip to content

Commit

Permalink
Implement spl_object_id(object $x) : int
Browse files Browse the repository at this point in the history
spl_object_id is a new function returning the object handle,
as a signed integer.

Discussion for this new function is ongoing on php-internals, see
https://marc.info/?t=143835274500003&r=1&w=2

The object id is unique for the lifetime of the object.
When the object is garbage collected,
different objects may & will have the same object id.

- This is also the case for the string generated by spl_object_hash

It is always possible to cast the object handle to a **signed** zend_long
in php 7.2. _zend_object->handle is always of the type `uint32_t`.
(zend_long is 32 bits on 32 bit builds, 64 bits on 64 bit builds)

As of php 7.0, the object id uniquely identifies the object,
there can't be two objects with the same id but different handlers
(See the implementation of spl_object_hash)

Skip the pointless XORing, as discussed in internals.

- It was intended to avoid exposing in-memory addresses.
- The object handle is not a memory address.
- The output of var_dump() includes the object handle(id)
  • Loading branch information
TysonAndre authored and nikic committed Aug 2, 2017
1 parent b4bce59 commit 5097e2e
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 0 deletions.
3 changes: 3 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ PHP NEWS
- SQLite3:
. Updated to SQLite 3.20.0. (cmb)

- SPL:
. Added spl_object_id(). (Tyson Andre)

03 Aug 2017, PHP 7.2.0beta2

- Core:
Expand Down
19 changes: 19 additions & 0 deletions ext/spl/php_spl.c
Original file line number Diff line number Diff line change
Expand Up @@ -794,6 +794,20 @@ PHP_FUNCTION(spl_object_hash)
}
/* }}} */

/* {{{ proto int spl_object_id(object obj)
Returns the integer object handle for the given object */
PHP_FUNCTION(spl_object_id)
{
zval *obj;

ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_OBJECT(obj)
ZEND_PARSE_PARAMETERS_END();

RETURN_LONG((zend_long)Z_OBJ_HANDLE_P(obj));
}
/* }}} */

PHPAPI zend_string *php_spl_object_hash(zval *obj) /* {{{*/
{
intptr_t hash_handle, hash_handlers;
Expand Down Expand Up @@ -915,6 +929,10 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_spl_object_hash, 0, 0, 1)
ZEND_ARG_INFO(0, obj)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO_EX(arginfo_spl_object_id, 0, 0, 1)
ZEND_ARG_INFO(0, obj)
ZEND_END_ARG_INFO()
/* }}} */

/* {{{ spl_functions
Expand All @@ -931,6 +949,7 @@ const zend_function_entry spl_functions[] = {
PHP_FE(class_implements, arginfo_class_implements)
PHP_FE(class_uses, arginfo_class_uses)
PHP_FE(spl_object_hash, arginfo_spl_object_hash)
PHP_FE(spl_object_id, arginfo_spl_object_id)
#ifdef SPL_ITERATORS_H
PHP_FE(iterator_to_array, arginfo_iterator_to_array)
PHP_FE(iterator_count, arginfo_iterator)
Expand Down
21 changes: 21 additions & 0 deletions ext/spl/tests/spl_object_id.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
--TEST--
SPL: spl_object_id()
--FILE--
<?php

var_dump(spl_object_id(new stdClass));
var_dump(spl_object_id(42));
var_dump(spl_object_id());
$a = new stdClass();
var_dump(spl_object_id(new stdClass) === spl_object_id($a));

?>
--EXPECTF--
int(%d)

Warning: spl_object_id() expects parameter 1 to be object, integer given in %sspl_object_id.php on line %d
NULL

Warning: spl_object_id() expects exactly 1 parameter, 0 given in %sspl_object_id.php on line %d
NULL
bool(false)

0 comments on commit 5097e2e

Please sign in to comment.