Edit report at http://bugs.php.net/bug.php?id=52657&edit=1
ID: 52657 Comment by: giorgio dot liscio at email dot it Reported by: marco dot weber at uni-trier dot de Summary: create a spl_object_id function Status: Open Type: Feature/Change Request Package: SPL related Operating System: ANY PHP Version: Irrelevant Block user comment: N New Comment: i've experienced problems with uniqueness ofspl_object_hash i think should be rebuilt with a better one algorithm there is no need (i think) of another function, just fix spl_object_hash i think it is really important to fix Previous Comments: ------------------------------------------------------------------------ [2010-08-20 17:38:19] marco dot weber at uni-trier dot de i've forgotten to write down the test1 class: class test1 { public function __construct($s) { } } ------------------------------------------------------------------------ [2010-08-20 17:34:25] marco dot weber at uni-trier dot de Description: ------------ the problem with spl_object_hash is, that it is only unqiue for the existing objects. For a given Object: class container { protected $storage=array(); public function add(test1 $obj) { if(!isset($this->storage[spl_object_hash($obj)])) { $this->storage[spl_object_hash($obj)]=$obj; } } } This leads to a problem, that the add method receives the same hash in to following cases: CASE1: $o=new container(); $o->add(new test1("lalala")); $o->add(new test1("lololo")); // same hash, that's NOT ok! CASE2: $t=new test("lalala"); $o=new container(); $o->add($t); $o->add($t); // same hash, that's ok! Since there is nothing wrong, with the spl_object_hash() method, i suggest to introduce a new spl_object_id() function. This could simply return an (internal) uint32, that is attached to every object on its creation. This counter gets incremented on every object that gets created. :) Test script: --------------- // just with spl_object_hash :/ class container { protected $storage=array(); public function add(test1 $obj) { if(!isset($this->storage[spl_object_hash($obj)])) { $this->storage[spl_object_hash($obj)]=$obj; } } } $o=new container(); $o->add(new test1("lalala")); // will be added $o->add(new test1("lololo")); // not added - NOT as expected $t=new test("lalala"); $o=new container(); $o->add($t); // will be added $o->add($t); // not added - as expected Expected result: ---------------- // with the new spl_object_id function :) class container { protected $storage=array(); public function add(test1 $obj) { if(!isset($this->storage[spl_object_id($obj)])) { $this->storage[spl_object_id($obj)]=$obj; } } } $o=new container(); $o->add(new test1("lalala")); // will be added $o->add(new test1("lololo")); // will be added $t=new test("lalala"); $o=new container(); $o->add($t); // will be added $o->add($t); // not added ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=52657&edit=1