Unserialize в php 5.4.29/5.5.13 работает не так, как прежде

hell0w0rd

Продвинутый новичок
В общем такой код выдает теперь warning. Это код из доктрины, не знаю, где еще подобное используется.
PHP:
unserialize(sprintf('O:%d:"%s":0:{}', strlen($this->name), $this->name));
Вот предложенный фикс:
PHP:
if (PHP_VERSION_ID === 50429 || PHP_VERSION_ID === 50513) {
    $this->_prototype = $this->reflClass->newInstanceWithoutConstructor();
} else {
    $this->_prototype = unserialize(sprintf('O:%d:"%s":0:{}', strlen($this->name), $this->name));
}
Так что если у вас в проекте такое есть - исправьте, а кто юзает доктрину - не советую php обновлять
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А оно работало ли вообще нормально?

Код:
ubuntu@server:~$ php -v
PHP 5.3.10-1ubuntu3.11 with Suhosin-Patch (cli) (built: Apr  4 2014 01:30:04)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
    with XCache v1.3.2, Copyright (c) 2005-2011, by mOo

ubuntu@server:~$ php -r "echo unserialize(sprintf('O:%d:"%s":0:{}', strlen('test'), 'test'));"

PHP Notice:  unserialize(): Error at offset 0 of 13 bytes in Command line run code on line 1
 

hell0w0rd

Продвинутый новичок
keltanas, когда она грузит данные из базы и рассовывает по объектам. Она это делает в обход коснтруктора, а такие выкрутасы доступны с 5.4 версии.
Возможно такое решение существует из-за скорости, но мне кажется просто участок кода "работает - не трогай".
Вурдалак, это фикс с stackoverflow. На мой взгляд он должен выглядеть в сравнении с 50400, ибо там уже доступен метод для рефлексии.
Варнинг:
Код:
Warning: Erroneous data format for unserializing 'App\UserBundle\Entity\User' in project/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php line 869
 

hell0w0rd

Продвинутый новичок
Кому все еще интересно - в доктрину весит 3-4 PR (один из которых мой:D), исправляющих баг, но ни один не хотят принимать.
А тот, где сравнение версий вхардкодено, так и не выпустили релиз)) Так что не используйте доктрину ;)
 

hell0w0rd

Продвинутый новичок
keltanas, версию они таки выпустили и пример мне показали, где не работает рефлексия. Так что ты прав.
 

hell0w0rd

Продвинутый новичок
В общем ребята из доктрины приняли предложенный фикс, который конечно работает на определенных версиях и фейлится в 5.6.0, ждем 2.5.0, там всю эту байду в отдельный класс выделили
 

fixxxer

К.О.
Партнер клуба
Чета какой-то булшит, а не фикс.

Надо проверять на наличие newInstanceWithoutConstructor, а если его нет, использовать говнохак с unserialize, все будет ок
 
Сверху