1

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

4

1 回答 1

0

Pimple 不会返回相同的实例,但由于某些已知原因,这些哈希值完全相同。这与 Pimple 无关,但与 spl_object_hash 以及 PHP 如何在内部处理对象有关。引用此用户贡献的注释,回答您问题的部分以粗体显示:

请注意,对象的内容(属性)不是由函数散列的,只是它的内部句柄和处理程序表指针。这足以保证同时存在于内存中的任何两个对象将具有不同的哈希值。不能保证不同时驻留在内存中的对象之间的唯一性,例如:

var_dump(spl_object_hash(new stdClass()), spl_object_hash(new stdClass())) ;

单独运行它通常会生成相同的哈希值,因为 PHP 在创建第二个 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说:

笔记:

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

所以这不是什么奇怪的行为。

于 2017-08-06T21:29:42.657 回答