我正在使用factory method of Pimple,但每次都返回相同的实例。
$container = new \Pimple\Container();
echo '<pre>';
$container['test'] = $container->factory(function( $c ) {
$services = new \Pimple\Container();
return $services;
} );
// Both outputs string(32) "0000000061066681000000005c9b6294"
var_dump( spl_object_hash( $container['test'] ) );
var_dump( spl_object_hash( $container['test'] ) );
这是我不期望的确切行为,因为该方法的定义说它每次都会给出一个新实例。
我使用的是PHP 7.0.4,而我的作曲家文件是针对疙瘩标记为^3.0.0
答案 0 :(得分:0)
Pimple不会返回相同的实例,但对于某些已知的原因,这些哈希值完全相同。这与Pimple无关,但与spl_object_hash以及PHP如何在内部处理对象有关。引用this user contributed note,回答您问题的部分以粗体显示:
请注意,对象的内容(属性)不会被散列 该函数,仅仅是它的内部句柄和处理程序表指针。 这足以保证同时存在任何两个对象 共存于记忆中将有不同的哈希。唯一性不是 保证在不驻留在内存中的对象之间 同时,例如:
var_dump(spl_object_hash(new stdClass()),spl_object_hash(new stdClass的()))强>
自PHP运行以来,通常会生成相同的哈希值 在第一个stdClass之后重用第一个stdClass的内部句柄 在创建第二个stdClass时解除引用并销毁。
所以这是因为你没有保留对返回对象的引用。你只是创建它们,打印它们的哈希值,然后PHP将它们抛出内存。为了更好地理解本说明,请尝试通过将这些实例分配给变量($ref1
和$ref2
来保留这些实例):
$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 "\n";
print( spl_object_hash( $ref2 = $container['test'] ) );
print "\n";
spl_object_hash
文档中还有一个note说:
注意:
当一个对象被销毁时,它的哈希可以重用于其他对象。
所以这不是一些奇怪的行为。