11 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! :)

49 comentários.

  • Wellington

    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

  • Davi Ferreira

    26/10/2009
    08:37

    Davi Ferreira escreveu:

    Show de bola a dica do Leo, não conhecia. Valeu, Wellington!

    Responder

  • Julio Fagundes

    16/09/2010
    16:29

    Julio Fagundes escreveu:

    Só por curiosidade mesmo, pois no seu artigo você esclarece que é para strings, mas pra complementar sobre o uso dela é que não funcionam com inteiros. Um exemplo onde não funcionaria: <?php $senha = 12345678901234; if( !isset( $senha[5] ) ) { echo 'Sua senha deve possuir no mínimo 6 caracteres!'; } Nesse codigo acima, a mensagem de alerta será exibida.

    Responder

  • Nil Tojal

    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

  • Davi Ferreira

    26/10/2009
    14:12

    Davi Ferreira escreveu:

    Fala Nil! É simplesmente não fechar o PHP quando o arquivo for só PHP. Por exemplo: Vira:

    Responder

  • Fernando Medeiros

    12/01/2010
    12:02

    Fernando Medeiros escreveu:

    Davi, por mais que não seja necessário, creio que é interessante fechar todas as tags.

    Responder

  • Kleber Cioccari

    27/06/2011
    22:38

    Kleber Cioccari escreveu:

    Fazendo uma adição à resposta do Davi:

    Vale alertar que o arquivo TODO tem que ser php sem saidas em HTML.

    De acordo com a ZEND, não fechar as tags faz parte da segurança, evitando injeção de código no final do arquivo. (Acredito que todos os frameworks não fechem seus arquivos .php)

    Parece que o interpretador mesmo mata a execução do
    script no final do arquivo (EOF).

    Se não me engano nas boas práticas do PHP eles encorajam a não fechar. Vou até dar uma pesquisas sobre..rss

    No drupal é opcional conforme documentação (http://drupal.org/coding-standards#phptags).

    Abraçoosss

    Responder

  • Gabriel Vítor

    21/09/2011
    14:35

    Gabriel Vítor escreveu:

    É isso mesmo Kleber, trata-se de uma boa prática o não fechamento da tag php em arquivos somente php,como você disse evita um monte de problemas futuros. \o/

    Responder

  • Renan Lima

    27/10/2009
    09:55

    Renan Lima escreveu:

    Ótimo post!

    Responder

  • Cléber

    28/10/2009
    15:35

    Cléber escreveu:

    Ô, cara, muito 10 esse post! Parabéns!

    Responder

  • Francisco

    02/11/2009
    12:00

    Francisco escreveu:

    Ótimo post, tanto q até retuitei. T+

    Responder

  • Anarquista

    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

  • André D. Molin

    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

  • Davi Ferreira

    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

  • Ricardo Martins

    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

  • Davi Ferreira

    07/06/2010
    10:40

    Davi Ferreira escreveu:

    Show de bola, não conhecia essa do operador =! :)

    Responder

  • Felipe

    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

  • Felipe

    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

  • Felipe

    24/06/2010
    05:01

    Felipe escreveu:

    Mt bom o post ... Parabéns

    Responder

  • Davi Ferreira

    24/06/2010
    09:59

    Davi Ferreira escreveu:

    Fala, Felipe! Tem razão, cara, viajei! :) Valeu a correção!

    Responder

  • Renato Paiva

    01/03/2011
    10:57

    Renato Paiva escreveu:

    Cara, sua dica foi show de bola, só uso assim agora. ;)

    Responder

  • C.Lopes

    19/05/2011
    14:44

    C.Lopes escreveu:

    Já ando a muitos anos a «virar frangos»... e essa não tinha conhecimento. Valeu.

    Responder

  • Anderson

    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

  • Sérgio Mandrake

    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

  • Davi Ferreira

    30/08/2010
    13:46

    Davi Ferreira escreveu:

    Corrigido, Sérgio, valeu! :)

    Responder

  • Paulo

    11/09/2010
    11:39

    Paulo escreveu:

    Cara pelo post, parabéns . to começando agora a programar php ,e este me ajudou muito, valeu.

    Responder

  • Tutorial City

    18/09/2010
    06:31

    Tutorial City escreveu:

    Não sou muito fã do estilo #9 , prefiro escrever o HTML por si só, e abrir as tags de php só onde for utilizar php de verdade.

    Responder

  • Fonor

    26/10/2010
    13:07

    Fonor escreveu:

    olá amigo, muito boa as dicas, sinceramente não conhecia quase tenhuma, porém gostaria de saber uma coisa, é possível testar todo um vetor através do isset? por exemplo, gostaria de saber se existe a posição 10 em diante, e qual a última, existe algo automático?

    Responder

  • valmir

    14/12/2010
    04:50

    valmir escreveu:

    parabens, eu ja a tempo mecho com php, nao tinha visto esta coisas simples que sao de grande ajuda, muito interesante

    Responder

  • Geonemeis

    14/01/2011
    19:51

    Geonemeis escreveu:

    Kara muito legal, vlw pelas dicas, realmente me ajudou muito

    Responder

  • Eric Platas

    28/01/2011
    12:03

    Eric Platas escreveu:

    Todas as dicas são muito uteis, legal msm, como sugestão adicionar o Heredoc que ja foi citado no item 9 pq ele salva vidas as vezes e tb a normalização de caracteres como " = \" e $ = \$, pq isso da um trampo e a gente acaba sujando o codigo pra contorna isso concatenando...

    Responder

  • Eric Platas

    28/01/2011
    12:07

    Eric Platas escreveu:

    Outra dica de funcao que a gente sempre esquece é criaçao de variavel dinamicamente: ex. $nome_da_variavel = dicas; $$nome_da_variavel = "Criacao de variaveis dinamicas"; echo $dicas; // retorna "Criacao de variaveis dinamicas"

    Responder

  • Raphael Nunes

    02/02/2011
    10:42

    Raphael Nunes escreveu:

    Muito bom o post e o comentários, parabéns.

    Responder

  • Schubert

    10/03/2011
    14:44

    Schubert escreveu:

    Hola amigo muy buena tu informacion,felicitaciones.

    Responder

  • Marcos Junior

    14/04/2011
    07:49

    Marcos Junior escreveu:

    Parabéns pelo post... ótimas dicas.. muito úteis...

    Responder

  • Luis

    14/04/2011
    07:49

    Luis escreveu:

    Muito boa essas dicas, vão ajudar bastante, o fato é que essas coisas estão todas na documentação mas infelizmente nem sempre lemos, mas obrigado pelas dicas.

    Responder

  • Guilherme Pontes

    14/04/2011
    08:07

    Guilherme Pontes escreveu:

    Olá amigo, tem um jeito bem fácil de descobrir se um número é par ou impar. Olhe: <?php $n = 5; echo ($n & 1) ? "ímpar" : "par"; ?>

    Responder

  • Davi Ferreira

    14/04/2011
    08:27

    Davi Ferreira escreveu:

    Show de bola, Guilherme, valeu! Pra quem quiser entender: http://stackoverflow.com/questions/600202/understanding-phps-operator P.S. Bem legal seu portfolio :)

    Responder

  • Rafael Queiroz

    14/04/2011
    08:32

    Rafael Queiroz escreveu:

    Muitas Gafes aqui...

    Responder

  • Sandra Rodrigues

    28/06/2011
    18:53

    Sandra Rodrigues escreveu:

    Por favor, alguém me pode ajudar?
    estou com uma duvida enorma e é urgente ! no login , em php , se eu registar na minha base de dados o login como "Tânia" e inserirmos na caiza de login sem acento ele aceita na mesma , como podemos resolver essa situação ? ja coloquei === mas mesmo assim não dá.

    Responder

  • Davi Ferreira

    28/06/2011
    18:59

    Davi Ferreira escreveu:

    Oi, Sandra,

    na verdade esse "problema" é do MySQL e não do PHP. Você precisa utilizar na sua tabela uma collation que diferencia acentos, por exemplo: UNICODE_CI_AI (o A significa os acentos e o I insensitive pra maiúscula/minúscula).

    Responder

  • Paulo Taneda

    16/08/2011
    16:17

    Paulo Taneda escreveu:

    Excelentes dicas, muito úteis.

    Responder

  • André Luna

    10/09/2011
    00:00

    André Luna escreveu:

    Mais uma dica simples,
    para da "echo" principalmente quando se precisa fazer isso dentro do html pode ser usado também dessa forma:

    Ex:

    <?php = "mensagem aqui"; ?>

    <?php = É a mesma coisa que "echo".

    Responder

  • danilo

    21/11/2011
    22:45

    danilo escreveu:

    Muito boas as dicas agora na nova versão do php vai dar para pegar mais coisas principalmente em ifs valeu!!

    Responder

  • Adriel Esteves

    10/12/2011
    02:35

    Adriel Esteves escreveu:

    Interessante a verificação de par ou ímpar do Guilherme Pontes. Por tratar-se de operações bit-a-bit que são executadas no nível binário (low level) os cálculos são feitos com menos recursos gerando maior velocidade de resposta.

    Responder

  • Adriel Esteves

    10/12/2011
    02:56

    Adriel Esteves escreveu:

    Considerando o que Guilherme Pontes disse poderíamos refazer a dica 8 da seguinte maneira:
    for( $i = 0; $i <= 10; $i++ ) echo '<li class="', ($i & 1) ? 'normal' : 'alt', '">teste</li>'

    Responder

  • Adriel Esteves

    17/12/2011
    19:50

    Adriel Esteves escreveu:

    É importante notar que no algoritmo acima a tag li não foi fechada; falta que parece ser corrigida pelo browser.

    Também é interessante verificar que a dupla aspas depois da palavra teste parece incorreta para os propósitos da codificação; inclusive na dica 8 (observe que a aspas dupla é aberta antes do nome da class e fechada logo depois).

    Responder

  • Davi Ferreira

    20/12/2011
    09:17

    Davi Ferreira escreveu:

    Oi Adriel,
    realmente o sistema de comentários está com problemas pro código, depois vejo com calma, espero que esteja certinho agora.

    Valeu a colaboração :)

    Responder

  • Adriel Esteves

    25/12/2011
    14:25

    Adriel Esteves escreveu:

    Olá Davi,
    Achei seu post ótimo. Inclusive coloquei nos meus favoritos numa pasta de desenvolvimento em PHP. Parabéns.

    Responder

Deixe seu comentário:

(Seu e-mail não será divulgado - serve apenas para validação e gravatar.)

(Tags HTML permitidas: <strong> <em> <code> <a>)

Ir para a capa do blog Publicado há mais de 2 anos, com 49 comentários.