#2 PHP 7 – Recursos Obsoletos

No PHP um recurso (feature) é marcado como obsoleto (deprecated) para informar aos desenvolvedores que em uma versão futura esse recurso será removido totalmente. Com isso, os desenvolvedores possuem tempo para migrar suas aplicações antes que elas comecem a apresentar erro por usar recursos obsoletos.

Nos últimos releases do PHP 5.x vários recursos (features) foram marcados como obsoletos (deprecated), e esses recursos foram removidos no PHP 7. Nesse artigo apresento um pouco do que foi removido.

No PHP, sempre que um desenvolvedor faz uso de um recurso marcado como “deprecated”, ele recebe um erro E_DEPRECATED.

Tags Alternativas

Alguns desenvolvedores podem desconhecer esse recurso, mas o PHP possui tags alternativas além de <?php ... ?>, essas tags foram removidas no PHP 7. São elas:

PHP ASP Tags

<% //Seu código %>

PHP script tags

<script language="php">
  //Seu código
</script>

Muitos desenvolvedores utilizam as tags estilo ASP para adicionar código PHP dentro do template. Se você é um desses, aproveite o momento e passe a utilizar as tags padrões do PHP, para evitar problemas futuros na sua aplicação.

Os dois códigos a seguir mostram a impressão de uma variável usando “short tags”. O primeiro com as tags obsoletas e o segundo com a tag padrão do PHP.

Código desatualizado:

<%= $minhaVarivel; %>

Código atualizado:

<?= $minhaVarivel; ?>

Switch com múltiplos “Defaults”

Durante a criação das especificações do PHP (PHP language spec) foi encontrado um bug, que permitia definir múltiplas cláusulas “default” em um switch. E quando desse bug era explorado, somente o código da última cláusula “default” declarada era executado.

Para resolver esse problema, foi feita a correção no PHP 7 e um erro fatal (fatal error) é retornado sempre que o bug é explorado.

Fatal error: Switch statements may only contain one default
clause

POSIX – Expressões regulares compatíveis

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ções que foram removidas:

ereg()
eregi()
ereg_replace()
eregi_replace()
split()
spliti()
sql_regcase()

Se ainda não migrou após um período de seis anos da marcação como obsoletas, chegou a hora de migrar para a família de funções preg_. Veja no exemplo a seguir o uso da função preg_eregi().

//Obsoleta
ereg('pattern', 'string');

//Atualizada
preg_match('/pattern/', 'string');

Família preg_

preg_filter — Executa uma busca usando expressão regular e substitui o conteúdo
preg_grep — Retorna as entradas do array que combinaram com o padrão
preg_last_error — Retorna o código de erro da última regex PCRE executada
preg_match_all — Executa uma busca usando expressão regular para uma correspondência global
preg_match — Executa uma busca usando expressão regular para uma correspondência
preg_quote — Adiciona escape em caracteres da expressão regular
preg_replace_callback_array — Executa uma busca usando expressão regular e substitui o conteúdo usando uma função de callback
preg_replace_callback — Executa uma busca usando expressão regular e modifica usando um callback
preg_replace — Realiza uma pesquisa por uma expressão regular e a substitui.
preg_split — Divide a string por uma expressão regular

Extensão MySQL

A extensão ext/mysql foi marcada como obsoleta no PHP 5.5 e removida no PHP 7, e isso inclui todas as funções mysql_.

Se você ainda utiliza funções mysql_, já é hora de migrar para as funções mysqli_, que são parte da extensão ext/mysqli. Em sua maioria, as funções mysqli_ são idênticas às mysql_, exceto pelo sufixo i.

Na maioria dos casos será necessário mudar apenas o nome da funções, e em mais ou menos 50% dos casos você precisará passar a conexão com o banco de dados como parâmetro na função como primeiro parâmetro.

Veja abaixo uma lista de funções mysql_ que não possuem equivalentes em mysqli_.

mysql_client_encoding()
mysql_list_dbs() — use a query SHOW DATABASES
mysql_db_name()
mysql_list_fields()
mysql_db_query()
mysql_list_processes() — use a query SHOW PROCESSLIST
mysql_dbname()
mysql_list_tables() — use a query SHOW TABLES
mysql_field_flags()
mysql_listdbs() — use a query SHOW DATABASES
mysql_field_len()
mysql_listfields()
mysql_field_name()
mysql_listtables() — use a query SHOW TABLES
mysql_field_table()
mysql_numfields()
mysql_field_type()
mysql_numrows() — use mysqli_num_rows()
mysql_fieldflags()
mysql_pconnect() — adicione p: ao nome do host passado para mysqli_connect()
mysql_fieldlen()
mysql_result()
mysql_fieldname()
mysql_selectdb() — use mysqli_select_db()
mysql_fieldtable()
mysql_table_name()
mysql_fieldtype()
mysql_tablename()
mysql_freeresult() — use mysqli_free_result()
mysql_unbuffered_query()

A seguir um exemplo de uso do mysqli_ para obtenção de uma lista de dados na tabela agenda, tendo como parâmetro para a consulta o nome.

$nome = \filter_var($_POST['nome'], FILTER_SANITIZE_EMAIL);
$mysqli = new \mysqli('localhost', 'teste', null, 'agenda');

if (\mysqli_connect_errno()) {
  // Falha na conexão
}

$sql = "SELECT nome, email, telefone FROM registros WHERE nome = ?";
$query = $mysqli->prepare($sql);
$query->bind_param('s', $nome);
$result = $query->execute();

if (!$result) {
  return false;
}

$result = $query->fetch_result();

while ($row = $result->fetch_object()) {
  //Interage através dos resultados retornados
}

Além do mysqli_ em substituição ao mysql_, você pode utilizar a classe PDO, que permite conectar a uma boa variedade de bancos de dados, através de uma API consistente.

Veja a seguir um exemplo de uso da classe PDO para executar a mesma operação que foi feita no exemplo anterior, com mysqli_.

$nome = \filter_var($_POST['nome'], FILTER_SANITIZE_EMAIL);

try {
  $pdo = new \PDO("mysql:host=localhost;dbname=agenda", "teste");
} catch (\PDOException $e) {
  // Falha na conexão
}

$sql = "SELECT nome, email, telefone FROM usuarios WHERE nome = :nome";
$values = [":nome" => $nome];
try {
  $query = $pdo->prepare($sql);
  $result = $query->execute($values);

  if (!$result || $query->rowCount() == 0) {
    return false;
  }

  foreach ($query->fetch(\PDO::FETCH_OBJ) as $row) {
    //Interage através dos resultados retornados
  }
} catch (\PDOException $e) {
  // Ocorreu algum erro
}

Esses foram apenas alguns dos recursos mais utilizados no PHP 5.x que foram removidos do PHP 7.

Fique ligado aqui no blog, pois tem muito mais novidade sobre o PHP 7 a caminho.

  • Frank Sousa

    Obrigado pelo post! 😀

  • ZWGTRON Hacker

    Muito Bom

  • João Paulo Dias Fernandes

    Obrigado pelo Post 😀

  • Lucas Müller

    Ótimo post, ótimo serviço. Me cadastrei hoje e já tenho crédito grátis para hospedagem até o ano que vem. Parabéns.

  • Jader Vinícios Vieira

    Ótimo post, ótimo serviço. Me cadastrei hoje e já tenho crédito grátis para hospedagem até o ano que vem. Parabéns.²

  • Douglas Gonçalves

    Bha Show de Bola este Post!