2016-03-20 3 views
1

Я использую factory method of Pimple, но каждый раз возвращается тот же экземпляр.Почему фабричный метод 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 и мой файл композитор прыщ отмечен на ^3.0.0

+0

Обновленные версии выше. Так что действительно это могут быть либо выпуски основных версий ... Я собираюсь попробовать перейти на 2.8 на Pimple в первый раз –

+0

@ RyanVincent вы на другой версии? Я нигде не вижу 2.8: https://github.com/silexphp/Pimple/releases –

+0

Извините, я использую последнюю версию, так как она совместима с PHP 5.3: https://github.com/silexphp/Pimple. Вот результат тестовой программы: http://pastebin.com/Zs3879Bc –

ответ

0

Прыщ не возвращает тот же экземпляр, но по некоторым известно причине эти хэши точно так же. Это не связано с Pimple, но связано с spl_object_hash и тем, как PHP обрабатывает объекты внутри. Цитирование this user contributed note, та часть, которая отвечает на ваш вопрос находится в смелом:

Обратите внимание, что содержимое (свойства) объекта НЕ хэшируются по функции, просто ее внутреннюю ручку и обработчик указатель таблицы. Этого достаточно, чтобы гарантировать, что любые два объекта одновременно , совместно находящиеся в памяти, будут иметь разные хэши. Уникальность не гарантируется между объектами, которые не находятся в памяти одновременно, например:

var_dump (spl_object_hash (новый StdClass()), spl_object_hash (новый 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"; 
Смежные вопросы