Почему фабричный метод 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

1

Решение

Прыщ не возвращает тот же экземпляр, но для некоторых известен Причина, по которой эти хеши точно такие же. Это не то, что связано с 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 документация, которая гласит:

Замечания:

Когда объект уничтожается, его хэш может быть повторно использован для других объектов.

Так что это не странное поведение.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]