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兼容:。这是测试程序的输出:它们不是相同的实例,但是它们的哈希值相同,如果两个对象不同时存在(比如您的示例,第一个对象在创建第二个对象之前被销毁),则它们的哈希值相同。