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.
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.