首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Pimple工厂方法会返回相同的实例?

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

Stack Overflow用户
提问于 2016-03-20 21:51:43
回答 1查看 412关注 0票数 1

我正在使用工厂法,但它每次都返回相同的实例。

代码语言:javascript
复制
$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'] ) );

考虑到方法的定义,它每次都会给出一个新的实例,这正是我所不期望的行为。

我在PHP7.0.4上,我的粉刺作曲家文件被标记为^3.0.0

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-06 21:29:42

Pimple不返回相同的实例,但是由于一些已知的原因,这些散列完全相同。这与Pimple无关,而是与spl_object_hash和PHP内部处理对象的方式有关。引用此用户投稿说明的话,回答你问题的部分用黑体字表示:

注意,对象的内容(属性)不是由函数散列的,只是它的内部句柄和处理程序表指针。这足以保证任何同时驻留在内存中的两个对象都有不同的散列。不同时驻留在内存中的对象之间的唯一性得不到保证,例如: var_dump(spl_object_hash(新stdClass()),spl_object_hash(new stdClass()); 单独运行的通常会生成相同的散列,因为当第一个stdClass创建第二个stdClass.时,它会重用第一个stdClass的内部句柄。

这是因为您没有保留对返回对象的引用。您只需创建它们,打印它们的散列,然后PHP将它们抛出内存。为了更好地理解本说明,请将这些实例赋值给变量(此处为$ref1$ref2 ),以便将它们保存在内存中:

代码语言:javascript
复制
$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文档中说:

注意: 当一个对象被销毁时,它的散列可以被重用到其他对象中。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36120051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档