23 de outubro de 2009
2011 dicas de PHP que talvez você não conheça
Você sabia que a função isset(), em alguns casos, pode substituir a strlen()? Que o "?>" no final dos arquivos PHP é opcional? E que, a partir do PHP 5, é possível encadear métodos de uma classe?
Confira 11 dicas de PHP que talvez você não conheça.
1. Utilize os operadores === e !==
Essa muita gente desconhece e pode evitar muito tempo perdido com debug. Algumas funções do PHP retornam tanto um valor booleano como um valor inteiro, principalmente funções que tratam strings. E no caso de você querer verificar se a função retornou false e a mesma retornar 0. Como vocês sabem, 0 e false no PHP, em uma condicinal, significam a mesma coisa. Para esses casos, utilizamos os operadores === e !==. Esses operadores comparativos retornam true apenas quando os valores comparados são iguais e do mesmo tipo.
function validaUrl( $url ) {
$pos = strpos( $url, 'http://' );
if( $pos === false ) $url = 'http://' . $url;
return $url;
}
echo validaUrl( 'www.daviferreira.com' );
echo validaUrl( 'http://www.apple.com' );
2. isset() brincando de strlen()
Aprendi faz pouco tempo, mas já a utilizo bastante. Primeiro porque, para verificar o tamanho de uma string, função isset é aproximadamente cinco vezes mais rápida do que a strlen. E segundo porque, caso a variável não exista, isset ainda funciona enquanto que strlen retornaria um erro.
if( !isset( $senha[5] ) ) {
echo 'Sua senha deve possuir no mínimo 6 caracteres!';
}
UPDATE: Mais informações nesse link - dica do leitor André Molin.
3. Evitando aquele maldito erro dos Ifs
Sabe quando você esquece um sinal de igual usando if. Por exemplo: if( x = 1 ). Este exemplo retornaria sempre true e o PHP não acusaria nenhum erro. Existe uma maneira fácil de resolver isso, simplesmente mudar a variável de posição, como no exemplo abaixo. Neste caso, um if( 1 = x ) resultaria em erro.
if ( 5 == $area ) {
echo 'Você está no menu 5.';
}
4. Zeros à esquerda (e à direita também!)
Utilizo muito essa dica em sistemas de cadastro de produtos, com códigos internos da loja. Geralmente o cliente pede para preencher o número com zeros ou algum outro caractere somente para impressão. A função str_pad faz isso pra gente. Ela recebe quatro parâmetros: a string a ser preenchida, o número de espaços a serem preenchidos, o caractere utilizado no preenchimento e a posição (LEFT, RIGHT ou BOTH - esquerda, direita ou ambos). No caso do número de espaços ser menor do que o tamanho da string, a função não faz nada.
echo str_pad( '9', 10, '0', STR_PAD_LEFT ); // 0000000009
5. Com vocês, a função list()
Ah, não sei porque vivo esquecendo esta função! Talvez porque a maneira como é chamada seja pouco intuitiva. A falta de padrão no PHP é irritante às vezes (strpos e str_pad, por exemplo). Enfim, o que ela faz é pegar os valores de um array e criar variáveis com eles.
$localizacao = array( 'Brasil', 'RJ', 'Rio de Janeiro', 'Centro' ); $list( $pais, $estado, $cidade, $bairro ) = $localizacao; // índices não-numéricos $bd_config = array(); $bd_config['usuario'] = 'root'; $bd_config['senha'] = 'root'; $bd_config['banco'] = 'teste'; list( $usuario, $senha, $banco ) = array_values( $bd_config );
6. Esqueça (de vez) o '?>' no final dos arquivos
É isso mesmo! O "?>" no final dos arquivos PHP é desnecessário. E você deveria parar de utilizá-lo. Utilizando o fechamento, qualquer espaço em branco ou caractere estranho poderá gerar um erro no browser, no conteúdo exibido. Sem o fechamento seria retornado um erro pelo parser do PHP.
7. Métodos em cadeia
Desde o lançamento da versão 5 do PHP com melhorias na orientação a objetos é possível encadear métodos de uma classe. Para funcionar, essa dica necessita que seu método retorne um objeto. No exemplo abaixo, através do encadeamento de métodos o sistema valida o login de um usuário.
class usuarios {
var $email;
var $senha;
var $erro;
function __construct( $email, $senha ) {
$this->email = $email;
$this->senha = $senha;
$this->erro = NULL;
}
function criticaDados() {
if( !$this->email ) $this->erro ='E-mail inválido';
elseif( !isset( $this->senha[6] ) ) $this->erro = 'Senha inválida';
return $this;
}
function login() {
if( is_null( $this->erro ) ) {
return true;
} else {
return $this->erro;
}
}
}
$oUsuario->criticaDados()->login();
8. Par ou ímpar?
Tá bom, pode ser boba, mas em alguns casos é muito útil. O operador matemático % retorna o resto de uma divisão, portanto, podemos utilizá-lo para descobrir se um número é par ou ímpar. No exemplo abaixo, é gerada uma lista HTML alternando a classe dos ítens.
$count = 1;
for( $i = 0; $i < = 10; $i++ ) {
if( $count%2 ) {
$classe = 'normal';
} else {
$classe = 'alt';
}
echo '<li class="' , $classe, '">teste</li>"';
$count++;
}
9. echo 'Olá', 'Mundo';
Além de ficar mais bonito esteticamente, esse método pouco utilizado de concatenamento da função echo é tambem mais rápido em termos de performance do que o tradicional concatenamento com pontos.
echo '<table class="resultado">',
'<tr>',
'<td>' . $cidade. '</td>',
'<td>' . $estado . '</td>',
'<td>' . $pais . '</td>',
'</tr>',
'</table>';
10. Ordenando arrays por um índice
O PHP possui algumas funções nativas para ordenamento de arrays simples, mas e se for preciso ordenar por um índice específico em um array um pouquinho mais complexo? Pra esses casos existe a função usort. O que ela faz é ordenar um vetor utilizando uma função comparativa personalizada. Por exemplo, supondo que temos um array de um ranking, que registra o nome e os pontos dos competidores. Pra ordenar pelo índice 'pontos', basta criar uma função para comparar os valores de dois cadastros diferentes e passá-la como parâmetro da função usort (note que o nome é passado como string).
function ordenaPontos( $a, $b ) {
if ( $a['pontos'] == $b['pontos'] ) {
return 0;
}
return ( $a['pontos'] < $b['pontos'] ) ? -1 : 1;
}
$ranking = array(
0 => array( 'nome' => 'Davi', 'pontos' => 2 ),
1 => array( 'nome' => 'Letícia', 'pontos' => 4 ),
2 => array( 'nome' => 'Francisco', 'pontos' => 1 ),
3 => array( 'nome' => 'Cecília', 'pontos' => 3 ),
)
usort( $ranking, 'ordenaPontos' );
No exemplo acima, preste atenção em uma outra pequena dica: eu sempre costumo deixar uma vírgula no último índice do array. Isso evita esquecê-la quando é adicionado um novo registro.
11. Substituindo a primeira ocorrência de uma string
As funções de substituição de strings, normais ou com expressões regulares, todo mundo conhece. Mas e se quisermos substituir apenas a primeira ocorrência de um determinado termo? A função preg_replace possui um quarto parâmetro que resolve esse problema. Ele funciona como um contador e irá substituir, como limite máximo, o valor especificado. (Ainda existe um quinto parâmetro, uma variável para armazenar a quantidade de termos substituídos)
$string = 'teste string de teste'; echo preg_replace( '/teste/', 'teste2', $string, 1 ); // 'teste2 string de teste'
Essas foram minhas 11 dicas de PHP. Por favor, tenham em mente que os exemplos utilizados são bem simples. Fiquem à vontade para enviar qualquer correção ou sugestões para melhor execução dos exemplos apresentados acima. E, caso você tenha alguma outra dica bacana, não deixe de compartilhar! Só não vale gambiarra! :)
20 leitores comentaram este artigo
24/10/2009
17:25
Wellington escreveu:
Não sei se a galera sabe, mas:
A função strlen() funciona muito bem para encoding iso-8859-1 ou quando a string não tem acentuação. Ou seja, quando a string tem um caracter acentuado a função retorna um strlen maior do que realmente deveria.
Meu amigo Leo Caseiro fez um post sobre isso:
http://leocaseiro.com.br/erro-ao-contar-caracteres-com-strlen/
Responder
26/10/2009
08:37
Davi Ferreira escreveu:
Show de bola a dica do Leo, não conhecia.
Valeu, Wellington!
Responder
26/10/2009
12:19
Nil Tojal escreveu:
Cara eu não entendi esse item de sua dica. :(
6. Esqueça (de vez) o '?>' no final dos arquivos
É isso mesmo! O "?>" no final dos arquivos PHP é desnecessário. E você deveria parar de utilizá-lo. Utilizando o fechamento, qualquer espaço em branco ou caractere estranho poderá gerar um erro no browser, no conteúdo exibido. Sem o fechamento seria retornado um erro pelo parser do PHP.
Responder
26/10/2009
14:12
Davi Ferreira escreveu:
Fala Nil!
É simplesmente não fechar o PHP quando o arquivo for só PHP.
Por exemplo:
< ?php
echo 'teste';
exit;
?>
Vira:
< ?php
echo 'teste';
exit;
Responder
27/10/2009
09:55
Renan Lima escreveu:
Ótimo post!
Responder
28/10/2009
15:35
Cléber escreveu:
Ô, cara, muito 10 esse post! Parabéns!
Responder
02/11/2009
12:00
Francisco escreveu:
Ótimo post, tanto q até retuitei. T+
Responder
14/04/2010
11:11
Anarquista escreveu:
sinceramente eu separo o HTML do PHP... algo como:
A performance tb é rápida e fica mais fácil do webdesigner mexer no site sem destruir o seu sistema...
abs
Responder
06/06/2010
18:24
André D. Molin escreveu:
Muito bom Davi, essas dicas ajudam muito o pessoal.
Caso você queira, vou deixar alguma(s) dica(s) aqui para você incluir no post.
- Função glob() => http://br.php.net/manual/pt_BR/function.glob.php
- Na 2º dica, incluir um link de referencia => http://php.net/manual/pt_BR/language.types.string.php#language.types.string.substr
- Na dica 9 eu sugiro a utilização da sintaxe HEREDOC => http://www.php.net/manual/pt_BR/language.types.string.php#language.types.string.syntax.heredoc
- Na 6º dica acho que você fui muito cruel hehe. A tag de fechamento deve ser omitida apenas quando o arquivo contem apenas código PHP, e da maneira como disse parece que é em qualquer situação, nunca mais utilizar a tag de fechamento. Alguem menos experiente (que mistura PHP com HTML e etc) pode fazer isso e ter problemas.
Bom, é isso ai. Mais uma vez queria dizer que seu post está muito legal, com certeza ajuda muitas pessoas.
Abraços a todos!
Responder
07/06/2010
10:42
Davi Ferreira escreveu:
Valeu, André.
Gostei das dicas. Realmente a 6 deixou um monte de gente confusa :)
Não conhecia o heredoc, vou atualizar o artigo mais tarde. E a função glob() é bem legal mesmo, descobri recentemente.
Responder
07/06/2010
03:56
Ricardo Martins escreveu:
Muito bom o post Davi.
Só melhoraria a dica 8.
Pra fazer alternacao de style entre linhas vc podia fazer algo do tipo:
<?php
$cor = true;
?>
<li class="<?php echo ($cor=!$cor)?'normal':'alt'?>">
é =! mesmo, e nao !=.
Abraços!
Responder
07/06/2010
10:40
Davi Ferreira escreveu:
Show de bola, não conhecia essa do operador =! :)
Responder
24/06/2010
04:52
Felipe escreveu:
=! não é operador, isso em $cor = !$cor é atribuição dele mesmo negado para alternar entre falso e verdadeiro a cada iteração dentro do operador ternário ...
Responder
24/06/2010
04:54
Felipe escreveu:
Complementando, digamos que ($cor=!$cor)?'normal':'alt' esteja dentro de um loop a cada iteração $cor vai alternar de falso para verdadeiro e vice versa ...
Responder
24/06/2010
05:01
Felipe escreveu:
Mt bom o post ... Parabéns
Responder
24/06/2010
09:59
Davi Ferreira escreveu:
Fala, Felipe!
Tem razão, cara, viajei! :)
Valeu a correção!
Responder
12/07/2010
14:03
Anderson escreveu:
Infelizmente o pessoal do PHP tornou obsoleto utilizar $varString{1}. Utilizar colchetes $varString[1] gera confusão com vetores.
Responder
30/08/2010
13:23
Sérgio Mandrake escreveu:
Tá errado o if sobre isset
Se minha senha for $senha = 'sergio'; com strlen retorna 6 e se digitar echo $senha[6] vai retonar false, pois começa a contar no 0
Então if (!isset($senha[5])) é o correto
Responder
30/08/2010
13:46
Davi Ferreira escreveu:
Corrigido, Sérgio, valeu! :)
Responder
Deixe seu comentário