簡體   English   中英

為什么Pimple工廠方法會返回相同的實例?

[英]Why would Pimple factory method return same instance?

我使用的是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上,而我的作曲家文件為pimple,標記為^3.0.0

Pimple不會返回相同的實例,但是由於某些已知的原因,這些散列是完全相同的。 這與Pimple無關,但與spl_object_hash以及PHP如何在內部處理對象有關。 引用此用戶提供的注釋 ,回答您問題的部分以粗體顯示:

請注意,對象的內容(屬性)不是由函數散列的,而只是其內部句柄和處理程序表指針。 這足以確保同時在內存中同時存在的兩個對象都具有不同的哈希值。 不能同時存在於內存中的對象之間不能保證唯一性,例如:

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文檔中還有一條說明

注意:

當一個對象被銷毀時,它的哈希可以重用於其他對象。

所以這不是一些奇怪的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM