Objota O mundo orientado a objetos

PHP – Problema com caracteres na conexão com o banco de dados utilizando PDO

Posted on setembro 13, 2012

Posted by Pedro

Olá galera, fica aqui uma dica bacana para quem está tendo problemas com caracteres na conexão com o banco de dados utilizando PDO.

Problemas com charset geralmente ocorrem quando você processa os dados no seu site em um formato X e no banco em um formato diferente. Ai começam os problemas. Um exemplo simples é o uso de ISO-8859-1 na codificação do seu site e um banco de dados configurado para trabalhar com charset UTF-8.

Nesse exemplo vou configurar parâmetros de conexão como o banco de dados MySQL já que é geralmente o mais utilizando com PHP, e trabalhar com  os dados no formato UTF-8.


//Exemplo da classe em PHP com extends na classe PDO. Aqui vamos atribuir todas as variáveis da nossa conexão pra trabalhar no formato UTF-8.

class MysqlConnection extends PDO {

public function Connection($dsn, $username = "", $password = "", $driverOptions = array()) {

parent::__construct ( $dsn, $username, $password, $driverOptions );

$this->exec("SET NAMES utf8");

$this->exec("SET character_set='utf8'");

$this->exec("SET collation_connection='utf8_general_ci'");

$this->exec("SET character_set_connection='utf8'");

$this->exec("SET character_set_client='utf8'");

$this->exec("SET character_set_results='utf8'");

}

}


//Aqui é a string de conexão / $dsn que vamos usar para conectar ao nosso banco

$dsn = "mysql:host=localhost;dbname=meu_banco_de_dados;charset=utf8";

Bom é isso. Muito simples, certo?

Qualquer dúvida pode postar um comentário que irei responder.

Até a próxima.

hashDoS a falha de segurança que afeta a maioria das linguagens WEB

Posted on janeiro 1, 2012

Posted by Eder Freire

Recentemente na Alemanha aconteceu a 23ª edição da Chaos Computer Club, uma conferência de segurança muito conhecida entre os hackers de todo mundo e, pra variar, as primeiras palestras foram assustadoras. Um pesquisador encontrou uma brecha que afeta milhões de celulares no mundo todo nas redes 2G GSM, mas o que realmente me chamou atenção foi uma dupla de pesquisadores avisou que milhões de sites estão vulneráveis a um novo tipo de ataque DoS (Denial of Service), chamado hashDoS, que pode deixá-los fora do ar se não tratado com rapidez.

Os pesquisadores Alexandre Klink e Julian Wälde gesticularam e demonstraram que o problema está na maneira que certas linguagens usadas em servidores web armazenam valores em uma tabela hash. A grande maioria utiliza do mesmo método e pessoas mal-intencionadas podem tirar vantagens disso, enviando valores pré-determinados que sabem sabem que não serão tratados da forma que deveriam ser tratados. Essas requisiões, no final das contas, acaba gerando uma função quadrática que sobrecarrega os servidores.

Para provar que o método funciona, durante a apresentação, eles enviaram requisições do tipo HTTP POST com 2 MB de tamanho para um servidor WEB rodando Apache Tomcat, isso foi o suficiente para que o processamento do servidor subisse para a marca de 100% de consumo e permanecesse neste nível durante toda a palestra.

Quais linguagens afetadas?

A lista não é nada pequena. Nela constam PHP, ASP.NET, Java, Python, Ruby, Apache Tomcat, Apache Geronimo, Jetty, Glassfish, e até a V8, engine de renderização de JavaScript do Google.

Note que aqui temos interpretadores e servidor de aplicação, nessa os servidores WEB e o protocolo HTTP escaparam, sempre alvos de ataques de hackers.

Quais linguagens ja iniciaram o processo de correção e em qual versão isso ja está corrigida?

JRuby >= 1.6.5.1
PHP >= 5.3.9 (ainda está em Release Candidate), 5.4.0 RC4
Ruby >= 1.8.7-p357, 1.9.x
Apache Tomcat >= 5.5.35, 6.0.35, 7.0.35
Rack >= 1.4.0, 1.3.6, 1.2.5, 1.1.3

A Microsoft ja anunciou que vai liberar uma atualização para o ASP.NET que soluciona esse problema.

Os mais afetados com certeza serão os sites com PHP, hoje 77% dos sites em PHP rodam sob o PHP 5.2, que não teve nenhum suporte a este buf-fix. O certo é migrar-mos nossos sites para o PHP 5.3.9 RC, a 5.3 ja é a versão estável do PHP, o que garante atualizações de segurança e novos recursos.

Há linguagens que não entraram na lista, pois isso não era novidade para seus criadores, uma que vale a pena destacar, a qual eu sou fã, é o Perl, eles trataram esse problema em meados de 2003, pois ja haviam identificado essa falha.

A explicação é extramamente complexa, vale a pena dar uma olhada no vídeo da apresentação no Youtube .

Você também pode conferir o anúncio oficial.

Como usar NameSpace no php

Posted on abril 12, 2011

Posted by Rodrigo Ireno

O exemplo mais fácil para referenciar name space é a linguagem JAVA. Que usa o conceito de package e que no final das contas é a mesma coisa. O objetivo de usar este recurso é entre outras coisas organizar suas classes em grupos especializados.

No java se faz o uso de name space ao chamar um objeto diretamente ou método ou ao importar uma classe ou pacote de classes. exemplo:

import javax.swing.JOptionPane.*;

Este exemplo importa tudo o que está dentro do pacote JOptionPane.

Porém essa realidade (import) não se aplica ao php, pois utilizamos o autoload.

Vejamos abaixo uma pequena estrutura montada para utilizar este recurso no php. Implementei um config.php e uma página index.php. A primeira mudança que devemos notar é o modo como a função autoload está sendo implementada

