Yii2: Fatal error, Cannot use 'Object' as class name
При обновлении PHP на версию 7.2 столкнулся с ошибкой в "Fatal error, Cannot use 'Object' as class name" в Yii2...
Полный текст ошибки выглядит так:
Fatal error: Cannot use 'Object' as class name as it is reserved in /public_html/vendor/yiisoft/yii2/base/Object.php on line 77
Эта ошибка возникает т.к. в Yii2 до версии 2.0.13 для всех родительских классов используется класс Object. В PHP версии 7.2, слово object является зарезервированным и поэтому возникает конфликт. Обсуждение проблемы тут: [PHP7] Consider to deprecate yii\base\Object as object might become soft-reserved #7936
Решение - надо обновить Yii до новой версии, разумеется лучше всего до актуальной, но минимально до версии 2.0.13. (commit с исправлением проблемы)
Обновление до актуальной версии Yii2
Обновиться до актуальной версии можно с помощью composer:
1 2 3 |
composer update |
посмотреть на какую версию вы обновились после выполнения этой команды, можно так
1 2 3 |
composer show -i | grep "yiisoft/yii2 " |
Если же Вам нужно обновиться до версии 2.0.13, чтобы начать использовать PHP 7.2 с минимальными исправлениями в Yii2 из-за обновлений, то делаем так как описано ниже.
Обновление до версии 2.0.13 минимально необходимой для PHP 7.2
В моем случае, при создании было использовано базовое приложение yii2-app-basic. К сожалению, на момент написания статьи, оно по прежнему в качестве зависимости использует Yii 2.0.5.
Поэтому, чтобы обновиться, открываем файл /composer.json, который находится в корне проекта, ищем там
1 2 3 4 5 6 7 8 9 |
"require": { .. "php": ">=5.4.0", "yiisoft/yii2": "~2.0.5", "yiisoft/yii2-bootstrap": "~2.0.0", .. } |
и меняем на
1 2 3 4 5 6 7 8 9 10 |
"require": { ... "php": ">=7.2.0", "yidas/yii2-bower-asset": "2.0.13", "yiisoft/yii2": "2.0.13", "yiisoft/yii2-bootstrap": "2.0.7", ... } |
теперь выполняем обновление, пишем в консоли
1 2 3 |
composer update |
после обновления, ошибка должна пропасть
Ошибка осталась после обновления
В случае если Вы использовали в своих классах наследование от Object, например:
1 2 3 4 5 6 |
class MyClass extends \yii\base\Object { ... } |
Вы получите такую же же ошибку даже после обновления, для того чтобы исправить, нужно найти все такие наследования и поменять Object на BaseObject, вот так
1 2 3 4 5 6 |
class MyClass extends \yii\base\BaseObject { ... } |
Класс где происходит конфликт будет указан в тексте возникающей ошибки, поэтому при проверки функ3циональности не составит труда найти такие классы. Однако, рекомендую сразу после обновления, поискать маску по содержимому в файлах следующих директорий, чтобы исправить проблемы сразу в момент обновления:
Ищем текст "\yii\base\Object" в файлах *.php в директориях
- /public_html/commands
- /public_html/controllers
- /public_html/models
- /public_html/views
В случае если находим совпадения, идем в это место, и меняем \yii\base\Object на \yii\base\BaseObject.
На этом все, будут вопросы или трудности - пишите в комментарии
Author: | Tags: /
| Rating:
1 comment.
Write a comment