A maior linha de código
Será que no livro dos recordes existe a maior linha de código já escrita? Eu costumo escrever linhas grandes, sou fã de expressões e inevitavelmente elas levam a isso.
No PHP, expressões ajudam bastante a economizar código. Por exemplo, os três trechos abaixo verificam se a variável “var” é numérica, se não for abortam o script:
PHP
if (!is_numeric($var)) {
die;
}
PHP
if (!is_numeric($var)) die;
PHP
is_numeric($var) or die;
O terceiro trecho é simples, é uma expressão binária or. Se a primeira expressão for válida, ele não verifica a segunda. Se a primeira for inválida, ele verifica a validade da segunda. Você só pode fazer esse tipo de expressão com funções que retornam valores, como a die que eu utilizei. Você não pode por exemplo fazer isso:
PHP
is_numeric($var) or return(FALSE);
Return é uma estrutura de linguagem que não retorna valores dentro de uma expressão (retorna eles externamente), portanto não pode ser uma expressão válida e gera um erro.
Outro recurso interessante são as expressões ternárias:
PHP
is_numeric($var) ? print('Ok! Numérico') : die;
Esse trecho acima equivale ao seguinte:
PHP
if (is_numeric($var)) {
print('Ok! Numérico');
} else {
die;
}
A síntaxe básica é condição ? verdadeiro : falso. Simples e prático, né?
Ah, a maior linha que eu escrevi até hoje foi essa:
PHP
if ($mirror = new ReflectionMethod($obj[0], $obj[1])) $mirror->getStartLine() == $mirror->getEndLine() ? $this->_call(array($obj[0], $obj[1].ucfirst(empty($args[0]) || ($met = !method_exists($this, $obj[1].ucfirst($args[0]))) ? ‘index’ : $args[0])), $met ? $args : array_slice($args, 1)) : call_user_func_array($obj, $args);
Essa única linha ilegível e complexa (acredite, gosto disso) cria um objeto refletor, verifica se o método chamado é vazio em uma classe e chama um outro método com nome variável com base nos argumentos passados para o método vazio. Caso o método vazio seja passado sem argumentos ele chama um método-índice.
Em outras palavras, ela transforma uma chamada de cliente(’incluir’,'Alexandre) em clienteIncluir(’Alexandre’) automaticamente, caso a chamada seja cliente() ele transforma em clienteIndex().
Essa linha faz parte do controlador do meu novo framework, se quiserem usar podem, com algumas condições.


24/7/2007 às 11:31 am
Em outras palavras, essa linha transforma o programa em um monstro quase impossível de dar manutenção.
Pensa bem, daqui alguns anos, até mesmo você iria precisar parar alguns segundos para ler esta linha e interpretá-la.
Ou seja, não vale a economia de código. Preze sempre pela leitura. Acredito que tu sabe disso, só mostrou essa linha pra assustar a galera, mas não coloque em produção. Sério mesmo.
24/7/2007 às 4:08 pm
Pra falar a verdade, é um saco de dar manutenção mesmo =) O Framework atualmente tem 80 linhas e não passará muito disso. O Objetivo é conseguir performance e aproveitamento de memória, pra isso infelizmente (nesse projeto) estou sacrificando a capacidade de manutenção.
No entanto, as aplicações criadas utilizando o framework, não implicam necessariamente em códigos assim, pelo contrário