obs: A versão do php que estou usando é 5.3.x

Seguem os arquivos da estrutura:

classes/Usuario.class.php

<?php
namespace classes;

class Usuario{

 function getIdade() {
 return 8;
 }
}

?>

classes/util/Conexao.class.php

<?php
namespace classes\util;

class Conexao{

 function getConnection() {
 return 'is connected!';
 }

}
?>

classes/util/Timer.class.php

<?php
namespace classes\util;

class Timer{

 function getNow(){
 echo "<br />".date("h:m:s")."<br />";
 }
}
?>

config.php

<?php
define("HOME", getEnv("DOCUMENT_ROOT")."/teste/");

spl_autoload_register(function ($class) {

 $nome = str_replace("\\", "/" , $class . '.class.php');

 if( file_exists( HOME . $nome ) ){
 include_once( HOME . $nome );
 }

});
?>

index.php

<?php
include_once("config.php");

use classes\Usuario;
use classes\util\Conexao;
use classes\util\Timer;

$usuario = new Usuario();
$con = new Conexao();
$timer = new Timer();

echo $con->getConnection() . "<br />";
echo $usuario->getIdade() . "<br />";

$timer->getNow();

?>

Note que ao utilizar namespace é obrigatório respeitar a organização dos diretórios. Caso contrário a sua função de autoload não irá funcionar. Em java a organização também é feita desta forma, porém as ferramentas IDE's abstraem um pouco essa parte. Mas como disse no final das contas um package ou namespace é literalmente isso separar em diretórios diferentes o seus arquivos php que contém classes.

Dê uma fuçada na função autoload printando na tela a classe atualmente sendo chamada, e verá que o nome que é recuperado pelo seu parâmetro não traz somente o nome (mas também todo o caminho do namespace especificado no arquivo da classe).

Bom, finalizo este post aqui, e espero que tenha esclarecido algumas dúvidas. valew 😉

arquivos (descompacte no seu htdocs):  download dos arquivos

Como criar plugins para WordPress – Parte 1

Posted on janeiro 25, 2011

Posted by Rodrigo Ireno

Neste artigo, vou mostrar como fazer um plugin para WordPress. Nele vamos utilizar algumas funções básicas para introduzir alguns conceitos. Neste caso vou utilizar orientação a objetos. Então vamos fazer:

Um plugin que fará uso de filtros para adicionar uma frase ao final do post. E também utilizar as actions de instalação e desinstalação.

Antes de prosseguir vamos responder algumas perguntas:

O que é um plugin WordPress?

Um plugin é um conjunto de scripts organizado de forma padronizada, que serve para estender as funcionalidades da plataforma WordPress. Existem os mais variados tipos de plugins. Por tanto...

Porque fazer um plugin?

Você deve optar por fazer um plugin somente se não existir, ou se sua funcionalidade não se aplica ao problema que você quer resolver. Como dito antes, exitem plugin’s para fazer de tudo nesta plataforma. Por tanto antes de fazer um, faça uma busca para se certificar de que já não exista um que atenda as suas necessidades.

Tendo tudo isso em mente, vamos em frente. Vejamos agora a estrutura básica de um plugin WordPress:

  • Arquivo principal (O arquivo que irá receber o cabeçalho.). É aconselhável que este arquivo PHP tenha um nome relacionado à sua atividade. Isso ajuda muito na busca (caso você venha publicá-lo).
  • Cabeçalho é um trecho comentado no topo do seu arquivo de plugin.
  • Readme.txt este arquivo é preciso caso venha publicar seu plugin no site oficial.
  • Função de: instalação, desinstalação e negócio

Arquivo Principal

Vamos do início. Suponhamos que você faça um plugin com nome Meu WP. Quando instalado todos os plugins ficam dentro do diretório /wp-content/plugins/. O nome ideal para o diretório deste plugin seria: meu-wp. O nome para o arquivo php, poderia ser: meu-wp.php ou meuWp.php.

Este arquivo principal conterá no início do script o cabeçalho padrão de um plugin, caso ele não tenha não será considerado um plugin pelo WordPress.

Neste arquivo é que devem ser chamadas as funções de instalação e desinstalação. E demais funções utilitárias, como por exemplo criar um aba no menu para o seu plugin ou até mesmo uma composição inteira de menu drop-down.

Cabeçalho

Este é o cabeçalho padrão necessário para seu arquivo plugin. Na própria documentação do WordPress é citado que somente o nome é obrigatório. Mas convenhamos colocar Nome do autor, seu email de contato e site é bem útil, não?! Eis o dito cujo:


/*
Plugin Name: Meu WP
Plugin URI: http://www.meuwp.com.br
Description: Ele faz alguma coisa..
Version: 1.0
Author: Meu nome vem aqui
Author URI: http://www.meusite.com.br
*/

readerme.txt

Este arquivo deve ficar na raiz do diretório do seu plugin (caso você venha publicá-lo). Veja o readme.txt padrão disponível do site oficial ( eles também tem um validador ). Uma coisa a ressaltar sobre este arquivo é que ele irá estruturar a página de seu plugin no site oficial. Muito em breve irei escrever um artigo explicando como postar seu plugin.

Licença

A licença é a padrão GPL2, deve ser incluída abaixo do cabeçalho do plugin.


