X

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:

composer update

посмотреть на какую версию вы обновились после выполнения этой команды, можно так

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, который находится в корне проекта, ищем там

"require": {
..
"php": ">=5.4.0",
"yiisoft/yii2": "~2.0.5",
"yiisoft/yii2-bootstrap": "~2.0.0",
..
}

и меняем на

"require": {
...
"php": ">=7.2.0",
"yidas/yii2-bower-asset": "2.0.13",
"yiisoft/yii2": "2.0.13",
"yiisoft/yii2-bootstrap": "2.0.7",
...
}

теперь выполняем обновление, пишем в консоли

composer update

после обновления, ошибка должна пропасть

Ошибка осталась после обновления

В случае если Вы использовали в своих классах наследование от Object, например:

class MyClass extends \yii\base\Object 
{
...
}

Вы получите такую же же ошибку даже после обновления, для того чтобы исправить, нужно найти все такие наследования и поменять Object на BaseObject, вот так

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.

На этом все, будут вопросы или трудности - пишите в комментарии

Категории: PHP Yii
Тэги: Objectphp7yii2

Комментарии (1)