26.04.2017 17:05
OlegON
 
По итогам недели перехода на PHP7 получил сильное переутомление и глубокую ненависть к тому, кто придумал просто выкидывать и кардинально переписывать функции популярного языка. До сих пор не понимаю, что движет этими людьми, корежащими все и вся.

Несмотря на то, что одна из функция почему-то перестала получать параметр и я тупо переписал ее без этого параметра, так и не поняв, почему она так начала глючить, могу предположить, что переход состоялся. Переводил на PHP7 Vbulletin 3.x, Wordpress со старой темой и плагинами, полусамописный скрипт Хранилища, еще массу костылей, составляющих основу этого ресурса. Ниже попытаюсь вспомнить основные проблемы перехода и как-то описать способы их обойти.

Для забегающих вперед могу сказать, что ускоряются от перехода только кривоподелия вроде Wordpress, которые из-за своего неоптимального кода много что кладут на процессор. В связи с тем, что вордпрессовская часть у меня наименее нагруженная, а какие-то участки кода пришлось переписать, скажем, не очень оптимально, общая нагрузка на сервер не изменилась, совсем. Была бы возможность не обновляться - обязательно бы ею воспользовался.
26.04.2017 17:09
OlegON
 
Не в порядке очереди - незаметный отвал mysql в плагине генерации sitemap, к счастью, везде в других местах я mysql уже давно заменил на mysqli_
Цитата:
PHP Fatal error: Uncaught Error: Call to undefined function mysql_
собственно, достаточно быстро переписывается на mysqli_* с учетом того, что в большинстве функций появилась переменная подключения, а часть функций отсутствует или с переставленными параметрами. Учитывая, что плагин я переписал из какой-то древней заготовки, ворох кода в итоге пришлось полностью заменить. Разбираться в нем не было сил.
26.04.2017 17:17
OlegON
 
Цитата:
PHP Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; class_name has a deprecated constructor
Еще одно из изобретений в стиле "я художник, я так вижу. Придется пробежать по коду и если раньше конструкторы по имени соответствовали классу, например, так
Код:
class class_name
{    
    function class_name()
    {
то теперь эту функцию надо обозвать __construct
Код:
class class_name
{
        function __construct()
у меня таких правок было несколько десятков.
26.04.2017 17:26
OlegON
 
Цитата:
Warning: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in ...
самый сок... Возможность просто выкинули, не интересуясь, как это все написано... Уже писал отдельную тему, повторюсь: https://olegon.ru/showthread.php?t=26833

Самое хреновое в этом переписывании то, что у меня preg_replace было около 1600 по всему коду. Начал все просматривать - нереально, пришлось искать по вхождениям вроде #ie' ура, всего пара сотен, с учетом кучи работы на эти самые комбинации и то, что разделители regexp могут быть самые разные, не обязательно #. Самое проблемное - деление некоторых preg_replace на части, поскольку там и массивы передавались раньше, смешанные строк и callback-функций (см. по ссылке примеры). Решение только одно - делить такие вызовы на строковые и callback.
26.04.2017 17:29
OlegON
 
Неоднозначность обращения к непрямым переменным. Опять художники.
Старая и новая оценка непрямых выражений
Счастье, что у меня такого было минимум. Однако искать запариться можно.
26.04.2017 17:39
OlegON
 
Цитата:
Fatal error: Uncaught Error: Call to undefined function ereg_replace()
Опять из художников. Взяли и выбросили. Мелочь, легко правится, но мне опять несколько сотен вхождений пришлось переписать. Например
Код:
$str=ereg_replace("[\r\t\n]","",$str)
на
Код:
$str=preg_replace("/[\r\t\n]/","",$str)
аналогично, если eregi, то регулярку определить регистронезависимой (модификатор i)
Код:
$str=preg_replace("/[\r\t\n]/i","",$str)
26.04.2017 17:41
OlegON
 
Цитата:
Fatal error: Uncaught Error: Call to undefined function split()
Тут все просто, как и в предыдущем случае
Код:
$var_pair=split("=",$tmp[3])
смотрим, если в агрументах не регулярка, то меняем на
Код:
$var_pair=explode("=",$tmp[3])
в противном случае паримся с preg_split
26.04.2017 17:44
OlegON
 
Цитата:
Warning: Declaration of vBForum_Item_SocialGroupDiscussion::getLoadQuery() should be compatible with vB_Model::getLoadQuery($required_query = '', $force_rebuild = false) in ...
Код:
protected function getLoadQuery($required_query, $force_rebuild = false)
меняем на
Код:
protected function getLoadQuery($required_query = self::QUERY_BASIC, $force_rebuild = false)
или
Код:
function fetch_image_info($filename, $extension) {}
на
Код:
function fetch_image_info($filename, $extension = null) {}
26.04.2017 17:46
OlegON
 
Цитата:
Warning: Only variables should be passed by reference in ...
исправляем
Код:
 $edit['emailupdate'] = array_pop($array = array_keys(fetch_emailchecked($threadinfo)));
на
Код:
$array = array_keys(fetch_emailchecked($threadinfo));                
$edit['emailupdate'] = array_pop($array);
аналогичное, но сложнее
Код:
$newpost['htmlstate'] = array_pop($array = array_keys(fetch_htmlchecked($vbulletin->GPC['htmlstate'])));
меняем на
Код:
$htmlstate = fetch_htmlchecked($vbulletin->GPC['htmlstate']); 
$array = array_keys($htmlstate); 
$newpost['htmlstate'] = array_pop($array);
бывает, что ссылку =& можно заменить на приравнивание, т.е. просто =

Код:
$thread = $item->get_thread();

$foruminfo = fetch_foruminfo($thread->get_field('forumid'));
на
Код:
$thread = $item->get_thread();
$forumid = $thread->get_field('forumid');
$foruminfo = fetch_foruminfo($forumid);
26.04.2017 17:51
OlegON
 
Цитата:
Warning: preg_match(): Compilation failed: invalid range in character class at offset 23 in ...
Код:
 if (preg_match('#attachment.php\?attachmentid=(\d+)#si', $img_url, $matches) AND preg_match('#class=(\'|"|)([a-z0-9_-\s]+)?\s*previewthumb\s*([a-z0-9_-\s]+)?(\\1)#siu', $fullurl))
меняем на
Код:
 if (preg_match('#attachment.php\?attachmentid=(\d+)#si', $img_url, $matches) AND preg_match('#class=(\'|"|)([a-z0-9_-]+)?\s*previewthumb\s*([a-z0-9_-]+)?(\\1)#siu', $fullurl))

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.