Conheça a função __autoload e esqueça que um dia precisou usar listas gigantes de includes
Postado por Tobias em 30.04.2009 12:49 Desenvolvimento web, Geral, php
E ae gente, blz?
Bom o post de hoje é pequeno e rápido e com certeza incrívelmente útil, vou mostrar hoje uma técnica que estou usando pra facilitar minha vida na hora de desenvolver meus códigos, o assunto de hoje é o __autoload, uma funçãozinha que está me economizando preciosos minutos no desenvolvimento.
O funcionamento dele é básico, e funciona assim:
Quando você tenta instanciar uma classe o php verifica se essa classe já existe, se não existir ele tenta carregar ela de acordo com a função __autoload que estiver no script.
ex:
1 2 3 | function __autoload($class_name) { require_once $class_name.'.php'; } |
digamos que em algum momento do meu código eu tentei instanciar a classe Groups
1 | $groups = new Groups; |
se a classe Groups não existir até o momento o php vai tentar incluir o arquivo Groups.php (de acordo com a minha função __autoload) antes de disparar um erro. Ta mas ele sempre vai procurar só pelo nome da classe? depende… tudo depende de como você faz a sua função __autoload, veja o exemplo abaixo para entender.
1 2 3 | function __autoload($class_name) { require_once 'my/path/to/classes/'.$class_name.'.php'; } |
nesse exemplo acima o php vai procurar pela classe na path determinada na função antes de disparar o erro.
Bom é isso, só pra terminar vou dar uma dica que eu estou usando aqui, que é simplesmente adicionar as paths de onde as classes estão ao include_path.
1 2 3 4 5 6 7 8 9 | <?php set_include_path(get_include_path() . PATH_SEPARATOR . './libs/'); function __autoload($class_name) { require_once $class_name.'.php'; } ?> |
Vou explicar o código:
3 | set_include_path(get_include_path() . PATH_SEPARATOR . './libs/'); |
Adiciona ao include_path do php a pasta ./libs/
5 6 7 | function __autoload($class_name) { require_once $class_name.'.php'; } |
Define a função __autoload que irá procurar pelas classes quando forem instanciadas.
Ufa… cabou, é isso ai gente, como sempre dúvidas, sugestões e puxões de orelha nos comentários por favor :D.
abraço e até a próxima,
ps. esse foi o post mais rápido que eu já postei, da idéia de postar até o fim da revisão do texto demorou 26 min oO.
Tags: autoload, class, classes, php, __autoload
Dica Rapida: Pegando Twittadas com PHP
Postado por João Vagner em 24.04.2009 11:25 Desenvolvimento web, Geral, php
Ola a todos,
Vou começar uma série de posts rapidos com dicas legais e uteis pro dia-a-dia relacionadadas a PHP.
Quase todos usam Twitter, e ja sabemos o o Twitter tem uma API para integração, porem nao e necessario usar uma API para algo basico, como pegar os Ultimos posts de alguem via RSS. Ja que RSS e um formato XML.
Abaixo um codigo simples e rapido:
1 2 3 4 5 6 7 8 9 10 11 12 | <?php $rss = 'http://twitter.com/statuses/user_timeline/14627317.rss'; $abre = simplexml_load_file($rss); $i = 0 ; $limite=3; foreach ($abre->channel->item as $itens ) { $post = utf8_decode($itens->title); echo $post .'<hr />'; if($i==$limite) { break; } $i++; } ?> |
$rss
Indica o caminho completo do RSS a ser lido.
$abre
Utiliza simplexml_load_file para ler o xml e converter em um objeto/p
$i
Define o inicio do loop para que possamos frear o loop no nosso limite de twittadas./p
$limite=3
Definimos um limite de posts, no caso como nosso loop comeca em em 0, definindo 3, o limite de posts seria 4: 0,1,2,3
foreach ($abre–>channel->item as $itens ) {
Aqui criamos um loop do item do XML e o chamamos de $itens para melhor identificação dentro do loop. Aqui ele herda os itens de channel->item, como title, e outros
$post = utf8_decode($itens->title);
Aqui usamos o UTF-8 para decodificar as mensagens evitando erros de charset e podemos interpretar para o ISO.
echo $post .’ < hr / >‘;
Aqui imprimos o Post na tela e adicionamos a tag
para separar os posts, criando uma linha de separação.
if($i==$limite) { break; }
Aqui verificamos se o nosso loop chegou ao nosso limite definido acima, se chegar coloca um fim no loop do channel->item
Por fim e isso, basta usar em seus blogs, e onde mais desejar ;)
OOP no PHP: Overloading, utilizando os métodos mágicos do PHP
Postado por Tobias em 16.04.2009 04:56 Desenvolvimento web, Geral, Internet, OOP, php
E aeeeeew blz? Bom gente voltando do período de preguiça bagarai, vício em jogos online e outras vagabundagens ociosidade vamos dar continuidade a série de artigos sobre OOP no PHP. O assunto de hoje é bem interessante, no post de hoje vamos ver como usar um dos métodos mágicos do php.
Neste artigo vou falar do método mágico __call(), que funciona da seguinte maneira:
Quando uma classe tem o método __call() o php roda esse método sempre que qualquer método da classe for chamado, mesmo se o método que foi chamado não existir um método inexistente ou inacessível for chamado (obrigado Edgar pelo puxão de orelha), isso abre espaço para algumas coisas interessantes.
Vamos a um exemplo do funcionamento de __call():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php class ExemploCall { function __call($m, $a) { print "Método chamado: $m\n"; print "Parametros: \n"; var_dump($a); return $this->x; } } $call = new ExemploCall(); $call->test(1,2,'teste'); //Mostra na tela /* Método chamado: test Parametros: array(3) { [0]=> int(1) [1]=> int(2) [2]=> string(5) "teste" } */ ?> |
O exemplo acima simplesmente exibe na tela o método chamado e os parametros enviados, mas vendo isso a pergunta que surge na cabeça é, pra que ou onde eu vou usar o método __call()?
A resposta pra essa pergunta vai da sua criatividade mas eu vou postar aqui uma forma de uso que o cakephp usava há algum tempo atrás.
Funcionava da seguinte forma, havia um método padrão chamado find que era chamado e fazia consultas ao banco de acordo com os parametros passados, porém, (aqui que vem a mágica) ele também podia ser chamado como findByNomeDoCampo o que em alguns momentos facilitava bastante a vida do programador, vamos fazer algo parecido com isso.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | <?php /** Só vou postar o código relevante aos métodos mágicos, mas supõe-se que deste ponto em diante você já tem incluido no arquivo toda a rotina de conexão com o banco de dados, etc, etc, etc... **/ class Model { public function __construct() { //O conteúdo deste método vai variar de acordo com sua classe } public function __call($method, $params) { // Verifica se o método chamado existe nessa classe if ( method_exists($this,$method) ) { //Caso exista chama o método return call_user_method($method, $this, $params); } else { //Caso não exista, chama um método especial que fará a nossa mágica $this->parseMethods($method,$params); } } private function parseMethods($method,$params) { //Verifica se o método segue o padrão adotado if ( eregi('findBy',$method) === false ) { //Caso não siga dispara um erro dizendo que o método é inválido/não encontrado trigger_error('Método inválido ou inexistente',E_USER_ERROR); die; } else { //Caso seja um método padronizado (findByAlgo) recupera o nome do campo e converte tudo para minúsculo $fieldName = strtolower(str_ireplace('findBy','',$method)); //Formata os parametros para serem passados ao método find padrão $options = $params['1']; $options['conditions'] = array($fieldName=>$params['0']); //Chama o método find original $this->find($options); } } public function find($options) { var_dump($options); //Aqui você faria a consulta usando as informações recebidas } } //Instancia a classe $model = new Model(); //Define parametros a serem passados $options = array ( 'fields' => array ('*') ,'order' => array ('nome ASC') ); //Chama o método mágico // Onde o primeiro parametro é o valor que o campo passado no nome do método deve ter. $model->findByBlog('Technócio',$options); /** O que chega no método options é: array(3) { ["fields"] => array(1) { [0]=> string(1) "*" } ["order"] => array(1) { [0]=> string(8) "nome ASC" } ["conditions"] => array(1) { ["blog"]=> string(9) "Technócio" } } **/ ?> |
O código ta bem comentado e bem simples também, embora não tenha me aprofundado muito no assunto acho que deu pra ter uma noção dessa possibilidade e do que pode ser feito com isso.
Como sempre, para dúvidas, sugestões e puxões de orelha, utilizem os comentários. Até a próxima (que dessa vez não vai ser tão demorada assim).
Tags: call, Desenvolvimento web, metodos magicos, OOP, php, php5, __call
Trabalhando com Datas em PHP & MySQL
Postado por João Vagner em 07.04.2009 09:46 Desenvolvimento web, Destaques, php
Bom dia,
Datas, hora, minutos, meses, anos, informações que nos deslocam às nossas tarefas diárias, ou que nos deixam desesperados porque o tempo é pouco para tal coisa ou compromisso, pois é, data esta dentro do tempo, que nem sempre esta à nosso favor. Deixa-mos a filosofia de lado, blá nunca fui bom filosófo, quer dizer, jamais fui um, então comecemos logo à entender um pouco datas.
Formatos de datas no Mundão!
O php, a linguagem de inicio que vou usar nesse post, tem a função strftime(), ela faz a formatação de uma hora/data com as configurações locais dos paises, é importante frisar que em servidores windows, é preciso usar a função setlocale() para definir a linguagem da localidade que você vai usar, e ler no MSDN as suportadas, porque claro, o Windows complica mais do que ajuda!
Exemplo de datas com fuso horario de outros paises
Alemanha
<?php //Seta o local, de_DE = alemanhã (German) setlocale(LC_TIME, "deu"); echo strftime(" estamos na German (Alemão) %A.\n"); ?>
Portugues Brasil
<?php //Seta o local, "portuguese-brazil" ou "ptb" = Português Brasil setlocale(LC_TIME, "portuguese-brazil"); echo strftime(" estamos no Brasil (Português) %A.\n"); ?>
Formas de String:
%a – dia da semana abreviado de acordo com a localidade
%A – nome da semana completo de acordo com a localidade
Mais sobre as formas de string em PHP.Net ( Manual).
Bom, agora que a parte de deixar configurado à data de acordo com sua localidade ou com a necessidade mesmo do desenvolvedor, por exemplo se você estiver trabalhando em um sistema que poderá ser usado em outros paìses (nossa, elevei o pessoal a programadores mundiais!), isso pode poupar-lhe de muita dor de cabeça, gritos, socos, murros, monitores, gabinetes, e HD’s!
Datas em formato Timestamp
An extension of the DATE datatype that can store date and time data (including fractional seconds). The timestamp type takes 11 bytes of storage.
Inglês péssimo né? é? então eu vou lhe dar uma linguada básicanisso e verbalizar essa budêga:
Uma extensão do datatype (tipo de data) da DATA que pode armazenar dados da data e da hora ( com segundos fracionários incluídos). O tipo do timestamp faz exame de 11 bytes de armazenamento..
Nossa, meu inglês é uma bosta também, mas o português tambem é fraco, mas é isso. é uma extenção de data para armazenamento de data hora e informações facionarias como segundos, blá e blá, se você quiser uma data exata mesmo, no real sentido, isso é sua solução!
Timestamp em MySQL e outros tipos
O Nosso Manual MySQL nos diz, que DATETIMES e TIMESTAMP são relacionadas, calma, elas não tem relações sexuais, vão ter datazinhas gritando, chorando e chamando você de titio não! nossa, mente poluída a minha não?! Elas são apenas parecidas, ou tem a mesma função, até hoje nunca descobri, ou tenho certeza disso! hahahaha!
Os formatos de DATE do MySQL se reservam apenas à Ano, dia e Mês: YYYY-DD-MM, não temos a opção de segundos fracionários, então neca de comparação exata usando segundos com esse tipo de campo.
Agora em Timestamp como diz a descrição da extenção, temos opção fracionária, que ficará no formato de: YYYY-DD-MM HH:MM:SS, po, mas ta feio pacas isso não? Os Brasileiros não leem datas nesse formato americano, então o MySQL permite usar o padrão de data Brasileiro ? que é DD-MM-YYYY, cara, sei não, se tiver desconheço, e não recomendo! já vou explicar os motivos.
Imagine essa situação:
Você tem 2 datas, que precisam ser comparadas se uma é maior que outra , as datas são essas: 23/06/1989 e 23/08/1800, e em comparações de datas você não pode usar barras, traços, essas viadagens todas pra ficar bonitinha! Seria assim seu pensamento:
23061989 > 23081800 vai retornar false, hahah se lasco cara!
Bom, olhando você ja sabe que a data mais antiga é maior que a mais nova, no nosso formato Brasileiro, mas isso esta errado, sendo que a primeira data é a maior, sendo à mais perto de nosso ano atual, não é? mas os numeros não mentem, porque nosso formato é incorreto para comparações de data, mas no formato americano é mais fácil de se comparar:
18002308 > 19892308 vai retornar true.
Mas você ficou tristinho, pois a data no formato americano fica estranho pros brasileiros, calma, tudo tem uma solução, você pode formatar a data em timestamp com uma função, ela fica em um formato agradavel de ler exemplo: 23 de outubro de 2004 as 13:01:21 . mas caso os dados venham do banco de dados, é necessário usar UNIX_TIMESTAMP antes no seu select, por exemplo:
# Seleciona o campo data, usando a função UNIX_TIMESTAMP, dando renome a ela, de NovaData, campo esse da tabela TabelaLinda SELECT UNIX_TIMESTAMP(DATA) AS NovaData FROM TabelaLinda;
Se você chamar a função UNIX_TIMESTAMP sem nenhum argumento, exemplo:
# Obtem a data de hoje usando os segundos, desde de 1969! SELECT UNIX_TIMESTAMP();
Isso iria retorna um tipo timestamp do Unix, são segundos desde ‘1969-01-01 00:00:00′ GMT, mais ou menos assim: 882226357
Bom, ai você tem um monte de numeros de segundos, o que você vai fazer com eles? colocar no prato e comer? Jogar na lata do lixo porque não serve pra nada? Pegar uma metralhadora e atirar no monitor? Ou usa a função para formatar?, ahhh garoto esperto, usa a função!
<?php function montaData($data) { $v_mes = array(1=>"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"); $v_data = explode(" ",date("Y m d H i s", $data)); return "{$v_data[2]} de {$v_mes[(int)$v_data[1]]} de {$v_data[0]} as {$v_data[3]}:{$v_data[4]}:{$v_data[5]}"; } ?>
Pronto! Basta aplicar:
<?php echo montaData($consulta['NovaData']); // 23 de outubro de 2005, as 13:13:13 ?>
Agora quando você define no seu campo tipo Timestamp? como deve inserir o formato das datas no banco? Você usa o padrão americano, temos outra função pra isso, pra em vez de se matar escrevendo date() e suas propriedades, só chama a função PadraoData().
<?php function padraoData() { $exibe = date('Y m d H i s'); return $exibe; } ?>
Se você mandar imprimir date(‘Y m d H i s’); vai ver que vai sair: YYYY MM DD H I S, não as letras, mas a data mesmo! que é o padrão americano, em timestamp! Em comparações isso fica mais perfeito ainda, não foge nem os segundinhos!
20041512030520 > 20031810122030 retorna true
–
20031810122030 > 20041512030520 retorna false
Índices para Pesquisa
- Linguagem PHP – http://www.php.net
- Banco de dados Mysql – http://www.mysql.com
Abraços ;-)
Tags: datas, Desenvolvimento web, pho

