Php this function is deprecated

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

Deprecated: Function is deprecated in

Ваш сайт стал тормозить и посмотрев 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..

проверяйте код, т.к. обязательно перед этой функцией должна идти фукнция открытия соединения с базой.

Источник

Читайте также:  Android java выключить экран
Оцените статью