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

Reply via email to