На днях начинал новый проект, использующий расширение-магазин VirtueMart. Естественным желанием было разрабатывать на последних версиях серверного ПО и я решил использовать PHP 7.1. К слову скажу, что используя PHP 7+ вы уже автоматически получаете ощутимый прирост в скорости, хотя производительность конечно зависит не только от одного PHP.

Тем не менее, с новыми возможностями и улучшениями, часто всплывают различные трудности перевода своего приложения на обновлённое ПО. Язык PHP постоянно развивается. Что-то новое добавляется, что-то старое выбрасывается. И очень часто ошибки возникают из-за каких-то, ныне не поддерживаемых, языковых конструкций.

Таким образом, зайдя на страницу конфигурации VirtueMart, я увидел следующую ошибку:

[] operator not supported for strings 

Причина заключалась в том, что некоторые методы конфигурационной модели VirtueMart использовали синтаксис, который в PHP 7.1 больше не поддерживается. В частности, так называемую передекларацию переменных в массивы. В методе объявляется переменная в виде пустой строки и в зависимости от условия возвращается либо обработанный массив, либо эта самая пустая строка. Другие методы, которые будут работать с этим результатом, ожидают у себя на входе массив, а автоматическое преобразование пустой строки больше не происходит.

Вот пример кода, который нормально отрабатывал на PHP <= 7.0:

$arr = '';
$arr[] = '123';

Т.е. сначала мы объявляем переменную как пустую строку, а затем можем передекларировать её в массив. Если строка была бы не пустой, то разумеется получаем ошибку. На выходе у нас массив, первая (нулевая по индексу) ячейка которого будет содержать '123'.

В PHP 7.1 больше нельзя производить такую передекларацию. Теперь $arr должен быть изначально объявлен как массив:

$arr = [];
$arr[] = '123';

Сразу оговорюсь, что решение проблемы с VirtueMart потребует небольших правок конфигурационной модели. Это означает, что данные изменения могут перестать работать после обновления VirtueMart. Но я бы на вашем месте не беспокоился. Скорее всего следующее обновление VirtueMart и так будет полностью поддерживать PHP 7.1. Ну а если вдруг опять увидите ошибку, то всегда сможете потратить 5 секунд своего времени и вновь поправить две строчки кода.

И так, идём в файл /administrator/components/com_virtuemart/models/config.php

Нас интересуют два метода - getNoImageList() и getCurrencyConverterList(). Найдите их с помощью поиска. Первый находится в районе 186-ой строки, а второй в районе 232-ой. В теле обоих методов вы можете увидеть вот такую строчку:

$result = '';

Для исправления ошибки, в обоих методах достаточно заменить её на:

$result = [];

Вот собственно и все. Желаю вашим приложениям стабильной и быстрой работы. Удачи!

Выводы:

PHP явно идет в сторону строгого синтаксиса. А это не может не радовать.