/*  Copyright YEAR  NOME_DO_AUTOR  (email : EMAIL_DO_AUTOR)

 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License, version 2, as
 published by the Free Software Foundation.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

Funções de instalação:

O WordPress disponibiliza uma séria de eventos que podem ser capturados através dos chamados hooks. Com eles é possível especificar a execução de uma função em determinados momentos do processamento deste CMS. Por exemplo, capturar quando o usuário posta algo, ou quando um comentário é exibido. Existe uma infinidade de eventos que podem ser capturados. Veja as referências no final deste artigo.

Nota: Seu plugin não precisa de nenhuma função para ser ativado ou desativado no painel de gerenciamento de plugins. De fato ele só precisa de um cabeçalho. Mas do que adianta ter um plugin que não faz nada rs..

Vejamos então as actions de instalação e desinstalação. Elas já foram feitas especificamente para isso, capturar evento ativação e desativação do plugin:

register activation hook


//Caso chame uma função simples:
register_activation_hook( __FILE__, 'nomeDaFuncao' );

//Caso chame de uma classe:
register_activation_hook( __FILE__, array('NomeDaClasse', 'NomeDoMetodo') );

register deactivation hook


//Para destivar com uma função:
register_deactivation_hook( __FILE__, 'NomeDaFuncao' );

//Para destivar com o método de uma classe:
register_activation_hook( __FILE__, array('NomeDaClasse', 'nomeDoMetodo') );

Criar uma página de configuração de seu plugin

É possível adicionar composições de meu, através das funções: add_menu_page e add_submenu_page.

Funções Utilitárias

A API de plugins do WordPress é muito completa, possui métodos que fazem de  tudo. Um método que vamos utilizar neste artigo é o get_option.

Options no WordPress

É possível através de um conjunto de métodos option capturar, guardar, atualizar e deletar opções do banco de dados sem digitar uma linha de SQL. Mas cuidado o ideal é usar somente uma option para seu plugin. Nestas options podemos capturar dados triviais como url do blog, nome, descrição. Tudo isso utilizando o comando certo passado por parâmetro. Veremos adiante.

Com tudo isso já podemos começar:

Nossa estrutura de trabalho:

Nome do plugin: Meu WP
Nome do arquivo principal: meu-wp.php
Pagina de configuração: meu-wp-config.php
Sub página: meu-wp-sub-pagina.php
Seu diretório: /meu-wp/

O que ele faz:

Ele captura o evento de post; Concatena o conteúdo do post com a frase configurada na sua página de configuração.

Mão na massa finalmente:

Arquivo principal: meu-wp.php

Ele conterá o cabeçalho.


<?php
/*
Plugin Name: Meu WP
Plugin URI: http://www.meuwp.com.br
Description: Ele faz alguma coisa..
Version: 1.0
Author: Meu nome vem aqui
Author URI: http://www.meusite.com.br
*/

class MeuWp{

 public function ativar(){
 add_option('meu_wp', '');
 }
 public function desativar(){
 delete_option('meu_wp');
 }
 public function criarMenu(){

 add_menu_page('titulo Meu WP', 'Meu WP',10, 'meu-wp/meu-wp-config.php');

 add_submenu_page('meu-wp/meu-wp-config.php', 'Sub pagina 01', 'titulo 01', 10, 'meu-wp/meu-wp-sub-pagina.php');

 }

 public function adicionaFrase($textoDoPost){
 $frase = get_option('meu_wp');

 if( strlen( $frase ) > 0 ){
 //famos dar um estilo pra diferenciar do resto!
 $frase = '<span style="color: #f00; font-size: 18px;">'.$frase.'</span>';

 return $frase."<br /><br />".$textoDoPost;
 }
 else{
 return $textoDoPost;
 }
 }
}

$pathPlugin = substr(strrchr(dirname(__FILE__),DIRECTORY_SEPARATOR),1).DIRECTORY_SEPARATOR.basename(__FILE__);

// Função ativar
register_activation_hook( $pathPlugin, array('MeuWp','ativar'));

// Função desativar
register_deactivation_hook( $pathPlugin, array('MeuWp','desativar'));

//Ação de criar menu
add_action('admin_menu', array('MeuWp','criarMenu'));

//Filtro do conteúdo
add_filter("the_content", array("MeuWp","adicionaFrase"));
?>

Página de configuração: meu-wp-config.php

Onde iremos configurar a frase que irá aparecer nos posts.


<?php
$msg = '';

if($_POST){
 update_option('meu_wp', $_POST['frase']);

 $msg = '<div id="message"><p>Frase configurada, veja seus posts agora!</p></div>';
}
?>
<div>
<div id="icon-plugins"><br /></div>

<h2>Meu WP - Configurações</h2>
<?php echo $msg; ?>
<form action="" method="post">
<dt>
 <b>Frase</b>
 <dd>
 <input type="text" name="frase" value="<?php echo get_option('meu_wp');?>"/>
 </dd>
 </dt>
<input type="submit" name="Submit" value="Salvar altera&ccedil;&otilde;es" />
</form>
</div>
</div>

Sub página: meu-wp-sub-pagina.php

Sub-página, só pra exemplificar.


<div>
<div id="icon-plugins"><br /></div>

<h2>Meu WP - sub página 1 - sinto muito, mas não faço nada!</h2>

<form action="" method="post">
<dt>
 <b>hello</b>
 <dd>
 <input type="text" name="nome" value=""/>
 </dd>
 </dt>
<input type="submit" name="Submit" value="Salvar altera&ccedil;&otilde;es" />
</form>
</div>
</div>

Com todos estes arquivos devidamente criados nossa estrutura de diretórios ficou assim:

/meu-wp/meu-wp.php
/meu-wp/meu-wp-config.php
/meu-wp/meu-wp-sub-pagina.php

Explicando...

Método ativar. Este método é chamado pela action de instalação e executa as ações de instalação. Se seu plugin tiver que criar uma tabela, por exemplo, é ali que se deve fazer isso.

Método desativar. Se em ativar você insere seu conteúdo e configurações aqui você remove. Ainda existem plugins que questionam o usuário se ele quer retirar as configurações salvas.

