为什么Pimple工厂方法会返回相同的实例?

时间:2016-03-20 21:51:44

标签: php pimple

我正在使用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

1 个答案:

答案 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说:

  

注意:

     

当一个对象被销毁时,它的哈希可以重用于其他对象。

所以这不是一些奇怪的行为。