PHP - Enviando parâmetros para funções e métodos via Array


Quero propor hoje uma nova metodologia. Tenho testado ela em aplicações e tem sido bem interessante. A passagem de parâmetros via Array associativa  (pares de "chaves, valores").

Adianto que não necessariamente este é o melhor método que existe mas ele é bem prático se compararmos com a metodologia comum de passagem de parâmetros.

O que é?

Bem, não existe novidade alguma no aspecto técnico deste procedimento. Ele é mais uma metodologia de uso.

Um grande problema da programação são as refatorações, ou seja, quando temos de implementar algo novo ou corrigir uma falha. Neste cenário está a passagem de parâmetros para uma função, método ou construtor de classe. Já aconteceu comigo várias vezes de ter de criar tantos parâmetros para um método que eles chegava a sumir da tela! E quando temos de colocar um novo? Devemos lembrar, é claro, que a sequência de parâmetros, ou seja, sua ordem na chamada, deve ser a mesma que na função ou método. E se trocamos esta ordem... coisas boas não acontecerão.

Adotando o sistema de passagem de parâmetros por Array vários problemas são eliminados já que a posição não importa mais, mas sim, a chave e seu valor.

Vamos ver um exemplo prático bem simples criando uma função que calcula a potência de um número.

<?php

// Eleva um número a uma potência qualquer
function potencia($base,$expoente)
{

return pow($base,$expoente);

}

echo potencia(10,2);

Como resultado temos:

100

Ou seja, queremos saber quanto é 10 elevado ao quadrado (102). Mas chamar a função desta maneira é pouco intuitivo pois teriamos de ler a função e saber que o primeiro parâmetro é a base e o segundo o expoente.

Claro que neste caso é bem simples avaliar isto mas, como todos bem sabem, exitem funções e métodos com centenas, milhares de linhas de código. Uma grande parte das vezes é inviável ter de entender o que faz a função para saber como passar os parâmetros. Uma linha de comentário pode ser bem vinda nestes casos mas existe outra maneira.

Vamos ver o que acontece se, por engano, trocarmos a posição dos parâmetros

<?php

// Eleva um número a uma potência qualquer
function potencia($base,$expoente)
{

return pow($base,$expoente);

}

echo potencia(2,10);

Temos como resultado:

1024 (este número não lhe é familiar?)

Veja como nosso resultado veio completamente errado por um simples descuido. Imagine estes dados sendo gravados em um banco de dados. Muita confusão pode acontecer!

Vamos aplicar nossa técnica agora. Vamos padronizar o processo chamando sempre de $param a Array que a função ou método recebe.

<?php

// Eleva um número a uma potência qualquer
function potencia($param = Array())
{

return pow($param['base'],$param['expoente']);

}

echo potencia(Array('base' => 10, 'expoente' => 2));

Temos como saída:

100

E o que acontece se trocarmos a ordem?

<?php

// Eleva um número a uma potência qualquer
function potencia($param = Array())
{

return pow($param['base'],$param['expoente']);

}

echo potencia(Array('expoente' => 2, 'base' => 10));

Temos como saída:

100

Veja que a posição não importa mais pois estamos tratando com pares "chave => valor", a famosa Array associativa. Fica bem claro na chamada da função o que é 'base' e o que é 'expoente'.

Assim com os parâmetros convencionais, podemos também estabelecer valores padrão para as Arrays, caso nenhum valor seja passado à função.

O script abaixo rascunha uma validação muito básica de parâmetros:

<?php

// Eleva um número a uma potência qualquer
function potencia($param = Array('base' => false, 'expoente' => false))
{

return (!$param['base'] || !$param['expoente'])? 'error' : pow($param['base'],$param['expoente']);

}

echo potencia();

A saída será:

error

Ou seja, se nenhum parâmetro for passado o script utiliza os valores padrão e retorna um aviso de erro ao invés de parar o processo.

Mas e se tivermos de implementar uma nova funcionalidade como, por exemplo, uma opção para que o resultado possa sair no formato binário:

<?php

// Eleva um número a uma potência qualquer
function potencia($param = Array('base' => false, 'expoente' => false))
{

$resultado = (!$param['base'] || !$param['expoente'])? 'error' : pow($param['base'],$param['expoente']);

return ($param['tipo'] == 'binario')? decbin($resultado) : $resultado;

}

echo potencia(Array('base' => 10, 'expoente' => 2, 'tipo' => 'binario'));

Teremos como resultado:

1100100

Que é a representação de 100 em binário.

Veja que não tivemos de fazer absolutamente nenhuma mudança nos parâmetros de entrada, apenas inserir um IF e uma variável local a mais.

<?php

// Eleva um número a uma potência qualquer
function potencia($param = Array('base' => false, 'expoente' => false))
{

$resultado = (!$param['base'] || !$param['expoente'])? 'error' : pow($param['base'],$param['expoente']);

return ($param['tipo'] == 'binario')? decbin($resultado) : $resultado;

}

echo potencia(Array('base' => 10, 'expoente' => 2));


Resultado:

100

Chamar a função sem o novo parâmetro ou com o novo parâmetro diferente de 'binario' faz o script se comportar como antes.

Assim concluo o artigo de hoje esperando que seja útil a todos. Se gostaram do artigo vocês podem me ajudar muito divulgando o blog.

Grande abraço!

Comentários

Postagens mais visitadas deste blog

MySQL - Completando quantidades fixas de caracteres com as funções LPAD() e RPAD()

MySQL - Clonando tabelas na linha de comando

PHP - Gerando arquivo em UTF-8 com fwrite() e utf8_encode()