Método criarMenu. Chama o método para criar uma nova composição de menu add_menu_page e add_submenu_page. Para mais informações e possibilidades veja a documentação.

Método adicionarFrase. Este método está sendo chamado por um filter com o gancho the_content, este gancho insere por parâmetro o conteúdo do post. Filtros não alteram o banco de dados, somente apresentação no browser. Existem muitos ganchos, capturando todo tipo de evento. Veja as referências no final da página.

Instalando!

Agora vamos testar! Eu presumo que você tenha um localhost e um wordpress instalado nele. Então é só copiar o sua pasta meu-wp para dentro do diretório /wp-content/plugins/ , acesse o painel de gerenciamento de plugins e vualá! Ele está lá esperando sua ativação.

obs: Se você quiser compactar e testar online mesmo (o que eu não aconselho, a menos que tenha um site só pra teste). Não se esqueça de que o WordPress só descompacta arquivos .zip.

Chegamos ao fim. Fiquem espertos, pois ainda vou postar mais dois artigos para completar este. Qualquer dúvida e sugestão poste aí. Até a próxima.

Download dos arquivos: Meu WP

Agora seguem os links de referência:

Introdução
http://codex.wordpress.org/pt:Plugins

Escrevendo um Plugin:
http://codex.wordpress.org/Writing_a_Plugin

Plugin API:
http://codex.wordpress.org/Plugin_API

Adicionando Menus de Administração:
http://codex.wordpress.org/Adding_Administration_Menus

hook de ativação
http://codex.wordpress.org/Function_Reference/register_activation_hook

hook de desativação
http://codex.wordpress.org/Function_Reference/register_deactivation_hook

Add menu Page:
http://codex.wordpress.org/Function_Reference/add_menu_page

Add sub menu page:
http://codex.wordpress.org/Function_Reference/add_submenu_page

Filter Reference:
http://codex.wordpress.org/Plugin_API/Filter_Reference

Action Reference:
http://codex.wordpress.org/Plugin_API/Action_Reference

Ferramentas de Desenvolvimento Web

Posted on janeiro 24, 2011

Posted by Rodrigo Ireno

Olá desenvolvedores! Neste artigo vou abordar um assunto que é de grande interesse para quem está começando. Com tantas opções, variações e versões ( :S quanto “ões”! ). Em fim. É exatamente isso que deixa muita gente confusa na hora de escolher uma IDE.

Vou listar aqui algumas IDE’s que usei e dizer algumas vantagens e desvangens. Não pretendo fazer um a análise profunda, por tanto se tiver algo a acrescentar fique a vontade, comente sua experiência!

Vamos começar!

EditPlus


Este cara é um editor peso pena. Ele é bem simples não possui recursos de auto-completar, é praticamente um bloco de notas coloridos. Porém se você tem pressa com projetos online, creio que não exista mais rápido para salvar via ftp, já testei e é muito veloz. Mas tome cuidado, já ouvi alguns relatos de amigos que perderão arquivos inteiros por causa de alguns bugs. Isso porque (não sei se exatamente a versão) ele não cria um arquivo temporário para salvar via FTP (o que deveria ser de praxe), ele vai direto no arquivo. Então já sabe, se ele começar a ficar lento ou der algum pau no meio do processo de salvamento do seu arquivo, seja precavido e faça você mesmo uma cópia local do arquivo pode ser no bloco de notas mesmo.

NuSphere – PhpED


Esta é com certeza uma das melhores, para desenvolvimento web. É veloz para trabalhos via ftp, e possui uma vasta biblioteca com funções de auto-completar. Até hoje não encontrei grandes problemas nesta IDE, além do fato de ser pago L, mas fazer o que. Com relação à velocidade da troca via FTP, digamos que é um pouco mais lento que o EditPlus. Outra coisa muito bacana a se destacar é que ela dá suporte nativo ao Smarty Template.

PHP Eclipse


Um eclipse para edição de html, css, javascript, etc. Porém o que me deixa intrigado é que nem se quer as funções nativas do php ele destaca no código L. Totalmente sem noção! Tem suporte nativo para FTP. Auto-completa classes que você já criou, e uma grande vantagem, ele pode ser estendido com o uso de plugins e isso pode desbancar muita gente.

ZendStudio


Um eclipse super tunado, feito pela própria empresa que mantém o projeto PHP. É uma ótima IDE para os mais diversos projetos. Com o maravilhoso comando Generate Getters and Setters. Uma vez que você abriu um arquivo de uma classe e trabalhou nela, ele reconhece seus métodos e atributos e completa quando você está digitando. Claro que dá suporte a seu próprio framework zend. Porém é feito em java, por tanto é um pouco lento trabalhar com ele em projetos online via FTP. E quanto à licença, é gratuito para testar por cerca de um mês ou dois, depois deste prazo algumas funcionalidades são bloqueadas.

Aptana Studio


Quanto a esta IDE, não tenho tanto a dizer, pois comecei a utilizá-la recentemente. Então aqui vai um trecho de um artigo sobre Aptana escrito pelo Rodrigo Araújo do site codigofonte:

(...) Aptana Studio é um IDE de desenvolvimento para aplicações da web 2.0, gratuito, código livre, com suporte Ajax, PHP, Ruby on Rails, Adobe Air, iPhone, etc. Com Aptana se facilita em desenvolvimento integrado de Ajax com as tecnologías emergentes. (...)

