【问题标题】:Why would Pimple factory method return same instance?为什么 Pimple 工厂方法会返回相同的实例?
【发布时间】:2016-03-20 21:51:43
【问题描述】:

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

【问题讨论】:

  • 以上更新版本。所以真的可以是主要版本的版本......我会先尝试在 Pimple 上滚动到 2.8
  • @RyanVincent 你在另一个版本上吗?我在任何地方都看不到 2.8:github.com/silexphp/Pimple/releases
  • 抱歉,我使用的是最新版本,因为它与 PHP 5.3 兼容:github.com/silexphp/Pimple。这是测试程序的输出:pastebin.com/Zs3879Bc
  • 它们不是相同的实例,但它们的哈希值是相同的,是的,如果两个对象不同时存在(比如你的例子,第一个对象在创建第二个对象之前被销毁) it is possible 让他们拥有相同的哈希值。

标签: php pimple


【解决方案1】:

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 时取消引用并销毁。

所以这是因为您没有保留对返回对象的引用。您只需创建它们,打印它们的哈希值,然后 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 说:

注意:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    相关资源
    最近更新 更多