+2

Array para solucionar as dores de cabeça na vida de um programador.

criado por João K. em 25/10/2003 7:50pm
Estava diante do micro com a tarefa de atualizar o código PHP de um script feito tempos atrás, na verdade realidade mais de 1 ano.

A primeira coisa que fiz foi abrir o meu bom editor de php para começar o meu trabalho de atualização.

Nossa! Quando abri o arquivo qual não foi a surpresa ao ver que meu estilo de programação tinha evoluido tanto durante este intervalo de tempo.

Re-escrendo funções, criando outras novas e assim foi o trabalho...

Este trabalho durou muito mais tempo do que imaginava pois não foi uma simples atualização de funções mas uma mudança total de como o script funcionava. Um trabalho árduo, cujas lições que aprendi, gostaria de compartilhar com os novos programadores para facilitar a não cometer os mesmos "erros" de programação que fiz e que se tornaram a razão do meu pesadelo no processo de upgrade do script.

Uma das especificidades do meu script: Ela foi desenvolvida com o objetivo de ser utilizado em outras línguas e outros sites. Então a idéia era para ser bastante flexível e de fácil adaptação.

Vamos pegar por exemplo este pequeno pedaço de código para demostrar o que eu quero dizer. ( Traduzi todos os nomes de variáveis e da função para o portugues, originalmente estava em inglês )

<?php
function criar_html($caminho_ate_arquivo='') 
{
    global $NomeDoSite, $UrlDoSite, $ConfigPermiteImagem, $UrlParaDirDeImagens, $MensagemImagem, $MensagemNenhum; 

    if ($ConfigPermiteImagem !="Y") { // Permitir mostrar código HTML ?
        $caminho_ate_arquivo = '';
    }

    if (eregi('http://', $caminho_ate_arquivo) ) { // o endereço é um URL
        $url_para_arquivo = $caminho_ate_arquivo;
    } else {
        $url_para_arquivo = $UrlParaDirDeImagens.'/'.$caminho_ate_arquivo;
    }

    if (!empty($caminho_ate_arquivo)) {
        $html = "<a href='$SiteURL'><img src='$url_para_arquivo' border='0' alt='$MensagemImagem : $NomeDoSite'></a>";
    } else {
        $html = '';
    }

    return $html;
}
?>

Esta função tinha o objetivo de retornar o código TAG HTML para imagem para um endereço que eu fosse fornecido. Caso na configurações do programa eu selecionasse para não permitir imagem então nenhum código seria retornado. Bom, olhando para o código fica mais fácil entender do que eu escrevendo aqui.

A lição:

A quantidade mudanças possíveis aqui é imensa, mas mostrarem as mudanças mais significativas aqui. Vamos mostrar como a função atualizada ficou.

<?php
function criar_html($caminho_ate_arquivo='') 
{
    global $cfg, $msg; 
    if ($cfg['permissao_imagem'] == 0) { // Permitir mostrar código HTML ?
        $caminho_ate_arquivo = '';
    }

    if (eregi('http://', $caminho_ate_arquivo) ) {  
        $url_para_arquivo = $caminho_ate_arquivo;
    } else {
        $url_para_arquivo = $cfg['url_dir_imagens'] .'/'. $caminho_ate_arquivo;
    }

    if(!empty($arquivo)) {
        $html = "<a href='". $cfg['url_site'] ."'><img src='". $url_para_arquivo ."' border='0' alt='". $msg['imagem'] .' : '. $cfg['site_nome'] . "'></a>";
    } else {
        $html = '';
    }

    return $html;
}
?>

A GRANDE MUDANÇA:

DE:
global $NomeDoSite, $UrlDoSite, $ConfigPermiteImagem, $UrlParaDirDeImagens, $MensagemImagem, $MensagemNenhum;

PARA:
global $cfg, $msg;

O que fiz aqui basicamente foi agrupar todas as variáveis das configurações dentro de uma única array chamado $cfg e das mensagens de textos dentro da array $msg.


O motivo desta mudança:

Facilitar o acesso a TODAS variáveis dentro da função. Caso adicionasse uma nova variável de configuração no programa, não seria necessário acrescentar mais uma variável a lista global. Imagine se você incluisse uma nova variável de configurações e que quisesse utilizar ela nesta função. No antigo estilo de programação seria necessário adicionar essa variável a lista global.

Se você está constantemente atualizando o seu script isso irá poupar muito trabalho extra.