Resumindo, estas são algumas das características principais de Aptana Studio:

  • Ajudas visuais para a escritura de scripts em diversos linguagens, como colorido e auto-escritura do código, ajudas contextuais de referência à medida que se escreve, etc.
  • Visualização de erros de sintaxe à medida que se escreve.
  • Suporte para fazer FTP a servidores remotos, com ferramentas para sincronização.
  • Debug em Firefox (Debug Internet Explorer também com a versão Profissional)
  • Bibliotecas de funções em Javascript populares em Ajax/Javascript para utilizar nos projetos.
  • Exemplos já criados para começar a conhecer as possibilidades de desenvolvimento rapidamente.
  • Pré-visualização de estilos CSS com o editor CSS.
  • Extensível a partir de plug-ins que pode criar Aptana ou outras empresas e ferramentas para estar a par de qualquer nova adição.
  • Extensível por Javascript. Os usuários podem escrever scripts para realizar ações e macros.
  • Os Snippets permitem inserir fragmentos de texto que se utilizam muitas vezes.

(...)

Então é isso! Espero que eu tenha ajudado um pouco você a se decidir a qual IDE utilizar. Pois há quem diga que quem é bom faz no bloco de notas. E é mesmo isso é verdade, o cara realmente pode fazer. Porém quando ele tiver uma classe com 50 atributos e tiver que fazer métodos get e set para cada um... vamos ver quem vai ser o doido de fazer num bloco de notas rs...

Se estiverem de bom humor comente um pouco de sua experiência. Pois eu mesmo até hoje não utilizei todos os recursos destas IDE’s, somente o essencial.

Utilizando Config para carregar suas classes

Posted on agosto 28, 2010

Posted by Rodrigo Ireno

Muito foi visto e comentado até agora a respeito de php e orientação a objetos, suas classes e recursos. Vamos então agora falar de um recurso muito importante do php na hora de utilizar suas classes.

Junto com este conceito, se você ainda não conhece, iremos falar de um arquivo chamado config. Que nada mais é do que um arquivo de configuração, onde se declara constantes do sistema (site), e onde geralmente se declara a função __autoload() do php.

Para este artigo vamos criar quatro arquivos:

index.php
config.php
Automovel.class.php
Carro.class.php

Config será nosso arquivo de configuração, index.php será o arquivo que será requisitado, e nossas classes serão carregadas pela função __autoload().

Como funciona o autoload?

Toda vez que você instancia um objeto esta função recebe por parâmetro o nome do objeto que você está instanciando. Sendo assim com o nome do objeto e uma pequena concatenação de string é possível incluir o arquivo da classe quando necessário.

Porém só é possível implementar isso uma vez, geralmente no config. Então fica bem mais fácil, pois você só precisa saber que pra carregar as classes é só dar um include no config.

Tendo isso em mente só é preciso estar atento a uma coisa. Mantenha um padrão de nomenclatura para suas classes, geralmente se faz assim:

NomeDaClasse.class.php -

O "NomeDaClass", em verde, é o mesmo nome declarado para a classe dentro do arquivo php. O final em vermelhor "class.php" é o sufixo adotado para a nomenclatura.

Vejamos abaixo um exemplo prático. Coloque as classes em um diretorio chamado classes e o restante dos arquivos no diretório raiz:

>classes>Automovel.class.php
>classes>Carro.class.php
>config.php
>index.php

Automovel.class.php


<?php
class Automovel{
	public function Automovel(){
		echo "Placa = BAE-5533<br/>";
	}
}
?>

Carro.class.php


<?php
class Carro extends Automovel{

	public function Carro(){
		parent::Automovel();
		echo "Numero de Rodas = 4";
	}
}
?>

config.php


<?php
function __autoload($nomeClasse){
	//Verifica se existe a classe no diretório classes
	if(file_exists("classes/".$nomeClasse.".class.php")){
		//Se existe carrega
		include_once("classes/".$nomeClasse.".class.php");
	}
}
?>

index.php


<?php
include_once("config.php");

//Instancio o objeto Automóvel
echo "<b>Instancio o objeto Automóvel</b><br/>";
$Automovel = new Automovel();

echo "<br/>";

//Instancio o objeto Carro
echo "<b>Instancio o objeto Carro</b><br/>";
$Carro = new Carro();
?>

Neste exemplo utilizamos um conceito já conhecido de um outro artigo, a herança de classes. Como deve ter visto na implementação, basta indicar o diretório das classes e a função autoload irá se encarregar de carregar as classes quando necessário. Veja que é você que tem que implementar esta função, por isso é muito importante verificar a existência do arquivo para depois incluí-lo, e use include_once ou include, pois caso ocorra algum erro no carregamento ele irá apresentar o erro, porém a aplicação seguirá em frente executando o resto do script.

Tudo certinho, agora acesse a página index.php e veja o resultado!

Bem mais fácil lembrar somente do endereço do config,  não !?

Esperimente criar mais classes no diretório classes. Até a próxima! 🙂

Smarty 3.0 + MVC – Parte 1

Posted on julho 14, 2010

Posted by Pedro

Iniciando meus post’s aqui no objota, vou trazer para vocês um tutorial de Smarty 3.0 com uma pitada de MVC (pois é quase impossível falar de Smarty sem falar de MVC ).

Para quem não conhece o Smarty aqui vai uma explicação rápida sobre esse fantástico template engine que simplifica e muito a organização e a separação da camada de controle da camada de visualização.

“O Smarty é um sistema de templates para PHP. Mais especificamente, ele fornece uma maneira fácil de controlar a separação da aplicação lógica e o conteúdo de sua apresentação. Isto é melhor descrito em uma situação onde o programador da aplicação e o designer do template executam diferentes funções, ou na maioria dos casos não são a mesma pessoa.”
Font:  http://www.smarty.net/manual/pt_BR/what.is.smarty.php

