- Function create_function() is Deprecated in PHP 7.2 — How to Migrate?
- Php this function is deprecated
- Есть несколько способов исправления ошибок Deprecated: Function is deprecated in:
- 1-й способов исправления ошибок Deprecated: Function is deprecated in — простой
- 2-й способов исправления ошибок Deprecated: Function is deprecated in — плохой
- 3-й способов исправления ошибок Deprecated: Function is deprecated in - временный
- 4-й способов исправления ошибок Deprecated: Function is deprecated in - исправление «автоматически»
- 5-й способов исправления ошибок Deprecated: Function is deprecated in - исправление «вручную»
- Такие предупреждения
Function create_function() is Deprecated in PHP 7.2 — How to Migrate?
Updated Rector YAML to PHP configuration, as current standard.
If there would be «Miss Deprecation of PHP 7.2», create_function() would definitely win. They can be very complex, tricky and very hard convert to PHP code. Moreover without tests.
Do you have over 5 create_function() pieces in your code? Let’s see how to migrate them.
Why is this deprecated? Well, the string arguments of few functions behaves like eval() — that’s evil.
php create_function("$a", "return $a"); assert("$value == 5");
php create_function("$a", "return $a"); create_function('$a', 'return $a');
You don’t want to think which if » or ` breaks the code — you want make code.
I think it’s a good move, so how do we refactor them? Let’s start with simple code:
php $callback = create_function('$matches', "return strtolower(\$matches[1]);");
How would you refactor this to anonymous function?
php $callback = function ($matches) return strtolower($matches[1]); >;
Also, notice the \$matches → $matches . That’s because quote escaping.
php create_function('$a,$b', "return \"min(b^2+a, a^2,b) = \".min(\$a*\$a+\$b,\$b*\$b+\$a);");
How would you refactor this to anonymous function?
php function ($a, $b) return "min(b^2+a, a^2,b) = " . min($a * $a + $b, $b * $b + $a); >;
The «min(b^2+a, a^2,b) = » is still a string, because it was escaped string in a string.
Too easy for you? Damn, you’re smart.
php create_function('$b,$a', 'if (strncmp($a, $b, 3) == 0) return "** \"$a\" '. 'and \"$b\"** Look the same to me! (looking at the first 3 chars)";');
How would you refactor this to anonymous function?
php function ($b, $a) if (strncmp($a, $b, 3) == 0) return "** \"a>\" and \"b>\"** Look the same to me! (looking at the first 3 chars)"; > >;
Ok, but you won’t make this code snippet I found in Drupal/Wordpress:
php $this->map_xmlns_func = create_function('$p,$n', 'if(strlen($n[0])>0) $xd .= ":"; return "=\"\"";');
How would you refactor this to anonymous function?
php $this->map_xmlns_func = function ($p, $n) use ($xd) if (strlen($n[0]) > 0) $xd .= ":n[0]>"; > return "xd>=\"n[1]>\""; >;
Who did forget use ($xd) ? An anonymous function can’t access variables that are not passed as arguments, so without this would crash.
And we could continue and continue with more edgy cases. but I bet you’re looking for a solution for your specific function. Well, you could ask on StackOverflow (181 results and counting), but posting each of your 10 cases might get you banned. I have good news for you.
Today in 2019 (almost there), you can instantly upgrade your code and it will take you less time to install & run, then read this whole post so far.
composer require rector/rector --dev
use Rector\Php72\Rector\FuncCall\CreateFunctionToAnonymousFunctionRector; use Rector\Config\RectorConfig; return function (RectorConfig $rectorConfig): void $rectorConfig->rule(CreateFunctionToAnonymousFunctionRector::class); >;
vendor/bin/rector process src
Do you learn from my contents or use open-souce packages like Rector every day?
Consider supporting it on GitHub Sponsors. I’d really appreciate it!
Php this function is deprecated
Ваш сайт стал тормозить и посмотрев error.log либо просто зайдя на свой сайт вы увидели одну из ошибок
Код: Выделить всё Развернуть Deprecated: Function ereg() is deprecated in .
Deprecated: Function eregi() is deprecated in .
Deprecated: Function ereg_replace() is deprecated in .
Deprecated: Function split() is deprecated in .
Deprecated: Function set_magic_quotes_runtime() is deprecated in .
Deprecated: Assigning the return value of new by reference is deprecated in .
Deprecated: Call-time pass-by-reference has been deprecated in .
Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in .
Это означает, что хостер обновил версию php до 5.3 (или выше) и в движке или установленных модулях/плагинах на сайте используются и до сих пор не исправлены устаревшие функции php (версии php 5.3 и выше).
Есть несколько способов исправления ошибок Deprecated: Function is deprecated in:
1-й способов исправления ошибок Deprecated: Function is deprecated in — простой
Если есть возможность, в панели хостинга сменить версию php на 5.2 или ниже, либо попросить хостера понизить установленную на сервере версию, либо просто переехать на хостинг с php 5.2 или ниже
2-й способов исправления ошибок Deprecated: Function is deprecated in — плохой
в php.ini изменить error_reporting = E_ALL на
Код: Выделить всё Развернуть E_ALL | E_DEPRECATED
или в .htaccess добавить в начало
Код: Выделить всё Развернуть php_value display_errors 22527
или в конфигурационный файл движка добавьте в начало после открывающего
Этот способ лишь отключит вывод ошибок об устаревших функциях, но сами функции работать не будет.
3-й способов исправления ошибок Deprecated: Function is deprecated in - временный
В php 5.3 не убрали устаревшие функции и лишь предупреждают о том что они устарели, в php 5.4 и выше они удалены.
Поэтому если на сервере php 5.3, то работоспособность функций можно включить.
Идем в php.ini и ищем блок
Код: Выделить всё Развернуть ; overload(replace) single byte functions by mbstring functions.
; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(),
; etc. Possible values are 0,1,2,4 or combination of them.
; For example, 7 for overload everything.
; 0: No overload
; 1: Overload mail() function
; 2: Overload str*() functions
; 4: Overload ereg*() functions
; //php.net/mbstring.func-overload
; mbstring.func_overload = 0
либо создаем свой php.ini, если хостер позволяет таким способом управлять настройками php.
- 0 - Оставить все без изменений.
- 1-4 Включить одну из функций.
- 7 - Включить сразу все функции.
Слово «включить» тут не совсем корректно. Речь идет об включении поддерживания старых функций, при этом новые будут отключены.
Убираем ; строку и присваиваем включить старые функции
Код: Выделить всё Развернуть mbstring.func_overload = 7
4-й способов исправления ошибок Deprecated: Function is deprecated in - исправление «автоматически»
Большинство движков и модулей/плагинов можно обновить с официальных сайтов до более новых версий , в которых уже исправлены устаревшие функции (либо обратиться в техподдержку с просьбой выпуска исправленных версий)
5-й способов исправления ошибок Deprecated: Function is deprecated in - исправление «вручную»
Однако есть движки/модули/плагины, которые больше не поддерживаются и не разрабатываются.
Это не проблема - функции можно поправить вручную.
Вот небольшая шпаргалка(использование - функции заменить, параметры экранировать слешем / либо иногда ~ ):
call_user_method() использовать call_user_func()
call_user_method_array() использовать call_user_func_array()
define_syslog_variables()
dl()
ereg() использовать preg_match()
ereg_replace() использовать preg_replace()
eregi() использовать preg_match() с модификатором "i"
eregi_replace() использовать preg_replace() с модификатором "i"
set_magic_quotes_runtime() использовать magic_quotes_runtime()
session_register() использовать $_SESSION
session_unregister() использовать $_SESSION
session_is_registered() использовать $_SESSION
set_socket_blocking() использовать stream_set_blocking()
split() использовать preg_split() или explode()
spliti() использовать preg_split() с модификатором "i"
sql_regcase()
mysql_db_query() использовать mysql_select_db() и mysql_query()
mysql_escape_string() использовать mysql_real_escape_string()
Примеры замены:
Код: Выделить всё Развернуть if (ereg('^'.preg_quote($nice_docroot).'(.*)$', $nice_cachefile, $matches))
Код: Выделить всё Развернуть if (preg_match('/^/'.preg_quote($nice_docroot).'(.*)$', $nice_cachefile, $matches))
Код: Выделить всё Развернуть return ereg_replace('2037' . '$', $year, date(DATE_FORMAT, mktime($hour, $minute, $second, $month, $day, 2037)));
Код: Выделить всё Развернуть return preg_replace('/2037$/', $year, date(DATE_FORMAT, mktime($hour, $minute, $second, $month, $day, 2037)));
Код: Выделить всё Развернуть $temp_array = split($needle, $string);
Код: Выделить всё Развернуть $temp_array = preg_split('/' . $needle . '/', $string);
Код: Выделить всё Развернуть ini_set("magic_quotes_runtime", 0);
Код: Выделить всё Развернуть ..
//$mqr=get_magic_quotes_runtime();
ini_set("magic_quotes_runtime", 0);
..
//set_magic_quotes_runtime($mqr);
Почти всегда используется слеш / в качестве экрана. Но иногда он не срабатывает и появляется ошибка
Код: Выделить всё Развернуть Warning:preg_match() [function.preg-match]: Unknown modifier 'тут_любая_буква_или_знак' in home/../файл.php
В таких случаях используйте в качестве экрана ~..~ (или ~..~i) , вместо /../ (или /../i)
Такие предупреждения
PHP Deprecated: Assigning the return value of new by reference is deprecated in..
PHP Deprecated: Call-time pass-by-reference has been deprecated in..
говорят, что в функциях используется амперстанд &, его надо удалить:
Код: Выделить всё Развернуть $contentElement = new ContentElement( $xmlDoc );
Код: Выделить всё Развернуть preg_match_all( $pattern, $text, $links, PREG_SET_ORDER );
//set_magic_quotes_runtime($mqr);
Если после замены mysql_escape_string() на mysql_real_escape_string() получаете
Warning: mysql_real_escape_string(): A link to the server could not be established in..
проверяйте код, т.к. обязательно перед этой функцией должна идти фукнция открытия соединения с базой.