DE:
$html = "<a href='$SiteURL'>";

PARA:
$html = "<a href='". $cfg['url_site'] ."'>";

Alguns poderiam pensar em utilizar o seguinte formato para declarar a variável $cfg['url_site'] desta maneira:

$html = "<a href='$cfg[url_site]'>";

Talvez esteja se pergunta do porquê não fazer desta maneira? Já que iria poupar algumas tecladas a mais?

As razão:

- Caso no futuro você quisesse alterar todas as variavéis chamado $cfg['url_site'] para $cfg['url_do_site'] bastaria utilizar a ferramente de SUBSITUTIR POR, que todos os programas para editar HTML possui, para realizar essa operação rapidamente. Caso não utilize esta sintaxe, você irá ter o dobro do trabalho porque irá fazer uma substituição dos $cfg[url_site] e também do $cfg['url_site'].

- Outro motivo de utilizar ARRAY para armazenar as variávies é para prevenir possíveis erros no processo de achar/editar/deletar essas variávies. Porque constantemente alteramos os nomes das variavéis por infinitas razões.

Por exemplo: Se você desejasse substituir as variáveis $URLSite para $cfg['url_site'] MAS houvesse um variável chamada $URLSiteImages você iria acabar tendo uma substituição como $cfg['url_site']Images e o seu programa apresentaria erro.

Tomara que este pequeno artigo ajude os novos programadores de PHP.
Longa vida ao PHP!

Comentários:

Mostrando 1 - 7 de 7 comentários
for ($x=0;$x<2;x++){
for ($y=0;$y<3;y++){
array[$x][$y]='teste';
}
}

Me desculpe se não eh essa a pergunta... como disse sou iniciante... se eu entendi errado vocês poderiam me explicar melhor?
04/09/2005 8:44pm (~18 anos atrás)

Gostaria que alguém postasse um exemplo de como gerar arrays dinamicamente
nessa estrutura:

array (
[0] => array
([0] => 'teste')
([1] => 'teste')
([2] => 'teste')
[1] => array
([0] => 'teste')
([1] => 'teste')
([2] => 'teste')
);

ou seja, onde o valor do primeiro array é um outro array com chave valor..
para ler é fácil

foreach e você consegue manipular todos os arrays, e para montá-lo ?
07/11/2003 8:19am (~20 anos atrás)

Linuxman, meu código acima
também foi identado só que não apareceu no post.. talvez isso seja um pequeno probleminha e uma sugestão ao fórum de melhorias
para uma opção "source" no sistema de comentários
07/11/2003 4:17am (~20 anos atrás)

No meu ponto de vista, seria melhor identar
o código de forma que todos os programadores possam identificar de uma maneira mais simples, para manutenção mais rápida de um programa.
Falow

06/11/2003 9:27am (~20 anos atrás)

ab disse:
for ($x=0;$x<mysql_num_rows($sql);$x++) {
$dados = mysql_fetch_array($sql);
$meu_array[$x] = $dados['minha_col'];
}
Isso nao muda nada no funcionamento da funcao, mas meu professor costuma dizer que eh importante manter um codigo "elegante", entao, uma forma de reescrever:

for ($x=0;$x<mysql_num_rows($sql);$dados = mysql_fetch_array($sql), $meu_array[$x++] = $dados['minha_col']);

programar "ao peh da letra" eh interessante pra manter o codigo mais organizado e limpo
:)
31/10/2003 2:18pm (~20 anos atrás)

Sao essas pequenos detalhes que diferenciam um programador profissional de um amador...
todos tem seu momento amador, mas precisamos evoluir para profissionais, afinal muitos aqui, vao levar esse conhecimento para a carreira e usufruir
Calvin, pode ter certeza de que estas pequenas coisas fazem muita, muita diferenca, pois melhorar-se e melhorar o jeito como se programa e que faz a gente evoluir na linguagem e saber cada vez mais.
Afinal, conhecimento é poder, e acima disso, a chave para a vida...
28/10/2003 5:07pm (~20 anos atrás)

Só pra adicionar segue um codigo bastante util

<?
//...

for ($x=0;$x<mysql_num_rows($sql);$x++) {
$dados = mysql_fetch_array($sql);
$meu_array[$x] = $dados['minha_col'];
}

//...

?>

isso indexa um array
e você pode trabalhar com ele depois no seu script..
é util quando você nao quer fazer select dentro de estruturas de loop
28/10/2003 7:56am (~20 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)