Tá e ai? Então é isso, o Smarty tem por objetivo separar seu código (lógica e conteúdo) da sua apresentação.  Essa separação é realizada através da criação de templates que serão lidos pelo Smarty e esse irá gerar um arquivo pré compilado (arquivo PHP que você não precisa se preocupar pois é gerenciado pelo Smarty).  Um dos recursos no Smarty que também é muito utilizado principalmente em sites que recebem grande volume de acessos é o caching, ou seja,  gera uma saída em HTML que possui um tempo de vida determinado na programação do controlador ou diretamente no config do smarty de acordo com as necessidades do sistema.

Bom então é basicamente isso, se você necessita de mais informações sobre o Smarty acesse o site oficial http://www.smarty.net/. Lá você encontra a documentação completa  da “Latest Stable Release” (Última versão estável em português).

Vamos a configuração da versão 3.0 do Smarty.

Para quem ainda não realizou o download da versão 3.0 aqui está o link http://www.smarty.net/download.php, procure pela versão 3.0 e faça o download.

Após o download vamos criar uma pasta no seu servidor (não cabe a este tutorial explicar como utilizar o servidor web) chamada “tutorial” para nossa aplicação no seu servidor XAMPP ou WAMP ou algum outro servidor que possa ler o seu PHP.  Para esse tutorial eu vou usar o XAMPP e criar a pasta tutorial dentro de 'htdocs' dessa forma eu vou acessar a minha aplicação através da URL http://localhost/tutorial/.

Podemos agora criar a estrutura de diretórios dentro da nossa pasta de aplicação tutorial.

- includes – Arquivos php, no caso iremos colocar o arquivo config
- framework - Aqui ficam todas as ferramentas e frameworks da aplicação
- model -A pasta model é responsável por armazenar as nossas classes de negócio
- view - Aqui irão ficar nossas classes ou classe que irá ser responsável por gerar o html
- controller – Controladores do sistema que receberá as requisições
- general – Aqui vamos criar duas pasta js e css
- css

-js

- lib – E finalmente aqui nossas bibliotecas genéricas, por exemplos arquivos de cálculos, ftp, etc.
- template – O nome já diz tudo, irá armazenar os templates do smarty

Coloque o conteúdo da pasta libs que está na pasta extraída do Smarty dentro de nossa pasta framework para ficar da seguinte maneira

Se você olhar dentro da pasta descompactada do smarty tem uma pasta chamada ‘demo’ que demonstra a utilização do Smarty. Se quiser pode dar uma olhada para ajudar no aprendizado.

Vamos agora criar um arquivo chamado config.inc.php dentro da pasta includes para realizar a configuração da nossa aplicação.
config.inc.php

<?php
//Essas configurações são responsáveis por fazer o mapeamento básico do site
define("HOME", getenv("DOCUMENT_ROOT").'/tutorial/' );
define("HOST", "http://localhost/tutorial/");
define("FRAMEWORK", HOME."framework/");

//configuração do Smarty
define("SMARTY_DIR", FRAMEWORK."smarty/");
define("TEMPLATES", HOME."template/");
define("TMP", FRAMEWORK."tmp/");
define("TMP_CACHE", FRAMEWORK."cache/");
//------------------------------------------

/*Aqui fica minha função de autoload para as classes do PHP,
  para quem não conhece essa função aqui no site nos temos um artigo falando sobre a função
*/
function __autoload ($className) {

	if ( file_exists(HOME."controller/{$className}.class.php") ) {
		require_once (HOME."controller/{$className}.class.php");
	}else if( file_exists(HOME."model/{$className}.class.php") ){
		require_once (HOME."model/{$className}.class.php");
	}else if( file_exists(HOME."view/{$className}.class.php") ){
		require_once (HOME."view/{$className}.class.php");
	}else if( file_exists(HOME."lib/{$className}.class.php") ){
		require_once (HOME."lib/{$className}.class.php");
	}else{

		/*Esses são os comandos que irão ser responsáveis por carregar os arquivos Sys do Smarty ou seja o autoload do Smarty
		  mais na frente vocês irão entender o porque eu tirei essa linha de comando do arquivo Smarty.class.php
		*/
		$_class = strtolower($className);
	    if (substr($_class, 0, 16) === 'smarty_internal_' || $_class == 'smarty_security') {
	        include SMARTY_SYSPLUGINS_DIR . $_class . '.php';
	    }

	}

}

//Nessa linha vamos carregar nossa class Smarty que irá gerenciar toda as saidas de HTML do site
require_once(HOME.'framework/smarty/Smarty.class.php');

?>

Agora vamos a explicação do que fizemos nesse arquivo.
No comando define: para quem não conhece esse comando ele é responsável pela declaração de constantes.

Na função "function __autoload ($className) {}":  Esse fantástico recurso permite que você possa carregar suas classes automaticamente, então como esse arquivo será carregado em todas as páginas a função autoload será responsável por carregar as classes do nosso sistema, que poderão ficar nas pastas controller, model, view e lib.

Da linha 32 à linha 35: Essas linhas foram retiradas do arquivo Smarty.class.php que está presente na função de autoload do Smarty, porém se deixarmos ele controlar o autoload não iremos conseguir carregar nossas classes. Essa configuração será necessária para todos que estão seguindo esse tutorial, então vá até o arquivo Smarty.class.php que está dentro da sua pasta smarty presente em framework e então vá até a linha 97 e remova a seguintes linhas de código:

config.inc.php

if (SMARTY_SPL_AUTOLOAD && set_include_path(get_include_path() . PATH_SEPARATOR . SMARTY_SYSPLUGINS_DIR) !== false) {
    $registeredAutoLoadFunctions = spl_autoload_functions();
    if (!isset($registeredAutoLoadFunctions['spl_autoload'])) {
        spl_autoload_register();
    }
} else {
    spl_autoload_register('smartyAutoload');
}

