{"id":543,"date":"2016-03-24T13:18:26","date_gmt":"2016-03-24T16:18:26","guid":{"rendered":"https:\/\/blog.umbler.com\/?p=543"},"modified":"2018-12-06T11:04:39","modified_gmt":"2018-12-06T13:04:39","slug":"php-7-recursos-obsoletos","status":"publish","type":"post","link":"https:\/\/blog.umbler.com\/br\/php-7-recursos-obsoletos\/","title":{"rendered":"#2 PHP 7 &#8211; Recursos Obsoletos"},"content":{"rendered":"<p>No PHP um recurso (feature) \u00e9 marcado como obsoleto (deprecated) para informar aos desenvolvedores que em uma vers\u00e3o futura esse recurso ser\u00e1 removido totalmente. Com isso, os desenvolvedores possuem tempo para migrar suas aplica\u00e7\u00f5es antes que elas comecem a apresentar erro por usar recursos obsoletos.<\/p>\n<p>Nos \u00faltimos releases do PHP 5.x v\u00e1rios recursos (features) foram marcados como obsoletos (deprecated), e esses recursos foram removidos no PHP 7. Nesse artigo apresento um pouco do que foi removido.<\/p>\n<div class=\"alert alert-info\">No PHP, sempre que um desenvolvedor faz uso de um recurso marcado como <b>&#8220;deprecated&#8221;<\/b>, ele recebe um erro <b>E_DEPRECATED.<\/b><\/div>\n<h2>Tags Alternativas<\/h2>\n<p>Alguns desenvolvedores podem desconhecer esse recurso, mas o PHP possui tags alternativas al\u00e9m de <code>&lt;?php ... ?&gt;<\/code>, essas tags foram removidas no PHP 7. S\u00e3o elas:<\/p>\n<h3>PHP ASP Tags<\/h3>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">&lt;% \/\/Seu c\u00f3digo %&gt;<\/code><\/pre>\n<h3>PHP script tags<\/h3>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">&lt;script language=\"php\"&gt;\r\n  \/\/Seu c\u00f3digo\r\n&lt;\/script&gt;<\/code><\/pre>\n<p>Muitos desenvolvedores utilizam as tags estilo ASP para adicionar c\u00f3digo PHP dentro do template. Se voc\u00ea \u00e9 um desses, aproveite o momento e passe a utilizar as tags padr\u00f5es do PHP, para evitar problemas futuros na sua aplica\u00e7\u00e3o.<\/p>\n<p>Os dois c\u00f3digos a seguir mostram a impress\u00e3o de uma vari\u00e1vel usando &#8220;short tags&#8221;. O primeiro com as tags obsoletas e o segundo com a tag padr\u00e3o do PHP.<\/p>\n<p>C\u00f3digo desatualizado:<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">&lt;%= $minhaVarivel; %&gt;<\/code><\/pre>\n<p>C\u00f3digo atualizado:<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">&lt;?= $minhaVarivel; ?&gt;<\/code><\/pre>\n<h2>Switch com m\u00faltiplos &#8220;Defaults&#8221;<\/h2>\n<p>Durante a cria\u00e7\u00e3o das especifica\u00e7\u00f5es do PHP (PHP language spec) foi encontrado um bug, que permitia definir m\u00faltiplas cl\u00e1usulas &#8220;default&#8221; em um switch. E quando desse bug era explorado, somente o c\u00f3digo da \u00faltima cl\u00e1usula &#8220;default&#8221; declarada era executado.<\/p>\n<p>Para resolver esse problema, foi feita a corre\u00e7\u00e3o no PHP 7 e um erro fatal (fatal error) \u00e9 retornado sempre que o bug \u00e9 explorado.<\/p>\n<p>Fatal error: Switch statements may only contain one default clause<\/p>\n<p>POSIX &#8211; Express\u00f5es regulares compat\u00edveis<\/p>\n<p>Esse recurso foi marcado como obsoleto no PHP 5.3, e removido no PHP 7. Ele era muito utilizado para comparar strings. Veja a seguir a lista das fun\u00e7\u00f5es que foram removidas:<br \/>\n\u2022 <code>ereg()<\/code><br \/>\n\u2022 <code>eregi()<\/code><br \/>\n\u2022 <code>ereg_replace()<\/code><br \/>\n\u2022 <code>eregi_replace()<\/code><br \/>\n\u2022 <code>split()<\/code><br \/>\n\u2022 <code>spliti()<\/code><br \/>\n\u2022 <code>sql_regcase()<\/code><\/p>\n<p>Se ainda n\u00e3o migrou ap\u00f3s um per\u00edodo de seis anos da marca\u00e7\u00e3o como obsoletas, chegou a hora de migrar para a fam\u00edlia de fun\u00e7\u00f5es <code>preg_<\/code>. Veja no exemplo a seguir o uso da fun\u00e7\u00e3o <code>preg_eregi()<\/code>.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">\/\/Obsoleta\r\nereg('pattern', 'string');\r\n\/\/Atualizada\r\npreg_match('\/pattern\/', 'string');<\/code><\/pre>\n<p>Fam\u00edlia <code>preg_<\/code><br \/>\n\u2022 <code>preg_filter<\/code> \u2014 Executa uma busca usando express\u00e3o regular e substitui o conte\u00fado<br \/>\n\u2022 <code>preg_grep<\/code> \u2014 Retorna as entradas do array que combinaram com o padr\u00e3o<br \/>\n\u2022 <code>preg_last_error<\/code> \u2014 Retorna o c\u00f3digo de erro da \u00faltima regex PCRE executada<br \/>\n\u2022 <code>preg_match_all<\/code> \u2014 Executa uma busca usando express\u00e3o regular para uma correspond\u00eancia global<br \/>\n\u2022 <code>preg_match<\/code> \u2014 Executa uma busca usando express\u00e3o regular para uma correspond\u00eancia<br \/>\n\u2022 <code>preg_quote<\/code> \u2014 Adiciona escape em caracteres da express\u00e3o regular<br \/>\n\u2022 <code>preg_replace_callback_array<\/code> \u2014 Executa uma busca usando express\u00e3o regular e substitui o conte\u00fado usando uma fun\u00e7\u00e3o de callback<br \/>\n\u2022 <code>preg_replace_callback<\/code> \u2014 Executa uma busca usando express\u00e3o regular e modifica usando um callback<br \/>\n\u2022 <code>preg_replace<\/code> \u2014 Realiza uma pesquisa por uma express\u00e3o regular e a substitui.<br \/>\n\u2022 <code>preg_split<\/code> \u2014 Divide a string por uma express\u00e3o regular<\/p>\n<h2>Extens\u00e3o MySQL<\/h2>\n<p>A extens\u00e3o <code>ext\/mysql<\/code> foi marcada como obsoleta no PHP 5.5 e removida no PHP 7, e isso inclui todas as fun\u00e7\u00f5es <code>mysql_<\/code>.<\/p>\n<p>Se voc\u00ea ainda utiliza fun\u00e7\u00f5es <code>mysql_<\/code>, j\u00e1 \u00e9 hora de migrar para as fun\u00e7\u00f5es <code>mysqli_<\/code>, que s\u00e3o parte da extens\u00e3o <code>ext\/mysqli<\/code>. Em sua maioria, as fun\u00e7\u00f5es <code>mysqli_<\/code> s\u00e3o id\u00eanticas \u00e0s <code>mysql_<\/code>, exceto pelo sufixo i.<\/p>\n<p>Na maioria dos casos ser\u00e1 necess\u00e1rio mudar apenas o nome da fun\u00e7\u00f5es, e em mais ou menos 50% dos casos voc\u00ea precisar\u00e1 passar a conex\u00e3o com o banco de dados como par\u00e2metro na fun\u00e7\u00e3o como primeiro par\u00e2metro.<\/p>\n<p>Veja abaixo uma lista de fun\u00e7\u00f5es <code>mysql_<\/code> que n\u00e3o possuem equivalentes em <code>mysqli_<\/code>.<br \/>\n\u2022 <code>mysql_client_encoding()<\/code><br \/>\n\u2022 <code>mysql_list_dbs()<\/code> \u2014 use a query SHOW DATABASES<br \/>\n\u2022 <code>mysql_db_name()<\/code><br \/>\n\u2022 <code>mysql_list_fields()<\/code><br \/>\n\u2022 <code>mysql_db_query()<\/code><br \/>\n\u2022 <code>mysql_list_processes()<\/code> \u2014 use a query SHOW PROCESSLIST<br \/>\n\u2022 <code>mysql_dbname()<\/code><br \/>\n\u2022 <code>mysql_list_tables()<\/code> \u2014 use a query SHOW TABLES<br \/>\n\u2022 <code>mysql_field_flags()<\/code><br \/>\n\u2022 <code>mysql_listdbs()<\/code> \u2014 use a query SHOW DATABASES<br \/>\n\u2022 <code>mysql_field_len()<\/code><br \/>\n\u2022 <code>mysql_listfields()<\/code><br \/>\n\u2022 <code>mysql_field_name()<\/code><br \/>\n\u2022 <code>mysql_listtables()<\/code> \u2014 use a query SHOW TABLES<br \/>\n\u2022 <code>mysql_field_table()<\/code><br \/>\n\u2022 <code>mysql_numfields()<\/code><br \/>\n\u2022 <code>mysql_field_type()<\/code><br \/>\n\u2022 <code>mysql_numrows()<\/code> \u2014 use <code>mysqli_num_rows()<\/code><br \/>\n\u2022 <code>mysql_fieldflags()<\/code><br \/>\n\u2022 <code>mysql_pconnect()<\/code> \u2014 adicione p: ao nome do host passado para <code>mysqli_connect()<\/code><br \/>\n\u2022 <code>mysql_fieldlen()<\/code><br \/>\n\u2022 <code>mysql_result()<\/code><br \/>\n\u2022 <code>mysql_fieldname()<\/code><br \/>\n\u2022 <code>mysql_selectdb()<\/code> \u2014 use <code>mysqli_select_db()<\/code><br \/>\n\u2022 <code>mysql_fieldtable()<\/code><br \/>\n\u2022 <code>mysql_table_name()<\/code><br \/>\n\u2022 <code>mysql_fieldtype()<\/code><br \/>\n\u2022 <code>mysql_tablename()<\/code><br \/>\n\u2022 <code>mysql_freeresult()<\/code> \u2014 use <code>mysqli_free_result()<\/code><br \/>\n\u2022 <code>mysql_unbuffered_query()<\/code><\/p>\n<p>A seguir um exemplo de uso do mysqli_ para obten\u00e7\u00e3o de uma lista de dados na tabela agenda, tendo como par\u00e2metro para a consulta o nome.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">$nome = \\filter_var($_POST['nome'], FILTER_SANITIZE_EMAIL);\r\n$mysqli = new \\mysqli('localhost', 'teste', null, 'agenda');\r\nif (\\mysqli_connect_errno()) {\r\n  \/\/ Falha na conex\u00e3o\r\n}\r\n$sql = \"SELECT nome, email, telefone FROM registros WHERE nome = ?\";\r\n$query = $mysqli-&gt;prepare($sql);\r\n$query-&gt;bind_param('s', $nome);\r\n$result = $query-&gt;execute();\r\nif (!$result) {\r\n  return false;\r\n}\r\n$result = $query-&gt;fetch_result();\r\nwhile ($row = $result-&gt;fetch_object()) {\r\n  \/\/Interage atrav\u00e9s dos resultados retornados\r\n}<\/code><\/pre>\n<p>Al\u00e9m do <code>mysqli_<\/code> em substitui\u00e7\u00e3o ao <code>mysql_<\/code>, voc\u00ea pode utilizar a classe PDO, que permite conectar a uma boa variedade de bancos de dados, atrav\u00e9s de uma API consistente.<\/p>\n<p>Veja a seguir um exemplo de uso da classe PDO para executar a mesma opera\u00e7\u00e3o que foi feita no exemplo anterior, com <code>mysqli_<\/code>.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-php\">$nome = \\filter_var($_POST['nome'], FILTER_SANITIZE_EMAIL);\r\ntry {\r\n  $pdo = new \\PDO(\"mysql:host=localhost;dbname=agenda\", \"teste\");\r\n} catch (\\PDOException $e) {\r\n  \/\/ Falha na conex\u00e3o\r\n}\r\n$sql = \"SELECT nome, email, telefone FROM usuarios WHERE nome = :nome\";\r\n$values = [\":nome\" =&gt; $nome];\r\ntry {\r\n  $query = $pdo-&gt;prepare($sql);\r\n  $result = $query-&gt;execute($values);\r\n  if (!$result || $query-&gt;rowCount() == 0) {\r\n    return false;\r\n  }\r\n  foreach ($query-&gt;fetch(\\PDO::FETCH_OBJ) as $row) {\r\n    \/\/Interage atrav\u00e9s dos resultados retornados\r\n  }\r\n} catch (\\PDOException $e) {\r\n  \/\/ Ocorreu algum erro\r\n}<\/code><\/pre>\n<p>Esses foram apenas alguns dos recursos mais utilizados no PHP 5.x que foram removidos do PHP 7.<\/p>\n<p>Fique ligado aqui no blog, pois tem muito mais novidade sobre o PHP 7 a caminho.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>No PHP um recurso (feature) \u00e9 marcado como obsoleto (deprecated) para informar aos desenvolvedores que em uma vers\u00e3o futura esse recurso ser\u00e1 removido totalmente. Com isso, os desenvolvedores possuem tempo para migrar suas aplica\u00e7\u00f5es antes que elas comecem a apresentar erro por usar recursos obsoletos. Nos \u00faltimos releases do PHP 5.x v\u00e1rios recursos (features) foram [&hellip;]<\/p>\n","protected":false},"author":37,"featured_media":5612,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,23],"tags":[64,65,58,66,67],"class_list":["post-543","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-comunidade","category-dev","tag-extensao-mysql","tag-php-script-tags","tag-php7","tag-recursos-obsoletos","tag-recursos-php7"],"_links":{"self":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts\/543"}],"collection":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/users\/37"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/comments?post=543"}],"version-history":[{"count":0,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts\/543\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/media\/5612"}],"wp:attachment":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/media?parent=543"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/categories?post=543"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/tags?post=543"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}