Переход на PHP 7

Форум для тех кто начинает осваивать язык php.
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Переход на PHP 7

Сообщение Slash » Ср апр 27, 2016 9:23 am

Здравствуйте.
Решил написать о переходе на PHP 7, так как сам сейчас занять переводом кода одного движка по PHP 7. И так для начала включаем дебаг или отладчик в админ панели сайта, если такого нет у вас, то можно сделать так, как написано в теме: Поиск ошибок в PHP, теперь на экране монитора, мы можем видеть сообщения ошибках, например, такое:
Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead - dir/file.php (номер строки)

Это сообщение говорит о том, что модификатор e не существует в PHP 7, следует избавляться от него, но если просто удалить данный модификатор, сценарий может выполнятся неправильно, непросто же так его туда писали. Я покажу на примере кода из PHPFOX 3 (как я переписывал код: PHPFOX 3 переход на PHP 7), делаем так:
Например, у нас сообщение ошибки указывает на такую строчку:

Код: Выделить всё

        $sStr = preg_replace('/\[x=(\d+)\].+?\[\/x\]/ise', "''.stripslashes(\$this->_parseUserTagged('$1')).''", $sStr); 

Её следует изменить так:

Код: Выделить всё

        $sStr = preg_replace_callback(
            '/\[x=(\d+)\].+?\[\/x\]/is',
            function($match)
            {
                return stripslashes($this->_parseUserTagged($match[1]));
            },
        $sStr); 

Тут мы заменили функцию preg_replace(), на preg_replace_callback(), удалили модификатор e в первом аргументе, которым является регулярное выражение. Второй аргумент заменили анонимной функцией, которая будет выполнятся после применения регулярного выражения. Анонимная функция содержит массив $match, элементы массива заменяют совпадения, например, было: $1, стало: $match[1]; было: $2, стало: $match[2], и так далее. Убрали кавычки и символ экранирования (обратный слеш \).

В завершении об ошибки несуществующего модификатора e, покажу ещё пару примеров замены кода. Строку:

Код: Выделить всё

$aRow['value_actual'] = preg_replace("/s:(.*):\"(.*?)\";/ies", "'s:'.strlen('$2').':\"$2\";'", $aRow['value_actual']); 

Меняем так:

Код: Выделить всё

                            $aRow['value_actual'] = preg_replace_callback(
                                '/s:(.*):\"(.*?)\";/is',
                                function($match)
                                {
                                    return 's:' . strlen($match[2]) . ':"' . $match[2] . '";';
                                },
                            $aRow['value_actual']); 

И пример с переменной в регулярном выражении, строка:

Код: Выделить всё

$sTxt = preg_replace('/\[' . $sBbcode . '=(.*?)\]/ise', "''.\$this->_replaceBbCode('' . \$sBbcode . '', 'prefix', true, '$1').''", $sTxt);

Заменяется так:

Код: Выделить всё

            $sTxt = preg_replace_callback(
                '/\[' . $sBbcode . '=(.*?)\]/is',
                function($match) use($sBbcode)
                {
                    return $this->_replaceBbCode($sBbcode, 'prefix', true, $match[1]);
                },
            $sTxt); 

Тут мы добавили функцию use(), в которую поместили переменную из регулярного выражения, тем самым передали переменную в анонимную функцию. Если переменных в регулярном выражении будет больше одной, то просто перечисляем их через запятую, пример:

Код: Выделить всё

function($match) use($a, $b, $c)
Реклама
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Переход на PHP 7

Сообщение Slash » Ср апр 27, 2016 9:34 am

Устаревшая функция ereg_replace()
Как сообщил официальный сайт PHP: http://php.net/:
С версии PHP 5.3.0 эта функция считается УСТАРЕВШЕЙ. Крайне не рекомендуется полагаться на эту возможность.

А уж в PHP 7 про неё вообще забыли... Можно получить такое сообщение об ошибки:
Fatal error: Uncaught Error: Call to undefined function ereg_replace()

Эту функцию следует заменить на preg_replace(), следуя примеру ниже. Допустим у нас такая строка кода:

Код: Выделить всё

$str = ereg_replace('[^ -<>-}]', ' ', str_replace("\x00", ' ', $originalcommentname)); 

Изменяем код так:

Код: Выделить всё

$str = preg_replace('/[^ -<>-}]/', ' ', str_replace("\x00", ' ', $originalcommentname)); 

То есть: ereg_replace заменили на: preg_replace, в начало и конец регулярного выражения добавили слеши.
Тоже самое и с функцией ereg.
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Переход на PHP 7

Сообщение Slash » Ср апр 27, 2016 5:03 pm

Замена MYSQL_* на MYSQLI_*
Функции mysql_* уже давно были объявлены устаревшими, а в PHP 7 они удалены, есть mysqli_*, вот на эти функции и будем менять.
И так, например, сейчас у нас такой код:

Код: Выделить всё

$db = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($name, $db);

Эти две функции меняем на одну:

Код: Выделить всё

$db = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); 

Функцию:

Код: Выделить всё

mysql_set_charset('utf8');

Меняем так:

Код: Выделить всё

mysqli_set_charset($db, 'utf8');

Функцию выполнения запроса:

Код: Выделить всё

$result mysql_query($query); 

Меняем на:

Код: Выделить всё

$result mysqli_query($db$query); 
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Переход на PHP 7

Сообщение Slash » Ср апр 27, 2016 5:50 pm

Устаревшая функция split()
Если у вас в коде есть устаревшая функция: split(), замените её на: explode(). Пример:
Было:

Код: Выделить всё

          $fileParts split("\."$filename); 

Стало:

Код: Выделить всё

          $fileParts explode('.'$filename);  

Вернуться в «PHP»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость