Pimple does not return the same instance, but for some known reason those hashes are exactly the same. This is not something related to Pimple, but related to spl_object_hash and how PHP handles objects internally. Quoting this user contributed note, the part that answers your question is in bold:
Note that the contents (properties) of the object are NOT hashed by
the function, merely its internal handle and handler table pointer.
This is sufficient to guarantee that any two objects simultaneously
co-residing in memory will have different hashes. Uniqueness is not
guaranteed between objects that did not reside in memory
simultaneously, for example:
var_dump(spl_object_hash(new stdClass()), spl_object_hash(new
stdClass()));
Running this alone will usually generate the same hashes, since PHP
reuses the internal handle for the first stdClass after it has been
dereferenced and destroyed when it creates the second stdClass.
So this is because you're not keeping a reference to returned objects. You just create them, print their hashes and then PHP throws them out of memory. For a better understanding of this note, try to keep those instances in memory by assigning them to variables ($ref1
and $ref2
here):
$container = new \Pimple\Container();
$container['test'] = $container->factory(function( $c ) {
$services = new \Pimple\Container();
return $services;
} );
// Outputs different object hashes
print( spl_object_hash( $ref1 = $container['test'] ) );
print "
";
print( spl_object_hash( $ref2 = $container['test'] ) );
print "
";
There is also a note in spl_object_hash
documentation that says:
Note:
When an object is destroyed, its hash may be reused for other objects.
So this is not some strange behavior.