我正在使用工厂法,但它每次都返回相同的实例。
$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
发布于 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 ),以便将它们保存在内存中:
$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文档中说:
注意: 当一个对象被销毁时,它的散列可以被重用到其他对象中。
所以这不是什么奇怪的行为。
https://stackoverflow.com/questions/36120051
复制相似问题