Ufa! Nosso arquivo de config está OK! Mas agora temos que fazer a nossa classe de visualizacao para iniciar corretamente o Smarty.

Ué mas porque?

1 - Precisamos extender a classe Smarty evitando assim que futuras atualizações não possa causar problemas no nosso sistema que está o utilizando, dessa forma é necessários criar uma nova classe.

2 - Nessa classe podemos criar nosso proprios métodos para manipulação de templates e coisas relavantes a saida HTML. Então segue o código já pronto da classe que eu fiz que extende a classe Smarty. Detalhe no método getInstance que será explicado nos próximos artigos onde falaremos mais de MVC Essa classe vai ficar dentro da nossa pasta view.

Visao.class.php


<?php
/***************************************************************************
 *
 *   Copyright PEDRO LUCAS DA SILVA JUNIOR
 *   Site da empresa: http://www.webleaders.com.br/
 *
 ***************************************************************************
 *
 *	 Classe para controle do framework Smarty
 *
 ***************************************************************************/

class Visao extends Smarty{

	private static $instancia;

	public function Visao(){

		parent::__construct();

		$this->template_dir	= TEMPLATES;
		$this->compile_dir		= TMP;
		$this->cache_dir    	= TMP_CACHE;
		$this->caching = false;
		$this->variavel('host',HOST);

	}

	/**
	 * Atribuir um valor a variável de template
	 *
	 * @param string $nome
	 * @param mixed $valor
	 */
	public function variavel($nome,$valor){
		$this->assign($nome,$valor);
	}

	/**
	 * mostrar na tela
	 *
	 * @param string $template
	 * @param int $id
	 */
	public function visualizar($template,$id=""){
		$this->display($template,$id);
	}

	public static function getInstance() {

		if (! isset ( self::$instancia )) {

			try {
				self::$instancia = new Visao ();
			} catch ( Exception $e ) {
				echo 'Temporáriamente indisponível';
				exit ();
			}

		}

		return self::$instancia;

	}

}

Pronto!! Agora já podemos usar o Smarty com tudo configurado.  Só para sentir o gostinho do que virá nos próximos artigos, vamos criar um arquivo com o nome de index.php na raiz da nossa aplicação e outro com o nome de index.tpl dentro da pasta template e coloque os seguinte códigos.

index.php

<?php
require_once("includes/config.inc.php");

$smarty = new Visao();

$smarty->variavel("titulo","Olá mundo");
$smarty->variavel("mensagem","Olá mundo");

$smarty->visualizar("index.tpl");

?>

index.tpl

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
	<title>{$titulo}</title>
	<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1" />
	<meta name="content-language" content="pt-br" />
</head>

<body>

{$mensagem}

</body>
</html>

No arquivo index.php quando nós criamos uma instância da classe Visao, perceba que não foi necessário informar o arquivo, pois quando o PHP percebe que ainda não foi carregada a classe é enviado um pedido para a classe __autoload passando como parametro o nome da classe.

No próximo artigo iremos mais a fundo com os novos recurso do Smarty 3.0 e sobre MVC, tudo isso no nosso caminho que vamos percorrer para chegar no nosso último tutorial onde iremos criar um pequena aplicação utilizando tudo o que foi estudado nos artigos.

Obrigado galera e até a próxima!

Dúvidas e opiniões por favor postem nos comentários que eu irei responder sem sombra de dúvidas.

Arquivos do tutorial: Arquivos do tutorial Smarty + MVC

Classes em php

Posted on julho 12, 2010

Posted by Rodrigo Ireno

Antes de ler este artigo.

Se você não conhece nada de php veja: Primeiros passos com php

E se não conhece nada sobre programação orientada a objetos veja: Conceitos básicos de POO – Abstração e Modularização

Se já leu estes artigos ou já conhece o assunto, vamos proseguir.

Neste artigo vou mostrar como fazer classes em php, porém antes de falar de classes é preciso antes falar de orientação a objetos. Caso você não tenha nenhum conhecimento de orientação a objetos, leia este artigo que escrevi sobre:

Abstração e modularização.

Se já sanou suas dúvidas sobre POO (programação orientada a objetos) vamos prosseguir, visto que já leu ou procurou sobre tal assunto vou utilizar termos referentes a tal assunto.

Regras básicas para se construir uma classe em php:

  • O arquivo deve ter o mesmo nome da classe
  • O nome da classe deve sempre iniciar com letra maiúscula
  • Toda classe deve sempre iniciar com a palavra chave class

Seguindo estas regras podemos então, ter a classe da seguinte forma:

<?php

class Pessoa{
	private $nome;
	private $cpf;

	//Método construtor
	public function Pessoa($nome, $cpf){
		$this->nome = $nome;
		$this->cpf = $cpf;
	}

	//Métodos de acesso
	public function getNome(){
		return $this->nome;
	}

	public function getCpf(){
		return $this->cpf;
	}

	//Métodos modificadores
	public function setNome($novoNome){
		$this->nome = $novoNome;
	}

	public function setCpf($novoCpf){
		$this->cpf = $novoCpf;
	}

	//Outros métodos

	public function mostraDados(){
		echo "O nome é: ".$this->nome."<br />
		     "e o cpf é: ".$this->cpf;
	}
}

?>

Como visto no exemplo acima o nome do método construtor deve ser o mesmo nome da classe. Sempre, caso contrário não será considerado um método construtor. Fica inicialmente  a dúvida de porque fazer “métodos de acesso” e “métodos modificadores”, pois bem. Tudo isso é feito para manter o encapsulamento do objeto pessoa.
Por hora basta saber que uma classe que é construída de forma a tornar o objeto bem encapsulado é uma boa prática de programação.

Como isso acontece?

Através das palavras chave public, private.

