Я использую заводской метод прыщ, но он возвращает один и тот же экземпляр каждый раз.
$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
Прыщ не возвращает тот же экземпляр, но для некоторых известен Причина, по которой эти хеши точно такие же. Это не то, что связано с Pimple, а связано с spl_object_hash и тем, как PHP обрабатывает объекты внутри. квотирование этот пользователь добавил примечание, часть, которая отвечает на ваш вопрос, выделена жирным шрифтом:
Обратите внимание, что содержимое (свойства) объекта НЕ хэшируются
функция, просто ее внутренний дескриптор и указатель таблицы обработчика.
Этого достаточно, чтобы гарантировать, что любые два объекта одновременно
совместное проживание в памяти будет иметь разные хэши. Уникальность не
гарантировано между объектами, которые не находятся в памяти
одновременно, например: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";
Также есть нота в spl_object_hash
документация, которая гласит:
Замечания:
Когда объект уничтожается, его хэш может быть повторно использован для других объектов.
Так что это не странное поведение.
Других решений пока нет …