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

Php 为什么Pimple工厂方法会返回相同的实例?,php,pimple,Php,Pimple,我正在使用,但每次都返回相同的实例 $container = new \Pimple\Container(); echo '<pre>'; $container['test'] = $container->factory(function( $c ) { $services = new \Pimple\Container(); return $services; } ); // Both outputs string(32) "00000000610666810

我正在使用,但每次都返回相同的实例

$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'] ) );
$container=new\Pimple\container();
回声';
$container['test']=$container->factory(函数($c){
$services=new\Pimple\Container();
返回$5服务;
} );
//两个输出字符串(32)“00000000 610666681000000005C9B6294”
var_dump(spl_object_hash($container['test']);
var_dump(spl_object_hash($container['test']);
这正是我所不期望的行为,因为方法的定义是每次都给出一个新实例

$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,我的pimple composer文件标记为
^3.0.0

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

请注意,对象的内容(属性)不是由 函数,只是它的内部句柄和处理程序表指针。 这足以保证任意两个对象同时 共同驻留在内存中将有不同的散列。独特性并不重要 在未驻留在内存中的对象之间保证 同时,例如:

var\u dump(spl\u object\u hash(new stdClass()),spl\u object\u hash(new stdClass()) stdClass())

单独运行它通常会生成相同的哈希,因为PHP 为第一个stdClass重新使用内部句柄 在创建第二个stdClass时取消引用并销毁。

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

spl\u object\u hash
文档中还有一个说明:

注:

当一个对象被销毁时,它的散列可以被其他对象重用


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

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

请注意,对象的内容(属性)不是由 函数,只是它的内部句柄和处理程序表指针。 这足以保证任意两个对象同时 共同驻留在内存中将有不同的散列。独特性并不重要 在未驻留在内存中的对象之间保证 同时,例如:

var\u dump(spl\u object\u hash(new stdClass()),spl\u object\u hash(new stdClass()) stdClass())

单独运行它通常会生成相同的哈希,因为PHP 为第一个stdClass重新使用内部句柄 在创建第二个stdClass时取消引用并销毁。

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

spl\u object\u hash
文档中还有一个说明:

注:

当一个对象被销毁时,它的散列可以被其他对象重用


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

上面的更新版本。所以它可以是主要的版本发布。。。我要试着在粉刺上滚到2.8first@RyanVincent你有别的版本吗?我在任何地方都看不到2.8:对不起,我使用的是最新版本,因为它与PHP5.3兼容:。这是测试程序的输出:它们不是相同的实例,但它们的哈希值相同。如果两个对象不同时存在(比如您的示例,第一个对象在创建第二个对象之前被销毁),则它们的哈希值相同。上面的更新版本。所以它可以是主要的版本发布。。。我要试着在粉刺上滚到2.8first@RyanVincent你有别的版本吗?我在任何地方都看不到2.8:对不起,我使用的是最新版本,因为它与PHP5.3兼容:。这是测试程序的输出:它们不是相同的实例,但是它们的哈希值相同,如果两个对象不同时存在(比如您的示例,第一个对象在创建第二个对象之前被销毁),则它们的哈希值相同。