Essas palavras especificam a visibilidade de elementos da classe. Por exemplo, veja no exemplo anterior que declarei que os atributos da classe (cpf e nome) são private, ou seja, eles só podem ser referenciados diretamente de dentro da classe. Visto que ações externas não podem alterá-las ou acessá-las, foi preciso então utilizar-se de métodos que auxiliassem esta relação. São os chamados métodos de acesso e modificadores.

Em outras linguagens como Java é possível declarar public ou private para a própria classe.

Vejamos agora um exemplo funcionando do nosso objeto Pessoa.

Crie um arquivo com o nome de Pessoa.class.php. Por favor, por questão de organização tenha o costume de dar a seguinte extensão para arquivos que contém classes “.class.php”. Veja que o “ponto class” (.class) na verdade ainda é parte do nome, e que a verdadeira extensão ainda é (.php).

Crie e copie o exemplo 1 para dentro deste arquivo e salve. Agora veremos o exemplo 2.

<?php
//incluo minha classe neste arquivo
include_once("Pessoa.class.php");

//Instanciando ou Inicializando um objeto

// A variavel abaixo poderia se chamar joaozinho, caso vocÊ queira
	$obj = new Pessoa("Objota",333);

// Acesso o método modificador com (->), e altero cpf para '222'
	$obj->setCpf(222);

// Por fim chamo o método que mostra na tela
	$obj->mostraDados();

?>

Salve este arquivo com o nome de executar.php. jogue os dois arquivos dentro da pasta htdocs do seu servidor apache. E veja o que acontece. Se tudo der certo você verá a seguinte mensagem na tela:

O nome é: Objota
e o cpf é: 333

Obs: Lembrando que o método echo, nativo do php, imprime na tela toda string a sua frente até encontra um “;” (ponto-e-vírgula) que indica o final de uma linha de comando.

Veja também, um exemplo classe em java: Construindo uma classe
e note como é muito parecido com php.

Este artigo finaliza aqui. Dúvidas por favor deixe nos comentários. Até a próxima.

Hello World em php

Posted on julho 5, 2010

Posted by Rodrigo Ireno

PHP (um acrônimo recursivo para "PHP: Hypertext Preprocessor") é uma linguagem de programação de computadores interpretada, livre e muito utilizada para gerar conteúdo dinâmico na Web.

Algumas pessoas se confundem com php e javascript, desde já esclareço. PHP é uma linguagem que é executada pelo servidor web e o javascript é executado pelo navegador do usuário.

A linguagem surgiu por volta de 1994, como um pacote de programas CGI criado por Rasmus Lerdorf, com o nome Personal Home Page Tools, para substituir um conjunto de scripts Perl que ele usava no desenvolvimento de sua página pessoal. Em 1997 foi lançado o novo pacote da linguagem com o nome de PHP/FI, trazendo a ferramenta Forms Interpreter, um interpretador de comandos SQL.

A atual versão é a 5, que possibilita utilizar diversos recursos de orientação a objetos. E ela já está caminhando firme rumo a versão 6, com certeza com mais recursos ainda.

É uma linguagem, em essência, muito parecida com C e C++. E o detalhe é que seu compilador é feito em C. Está disponível para diversos sistemas operacionais: Windows, Linux Mac OS são alguns deles.

Neste artigo quero mostrar como instalar o php e publicar um simples exemplo de script em PHP. A plataforma que irei utilizar é windows.

Para começar vamos fazer download do xampp. Um aplicativo que instala em sua máquina todas as ferramentas necessárias para se iniciar um estudo de php sendo:

  • O compilador do php
  • Banco de Dados MySQL - e a ferramenta phpMyAdmin
  • E o todo poderoso servidor Apache

Além de alguns ítens de série, mas por hora não vem ao caso.

Entendendo as três coisas. O compilador lê o seu código interpreta e executa; O banco de dados armazena dados (que novidade); E o Apache é um software para servidores web que recebe requisições e devolve uma página para o browser.

Um exemplo de requisição:
www.google.com.br

Ou seja, requisição quem faz é o usuário através do browser.

faça download do xampp

Sua instalação é extremamente simples, vai apertando "Next" ou "Próximo" até ele instalar. No meio dessa história o instalador vai te perguntar onde arquivar o xampp, lembre bem onde ele será arquivado.

Depois de instalado, encontre a pasta xampp e dentro dela encontre a pasta htdocs, pois é lá que os scripts php devem ficar para que sejam executados.

C: CaminhoQueVocêEscolheu/xampp/htdocs

( "C:" também era um exemplo, você também pode instalar em outras partições de seu computador ).

Feito isso, já temos como fazer um Hello World. Podemos usar o bloco de notas para escrever o script, salvar com a extensão “.php”, porém profissionais da área utilizam ferramentas especializadas em lidar com esta linguagem, são as chamadas  IDE's,  ( Integrated Development Environment) - Ambiente Integrado de Desenvolvimento.

Existem vários editores no mercado, a maioria freeware. Eu utilizo ZendStudio, uma excelente ferramenta para desenvolvimento web, e vai bem além de php. Outra também para iniciar e nada mais que isso seria o Dreamweaver, mas ainda assim recomendo o ZendStudio.
Bom vamos ao "Hello World";

Inicie seu bloco de notas e digite:

<?php

echo "Hellow World";

?>

Salve este arquivo dentro do diretorio ( pasta)  htdocs com a extensão “.php”, pode ser com o nome teste.php

Depois disso, inicie seu browser e digite:

http://localhost/teste.php

Se tudo der certo você verá a frase "Hello World" escrito na tela do navegador.

Pronto, você já fez, provavelmente,  seu primeiro script em php.
Dúvidas ou sugestões deixem um comentário. Abraços 😉