<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Technócil &#187; OOP</title>
	<atom:link href="http://technocil.com/category/oop/feed/" rel="self" type="application/rss+xml" />
	<link>http://technocil.com</link>
	<description></description>
	<lastBuildDate>Tue, 20 Apr 2010 22:15:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Introdução ao ACL do CakePHP</title>
		<link>http://technocil.com/2010/04/20/introducao-ao-acl-do-cakephp/</link>
		<comments>http://technocil.com/2010/04/20/introducao-ao-acl-do-cakephp/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 22:15:05 +0000</pubDate>
		<dc:creator>Tobias</dc:creator>
				<category><![CDATA[Desenvolvimento web]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ACL]]></category>
		<category><![CDATA[ACO]]></category>
		<category><![CDATA[ARO]]></category>
		<category><![CDATA[controle de acesso]]></category>

		<guid isPermaLink="false">http://technocil.com/?p=343</guid>
		<description><![CDATA[E ae blz?
Novamente, como sempre, igual todas vezes anteriores, mais um post meu saiu de uma conversa que tive no gtalk/msn com alguém, dessa vez foi uma sugestão do João que escreve aqui no technócil comigo, falar sobre o Access Control Lists do CakePHP.
Então vamo lá, 
Eu comecei esse post planejando falar sobre ACL num [...]]]></description>
			<content:encoded><![CDATA[<p>E ae blz?</p>
<p>Novamente, como sempre, igual todas vezes anteriores, mais um post meu saiu de uma conversa que tive no gtalk/msn com alguém, dessa vez foi uma sugestão do <a href="http://www.joaovagner.com.br/">João</a> que escreve aqui no technócil comigo, falar sobre o <strong><a href="http://book.cakephp.org/view/171/Access-Control-Lists">Access Control Lists</a></strong> do <strong><a href="http://cakephp.org/">CakePHP</a></strong>.</p>
<p>Então vamo lá, </p>
<p>Eu comecei esse post planejando falar sobre ACL num post só, mas vi que seria impossível por que o post ia ficar imenso e no final dele você já teria esquecido o começo então resolvi separar o post em partes.</p>
<p>&#8211;Introdução ao ACL do CakePHP<br />
&#8211;ACL na prática, controla os acesso tudo amigo!&#8230; (hehe o final é título provisório, to criativo hoje)</p>
<p>O objetivo deste post é só introduzir <del datetime="2010-04-20T21:12:57+00:00">huhuhu!</del> os programadores aos conceitos do ACL, <del datetime="2010-04-20T21:12:57+00:00">até por que postar tudo deixaria o post grande pra c@#%&#038;*#, etc, etc&#8230;</del> que são na verdade o mais complicado de se entender, depois que os conceitos já estão, digamos, entendidos, a implementação é bem mais rápida&#8230;</p>
<p>O Access Control Lists, <strong>O mano ACL</strong> para os íntimos, <strong>é um componente que faz parte do core do framework CakePHP</strong>, e tem por finalidade <strong>oferecer uma forma poderosa de controle e níveis de acesso</strong> a determinadas áreas das aplicações. </p>
<p>Uma coisa <strong>muito importante que confunde muito</strong> quem está estudando o ACL pela primeira vez é, <strong>o ACL não faz autenticação ele só facilita a gerência dos níveis, usuários e áreas de acesso</strong>.</p>
<p><strong>Resumindo, o que ele faz é dizer quem pode acessar o que, e só. </strong></p>
<p>O ACL usa dois tipos de definições como convenção para facilitar o controle de acesso, são elas:</p>
<p><strong>ACO</strong> = Access Control Object, algo que é acessado.</p>
<p><strong>ARO</strong> = Access Request Object, quem ou o que acessa algo.</p>
<p>Fazendo uma analogia ao modelo que é geralmente usado pela grande maioria dos programadores, um exemplo de como seriam identificados os controles e níveis de acesso do blog usando ACL, você teria o seguinte cenário.</p>
<p><strong>AROs &#8211; Tipos/Grupos de usuários, usuários</strong><br />
Tipos de Usuários:<br />
&#8211;Admin<br />
&#8211;Editors<br />
&#8211;Guest</p>
<p>Usuários:<br />
&#8211;Tobias<br />
&#8211;João Vagner<br />
&#8211;Editor<br />
&#8211;Visitante</p>
<p><strong>ACOs &#8211; Áreas protegidas</strong><br />
&#8211;Posts<br />
&#8211;Páginas<br />
&#8211;Links<br />
&#8211;Plug-ins<br />
&#8211;Ferramentas<br />
&#8211;Usuários<br />
&#8211;Configurações</p>
<p>O ACL tem uma estrutura do tipo árvore e que pode aceitar heranças de permissões de acesso.</p>
<p>Seguindo o exemplo acima poderia ter uma árvore de permissões da seguinte maneira.<br />
<code><br />
Admins (permissões de acesso: todas as áreas)<br />
--João Vagner (herda todas as permissões do grupo)<br />
--Tobias (herda todas as permissões do grupo)</p>
<p>Editors ( permissões de acesso: ( posts (read,add,edit) )<br />
--editor (herda permissões do grupo, usuários (edit:id = editor.id)) </p>
<p>Guest (posts,pages,links(read))<br />
--visitante(herda permissões)<br />
</code></p>
<p>WTF? É o que você que nunca mexeu com ACL deve estar no momento né? Relaxa vou explicar o que eu quis dizer com o texto em negrito acima.</p>
<p>Do ponto de vista do ACL tanto os <strong>grupos de usuário</strong>, quanto os <strong>usuários</strong> são coisas do mesmo tipo,  <strong>são coisas que acessam coisas</strong>, e graças a metodologia de árvore essas coisas <strong>podem herdar</strong> permissões de acesso.</p>
<p>No caso do primeiro grupo, Admins, não há nada de especial ou misterioso, o grupo admin tem acesso a tudo e todos os usuários pertencentes a esse grupo herda suas permissões, moleza se você precisa de um controle de acesso simples assim você nem precisa de ACL.</p>
<p>Vamos ao segundo exemplo, esse sim tem algo de interessante e pra alguns pode ter sido meio confuso.</p>
<p><code>Editors ( permissões de acesso: ( posts (read,add,edit) )</code><br />
Traduzindo: O grupo Editors tem acesso ao controle posts e tem permissões para efetuar read, add, edit.</p>
<p>O que são essas permissões de read, add, edit? São permissões que você define de acordo com a sua necessidade, eu usei essas por que são as mais básicas, quase um default para exemplos.</p>
<p>Continuando&#8230;<br />
<code>--editor (herda permissões do grupo, usuários (edit:id = editor.id))</code><br />
Traduzindo: O usuário (ARO) editor <strong>herda as permissões</strong> do grupo editors e tem a permissão específica de edit a determinada id do controllers usuários, o que significa que <strong>ele pode editar as próprias informações de usuário, mas não pode editar os dados de outros usuários</strong>.</p>
<p><code>Guest (posts,pages,links(read))<br />
--visitante(herda permissões)</code><br />
E para todos os visitantes a permissão de ler posts, pages e links.</p>
<p>Como o objetivo desse post é fazer os conceitos serem entendidos não vou postar códigos eles ficam pro próximo post, bom feriado pra todos, e novamente, como sempre, igual a todas as vezes, dúvidas, sugestões e puxões de orelha os comentários tão ai pra isso.</p>
<p>flw ae :)</p>
]]></content:encoded>
			<wfw:commentRss>http://technocil.com/2010/04/20/introducao-ao-acl-do-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magento E-Commerce</title>
		<link>http://technocil.com/2010/02/21/magento-e-commerce/</link>
		<comments>http://technocil.com/2010/02/21/magento-e-commerce/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 13:49:57 +0000</pubDate>
		<dc:creator>João Vagner</dc:creator>
				<category><![CDATA[Desenvolvimento web]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[ecommerce]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[varien]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://technocil.com/?p=341</guid>
		<description><![CDATA[Quem nunca ouviu falar hoje em dia de uma das ferramentas mais completas para e-commerce disponíveis gratuitamente, se você nunca ouviu falar, esta na hora de de atualizar hein?

O Magento se tornou hoje a principal ferramenta para comercio eletrônico, alem de completo, tem a robustez do Zend Framework, e diversos conceitos de ecommerce e SEO [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } -->Quem nunca ouviu falar hoje em dia de uma das ferramentas mais completas para e-commerce disponíveis gratuitamente, se você nunca ouviu falar, esta na hora de de atualizar hein?</p>
<p><img class="alignleft" src="http://www.magentocommerce.com/img/logo.gif" alt=" Magento Ecommece" /></p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		A:link { so-language: zxx } -->O Magento se tornou hoje a principal ferramenta para comercio eletrônico, alem de completo, tem a robustez do Zend Framework, e diversos conceitos de ecommerce e SEO otimizados. Tudo, quer dizer, quase tudo hoje se faz no magento sem muitas dificuldades. Alem do Zend Framework por  traz em seu código, ele implementa todas as possibilidades do <a href="http://pear.php.net/">Pear</a>, traz consigo uma estrutura de canais para módulos aonde a comunidade desenvolve, e você pode usufruir muito bem através de alguns comandos práticos e simples.</p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } -->O Magento também esta disponível por SVN, o que facilita muito o desenvolvimento, e um padrão / qualidade de código excelente. As instalações do magento são simples, e pode ser feita muito simplesmente por qualquer um com acesso ao SSH da conta. Praticidade total. O Próximo artigo dessa serie sera a instalação e configuração básica da loja, cache, e módulos Claro, depois de nossa introdução a alguns conceitos aplicados pelo magento, tanto em código, quanto em uso de sistema.</p>
<h2>1 &#8211; Estrutura básica de trabalho.</h2>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		A:link { so-language: zxx } -->Existe um bom senso para se trabalhar com o magento, uma estrutura compartilhada segura muito bem, claro, desde que configurado para se tornar leve, trabalhar com cache.  <a href="http://www.magentocommerce.com/system-requirements">Veja aqui os requisitos que o magento necessita para um BOM desempenho em produção.</a> Mas iremos ver isso mais para a frente. Agora e hora da nossa introdução a pastas do Magento. Pastas nos quais iremos ter acesso para upload e modificação de arquivos.</p>
<ul>
<li>app  <em>- Pasta da sua aplicação</em>
<ul>
<li>code - <em>Pasta do seus modulos</em>
<ul>
<li>comunity</li>
<li>core</li>
<li>local</li>
</ul>
</li>
<li>design -<em> Pasta aonde toda a estrutura de layout, blocos,  xml e xhtml (.phtml), sao armazenados</em>
<ul>
<li>adminhtml</li>
<li><strong>frontend</strong></li>
<li>install</li>
</ul>
</li>
<li>etc &#8211; <em>Pasta de XML de configurações de sua loja</em></li>
<li>locale &#8211; <em>Pasta com as linguas instaladas em sua Loja, tipo pt_BR, En, fr_FR, etc</em></li>
</ul>
</li>
<li>media &#8211; Pasta aonde as imagens do seu catalogo sao armazenadas, recortadas e trabalhadas.</li>
<li>var &#8211; Pasta de exportação de dados, backups do banco e etc</li>
<li>skin &#8211; Pasta aonde encontrados o css, javascript e imagem relativa a nosso tema.
<ul>
<li>adminhtml</li>
<li><strong>frontend</strong></li>
<li>install</li>
</ul>
</li>
</ul>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } -->Se você for curioso deve estar se perguntando  porque as pastas <strong>frontend estão</strong> com enfase, simples, porque são elas as responsáveis por nosso front-end, html, css, javascript, blocos, etc. Ali e onde a magica ocorre e o template ou tema toma vida.</p>
<p>Pronto, agora já visto a estrutura de pasta do magento, você já sabe aonde e porque deve mexer, cada coisas em seus lugares formando uma plataforma versátil de comercio eletrônico.</p>
<h2>2 &#8211; O Conceito de &#8220;EAV&#8221; e  Base de Dados.</h2>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } -->O magento trabalha com modelo de EAV em suas tabelas. Agora você desenvolvedor deve estar pensando que a coisa esta se complicando.  Na verdade esta simplificando. Entramos agora no conceito de <strong>E</strong>ntity-<strong>A</strong>ttribute-<strong>V</strong>alue.</p>
<p>O Modelo proposto de EAV e totalmente oposto da modelagem comum, O modelo simples de modelagem seguindo o ER, no futuro traz alguns obstáculos quando  possui uma evolução constante, e muita vezes o modelo de dados tem que se adaptar as novas regras do jogo, e do em questão de compatibilidade, isso se torna bem ruim.</p>
<p><img src="http://weblogs.sqlteam.com/images/weblogs_sqlteam_com/davidm/87/r_Exploded.Jpg" alt="Example EAV Model" /></p>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } -->O Conceito básico do EAV e simples, tenha como ideia guardar o Objeto, o atributo e seus valores de atributos. Você esta bem blindado de mudança nas regras do jogo, pois seu modelo baseado em EAV se adapta com muita facilidade a sua necessidade.</p>
<p>Alguns consideram esse modelo de EAV um erro, eu vejo como um obra prima de engenharia de software. Alem de bem projetado, e muito organizado e sistemático, e possui uma ótima flexibilidade.</p>
<h2>2 &#8211; Instalação, controle de versão e Magento Connect</h2>
<p>O Magento traz soluções maravilhosas para melhorar as tarefas mais chatas dos sistemas hoje disponíveis. A instalação, Upgrades e Updates.</p>
<h3>Subversion (SVN)</h3>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } -->Atualmente você pode fazer um checkout do projeto usando subversion (SVN), que permite flexilidade um bom controle do desenvolvimento e avanços do projeto. Para quem usa Linux e não tem ainda o subversion, basta executar os comandos abaixo:</p>
<p>Vale a dica que para que instalações locais funcionem direitinho, e necessário o uso do Virtual Hosts, porem isso no apache 2 + Linux se torna pratico.</p>
<blockquote><p>$: sudo apt-get install subversion</p></blockquote>
<p>Confirme a instalação dos pacotes necessários, depois basta ir na sua pasta padrão do apache, no meu caso sempre fica na home, chamada sites:</p>
<blockquote><p>$: cd ~/joaovagner/sites/;<br />
$: mkdir magento ;<br />
$: cd magento ;</p></blockquote>
<p>Pronto, já possui sua pasta para o magento, basta agora fazer  o checkout do projeto:</p>
<blockquote><p>$: svn checkout http://svn.magentocommerce.com/source/branches/1.4</p></blockquote>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } -->Pronto, já possui um branche do projeto, ou seja, ele esta pronto para rodar, agora caso queira manter uma workcopy basta fazer checkout do trunk, sempre em desenvolvimento, para isso recomendo uma criação de uma pasta para se manter organizado:</p>
<blockquote><p>$: cd ~/joaovagner/sites/;<br />
$: mkdir magento-trunk ;<br />
$: cd magento-trunk;</p></blockquote>
<p>Agora basta executar o checkout do trunk:</p>
<blockquote><p>$: svn checkout http://svn.magentocommerce.com/source/branches/1.4-trunk</p></blockquote>
<h3>Instalação via SSH</h3>
<p>A instalação por SSH se baseia simplesmente em comandos de download, <a href="http://www.magentocommerce.com/wiki/groups/227/installing_magento_via_shell_ssh">disponivel aqui</a>.</p>
<p>Abaixo os comandos necessários usando wget:</p>
<blockquote><p>//Acesso minha pasta padrão do apache<br />
$: cd ~/joaomedeiros/sites</p>
<p>//Crio uma pasta para o magento<br />
$: mkdir magento</p>
<p>//Acesso a pasta que criei<br />
$: cd magento</p>
<p>//Uso wget para fazer o download dos pacotes, tanto o magento em sí como o arquivo de dados de exemplos<br />
$: wget http://www.magentocommerce.com/downloads/assets/1.4.0.0/magento-1.4.0.0.tar.gz<br />
$: wget http://www.magentocommerce.com/downloads/assets/1.2.0/magento-sample-data-1.2.0.tar.gz</p>
<p>//Descompactação dos pacotes baixados<br />
$: tar -zxvf magento-1.4.0.0.tar.gz<br />
$: tar -zxvf magento-sample-data-1.2.0.tar.gz</p>
<p>// Movemos as imagens de exemplo para a pasta correnta de media<br />
$: mv magento-sample-data-1.2.0/media/* magento/media/</p>
<p>//movendo os registros no banco de exemplo para a a pasta magento</p>
<p>$: mv magento-sample-data-1.2.0/magento_sample_data_for_1.2.0.sql magento/data.sql</p>
<p>//Movendo o .htaccess para interpretação de regras personalizáveis do magento<br />
$: mv magento/* magento/.htaccess .</p>
<p>//Setando permissão de escritas na pasta correta, pois a instalação vai precisar<br />
$: chmod o+w var var/.htaccess app/etc</p>
<p>//Permissão recursiva na pasta de media de imagens de produtos do magento.<br />
$: chmod -R o+w media</p>
<p>//Aqui eu uso o .SQL para inserir dados de exemplo de produtos + CMS + homepage.<br />
$: mysql -h localhost -u seuuserdobanco -psuasenha magento_database &lt; data.sql</p>
<p>//Atualização de pacotes e instalação do canal de upgrade e update do magento connect no pear.<br />
$: ./pear mage-setup .<br />
$: ./pear install magento-core/Mage_All_Latest-stable</p>
<p>//Limpando todos os arquivos desnecessários<br />
$: rm -rf downloader/pearlib/cache/* downloader/pearlib/download/*<br />
$: rm -rf magento/ magento-sample-data-1.2.0/<br />
$: rm -rf magento-1.4.0.0.tar.gz magento-sample-data-1.2.0.tar.gz data.sql</p></blockquote>
<p>Caso esteja em um MAC OS e não possua o Wget, basta usar o CURL, uma alternativa que funciona basicamente como alternativa ao wget, basta substituir o wget por curl -O</p>
<blockquote><p>//mesmo efeito que o wget<br />
$: curl -O http://www.magentocommerce.com/downloads/assets/1.4.0.0/magento-1.4.0.0.tar.gz<br />
$: curl -O http://www.magentocommerce.com/downloads/assets/1.2.0/magento-sample-data-1.2.0.tar.gz</p></blockquote>
<p>Pronto, agora basta acessar a URL localhost e executar a instalação, claro, novamente recomendo o uso do Virtual Hosts para que isso possa fluir melhor.</p>
<p>Agora basta acessar, ai: <a href="http://magento.localhost/">http://magento.localhost/</a> (Interpretando que esse e seu virtual host!)</p>
<p>Caso você utilize Windows, pode usar o pacote <a href="http://www.magentocommerce.com/download">Magento and Zend Server &#8211; Unified Installer </a> e executar sua instalação no Windows com Zend Server e já um pacote do Magento. Eu nunca executei tal teste, não tenho certeza de como funciona e os passos!</p>
<h2>Dicas e macetes em problemas de Instalações + Permissões</h2>
<p>Como ja venho a tempos executando instalações, entendendo os processos e funcionalidades do magento, venho já armazenando e guardando alguns macetes de problemas recorrentes que enfrento, tanto em servidores conhecidos da IW2 como em terceiros, e as vezes ate localmente.</p>
<h3>Instalação e erro 505</h3>
<p>Comigo sempre ocorre de um upgrade ou nova instalação, ocorrer erro500, o famoso &#8220;Internal Server Error&#8221;, isso pode ser corrigido com Shell Script:</p>
<blockquote><p>$: cd magento ;<br />
$: find . -type d -print | xargs chmod 755<br />
$: find . -type f -print0 | xargs -0 -n1 chmod 644<br />
$: chmod 775 app/etc var var/.htaccess &amp;&amp; chmod -R 775 media</p></blockquote>
<p>Problema Resolvido</p>
<h3>Menu Administrativo parou de funcionar! O Que eu faço?!</h3>
<p>Esse problema ocorre devido a compilação do javascript, e simples resolver, e já e um problema frequente:</p>
<p><strong>Passo 1</strong> &#8211; Abrir o Arquivo com problema</p>
<p>O Arquivo que esta causando esse problema se localiza na seguinte path: <em>app/code/core/Mage/Page/Block/Html/Head.php</em></p>
<p>Basta renomear o Head.php para head.php. No Terminal basta executar o comando mv:</p>
<blockquote><p>$: cd magento;<br />
$: mv pp/code/core/Mage/Page/Block/Html/Head.php   app/code/core/Mage/Page/Block/Html/head.php</p></blockquote>
<p><strong>Passo 2 </strong>- Permissões corretas</p>
<p>Esses arquivos precisam de permissões corretas para que o Browser tenha o retorno necessário:</p>
<blockquote><p>$: cd magento;<br />
$: chmod 755 js/ ;<br />
$: chmod 644 js/lib/ ;<br />
$: chmod 644 js/index.php ;</p></blockquote>
<p>Pronto, seu menu está perfeito! Seu Magento esta pronto para trabalhar!</p>
]]></content:encoded>
			<wfw:commentRss>http://technocil.com/2010/02/21/magento-e-commerce/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OOP no PHP: Overloading, utilizando os métodos mágicos do PHP</title>
		<link>http://technocil.com/2009/04/16/oop-no-php-overloading-utilizando-os-metodos-magicos-do-php/</link>
		<comments>http://technocil.com/2009/04/16/oop-no-php-overloading-utilizando-os-metodos-magicos-do-php/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 19:56:43 +0000</pubDate>
		<dc:creator>Tobias</dc:creator>
				<category><![CDATA[Desenvolvimento web]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[call]]></category>
		<category><![CDATA[metodos magicos]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[__call]]></category>

		<guid isPermaLink="false">http://technocil.com/?p=221</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>E aeeeeew blz? Bom gente voltando do período de <strike>preguiça bagarai, vício em jogos online e outras vagabundagens</strike> 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 <a href="http://www.php.net/manual/en/language.oop5.magic.php">métodos mágicos do php</a>.</p>
<p>Neste artigo vou falar do método mágico <em>__call()</em>,  que funciona da seguinte maneira:</p>
<p>Quando uma classe tem o método<em> __call()</em> o php roda esse método sempre que <del datetime="2009-04-22T21:17:59+00:00">qualquer método da classe for chamado, mesmo se o método que foi chamado não existir</del> um método inexistente ou inacessível for chamado (obrigado <a href="http://www.manjaphp.com.br">Edgar</a> pelo puxão de orelha), isso abre espaço para algumas coisas interessantes.</p>
<p>Vamos a um exemplo do funcionamento de <em> __call()</em>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> ExemploCall <span style="color: #009900;">&#123;</span>  
  <span style="color: #000000; font-weight: bold;">function</span> __call<span style="color: #009900;">&#40;</span><span style="color: #000088;">$m</span><span style="color: #339933;">,</span> <span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;Método chamado: <span style="color: #006699; font-weight: bold;">$m</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;Parametros: <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$a</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">x</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$call</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ExemploCall<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$call</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">test</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'teste'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Mostra na tela</span>
<span style="color: #666666; font-style: italic;">/*
Método chamado: test 
Parametros: 
array(3) { 
  [0]=&gt;  int(1) 
  [1]=&gt;  int(2) 
  [2]=&gt;  string(5) &quot;teste&quot; 
} 
*/</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>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 é, <strong>pra que ou onde eu vou usar o método <em>__call()</em>?</strong></p>
<p>A resposta pra essa pergunta vai da sua criatividade mas eu vou postar aqui uma forma de uso que o <a href="http://www.cakephp.org">cakephp</a> usava há algum tempo atrás.</p>
<p>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.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
  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...  
**/</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Model <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> 
  <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//O conteúdo deste método vai variar de acordo com sua classe</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __call<span style="color: #009900;">&#40;</span><span style="color: #000088;">$method</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// Verifica se o método chamado existe nessa classe</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">method_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span><span style="color: #000088;">$method</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #666666; font-style: italic;">//Caso exista chama o método</span>
      <span style="color: #b1b100;">return</span> <span style="color: #990000;">call_user_method</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$method</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> 
    <span style="color: #b1b100;">else</span> 
    <span style="color: #009900;">&#123;</span>
      <span style="color: #666666; font-style: italic;">//Caso não exista, chama um método especial que fará a nossa mágica</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">parseMethods</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$method</span><span style="color: #339933;">,</span><span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> parseMethods<span style="color: #009900;">&#40;</span><span style="color: #000088;">$method</span><span style="color: #339933;">,</span><span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">//Verifica se o método segue o padrão adotado</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">eregi</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'findBy'</span><span style="color: #339933;">,</span><span style="color: #000088;">$method</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span> <span style="color: #009900;">&#41;</span> 
    <span style="color: #009900;">&#123;</span>      
      <span style="color: #666666; font-style: italic;">//Caso não siga dispara um erro dizendo que o método é inválido/não encontrado</span>
      <span style="color: #990000;">trigger_error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Método inválido ou inexistente'</span><span style="color: #339933;">,</span><span style="color: #009900; font-weight: bold;">E_USER_ERROR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
      <span style="color: #990000;">die</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #666666; font-style: italic;">//Caso seja um método padronizado (findByAlgo) recupera o nome do campo e converte tudo para minúsculo</span>
      <span style="color: #000088;">$fieldName</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">str_ireplace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'findBy'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><span style="color: #000088;">$method</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>      
&nbsp;
      <span style="color: #666666; font-style: italic;">//Formata os parametros para serem passados ao método find padrão</span>
      <span style="color: #000088;">$options</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'1'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'conditions'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fieldName</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'0'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">//Chama o método find original</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">find</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>            
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> find<span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#41;</span> 
  <span style="color: #009900;">&#123;</span>    
    <span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">//Aqui você faria a consulta usando as informações recebidas</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Instancia a classe</span>
<span style="color: #000088;">$model</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Model<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Define parametros a serem passados</span>
<span style="color: #000088;">$options</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span>
   <span style="color: #0000ff;">'fields'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'*'</span><span style="color: #009900;">&#41;</span>
  <span style="color: #339933;">,</span><span style="color: #0000ff;">'order'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'nome ASC'</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Chama o método mágico</span>
<span style="color: #666666; font-style: italic;">// Onde o primeiro parametro é o valor que o campo passado no nome do método deve ter.</span>
<span style="color: #000088;">$model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">findByBlog</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Technócio'</span><span style="color: #339933;">,</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
O que chega no método options é:
array(3) { 
    [&quot;fields&quot;] =&gt;  array(1) { 
        [0]=&gt;  string(1) &quot;*&quot; 
    } 
    [&quot;order&quot;] =&gt;  array(1) { 
        [0]=&gt;  string(8) &quot;nome ASC&quot; 
    } 
    [&quot;conditions&quot;] =&gt;  array(1) { 
        [&quot;blog&quot;]=&gt;  string(9) &quot;Technócio&quot; 
    } 
} 
**/</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>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.</p>
<p>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).</p>
]]></content:encoded>
			<wfw:commentRss>http://technocil.com/2009/04/16/oop-no-php-overloading-utilizando-os-metodos-magicos-do-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Bloqueio de rota administrativa do CakePHP</title>
		<link>http://technocil.com/2009/03/12/bloqueio-de-rota-administrativa-do-cakephp/</link>
		<comments>http://technocil.com/2009/03/12/bloqueio-de-rota-administrativa-do-cakephp/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 23:34:56 +0000</pubDate>
		<dc:creator>João Vagner</dc:creator>
				<category><![CDATA[Destaques]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[Desenvolvimento web]]></category>

		<guid isPermaLink="false">http://technocil.com/?p=210</guid>
		<description><![CDATA[Olá Pessoal,
Quem utiliza o Fremwork CakePHP sabe que é uma mão na roda o route admin. Nos poupa um bocado de trabalho criar as funções da administração do site. Isso graças ao &#8220;Bake&#8221; Porém a rota não pode ficar totalmente acessivel a qualquer um, certo? 
O Jonathan Snook  escreveu um artigo em relação a [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal,</p>
<p>Quem utiliza o Fremwork CakePHP sabe que é uma mão na roda o route admin. Nos poupa um bocado de trabalho criar as funções da administração do site. Isso graças ao &#8220;Bake&#8221; Porém a rota não pode ficar totalmente acessivel a qualquer um, certo? </p>
<p>O <em>Jonathan Snook </em> escreveu um artigo em relação a isso, porém em alguns testes por aqui nenhum realmente funcionou utilizando .htaccess para proteção dessa rota com password.</p>
<p><a href="http://snook.ca/archives/servers/password_protect_admin/">Password Protecting Admin Functions in CakePHP</a>.</p>
<p>O Conceito da proteção no artigo do <em>Jonathan Snook </em> é simples, E pode ser gerado com qualquer um que possua acesso ao SSH do site. Não é necessário acesso root para esses tipos de ações no servidor.<br />
Seu servidor não te da acesso ao SSH? Está na hora de mudar para a <a href="http://www.iw2servers.com.br"><strong>IW²</strong></a></p>
<p>O primeiro passo dessa proteção se dá ao inserir seguinte conteúdo no seu <strong>.htaccess</strong> :</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">AuthUserFile <span style="color: #339933;">/</span>diretorio<span style="color: #339933;">/</span>passwd<span style="color: #339933;">/</span>protecao
AuthName <span style="color: #0000ff;">&quot;Administracao CAKE&quot;</span>
AuthType Basic
<span style="color: #b1b100;">Require</span> valid<span style="color: #339933;">-</span>user</pre></td></tr></table></div>

<p>Com acesso ao ssh utilize o seguinte comando dentro da pasta &#8220;www&#8221;.</p>
<blockquote><p>htpasswd -c /diretorio/passwd/protecao username</p></blockquote>
<p>.<br />
Isso gera um arquivo com a senha criptografada! Caso queira barar o arquivo gerado para verificar fiquem à vontade!</p>
<p>Bons testes, aqui nunca funcionou!</p>
<h3>Meu jeitinho</h3>
<p>A maneira no qual eu utilizo é a verificação simples de variavel, ou seja, apenas um usuário dentro do código no qual após o POST, verifica os dados, e grava uma sessão, se os mesmos forem iguais.</p>
<p>Primeiro passo é abrir o seu <strong>/app/config/routes.php</strong>, e crie uma rota chamada <strong>admin</strong>, usando o controller de páginas estáticas. Veja:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">Router<span style="color: #339933;">::</span><span style="color: #004000;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/admin/'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'controller'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'pages'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'display'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'admin'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Agora crie um arquivo chamado <strong>admin.ctp</strong> dentro da pasta /app/views/pages/ com um formulário básico para login e senha:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>  
<span style="color: #666666; font-style: italic;">//Define o layout padrão para a página</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">layout</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'admin'</span><span style="color: #339933;">;</span> 
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;h1&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> __<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Administração'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/h1&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span>   
<span style="color: #666666; font-style: italic;">// Caso ocorra algum erro, é exibido em sua div correta!</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$error</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>   
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;div class='error'&gt;&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$error</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&lt;/div&gt;&quot;</span><span style="color: #339933;">;</span>   
<span style="color: #009900;">&#125;</span>   
<span style="color: #000000; font-weight: bold;">?&gt;</span>   
<span style="color: #000000; font-weight: bold;">&lt;?php</span> 
<span style="color: #666666; font-style: italic;">/*
criamos um formulário com o vetor User, indicando a rota /admin/login, onde teremos nossa verificação de usuário e senha para registro da sessão da administração, e acesso ao restante dos actions _admin_
*/</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">create</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'User'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'url'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'/admin/login/'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>   
&lt;fieldset&gt;
    &lt;legend&gt;Digite os dados&lt;/legend&gt;   
        <span style="color: #000000; font-weight: bold;">&lt;?php</span>  <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">input</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'username'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Login'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
        <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">input</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'password'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'label'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Senha'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'id'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Senha'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>   
  <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$form</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">end</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Logar!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>   
   &lt;/fieldset&gt;
&lt;/form&gt;</pre></td></tr></table></div>

<p>O próximo passo é criar uma nova rota no <strong> /app/config/routes.php</strong>, rota no qual foi definida na URL do nosso formulário, onde será submetida os dados para verificação.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">Router<span style="color: #339933;">::</span><span style="color: #004000;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/admin/login/'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'controller'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'users'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'action'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'admLogin'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Claro, obviamente eu já possuo um controller chamado users, caso não tenha, pode cria-lo, utilizando o código abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> UsersController <span style="color: #000000; font-weight: bold;">extends</span> AppController <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Users'</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$helpers</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Html'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Form'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/*
Claro, que aqui irão outras actions suas ;)
*/</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> admLogin<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>   
	    <span style="color: #666666; font-style: italic;">//verifica se o post possui alguma informação para registrar o nosso array com informações</span>
	    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>   
                <span style="color: #000088;">$dbuser</span>	<span style="color: #339933;">=</span>       <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'username'</span><span style="color: #339933;">==</span><span style="color: #0000ff;">'Administrador'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'password'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'Sua_senha_aqui'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	           <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'User'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$dbuser</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'username'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> 
                         <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'User'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$dbuser</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>  <span style="color: #009900;">&#123;</span>   
                                 <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$dbuser</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
                                 <span style="color: #666666; font-style: italic;">// registra a sessão &quot;admin&quot; para futuras verificações</span>
                                 <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFlash</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Logado com sucesso'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
                                 <span style="color: #666666; font-style: italic;">//Notifica o sucesso ao logar!</span>
                                 <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/admin/users/index'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
                                 <span style="color: #666666; font-style: italic;">// redireciona para a action index do controller users.</span>
	        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>   
	              <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFlash</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Erro! Dados inválidos'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                          <span style="color: #666666; font-style: italic;">// notifica o erro    </span>
	        <span style="color: #009900;">&#125;</span>   
	    <span style="color: #009900;">&#125;</span>   
	<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Note que por enquanto o nosso controller users possui apenas um action. Fica a seu critério a criação do resto do conteúdo ;) </p>
<p>Agora iremos criar a função para verificação da sessão:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
	<span style="color: #000000; font-weight: bold;">function</span> checkAdminSession<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>   
               <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">check</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'admin'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>   
               <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Session</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFlash</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Você não tem acesso a essa área'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
               <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/admin/login/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
    <span style="color: #009900;">&#125;</span>   
<span style="color: #009900;">&#125;</span>   
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>A minha recomendação é que coloque essa função dentro do arquivo <strong>/app/app_controller.php</strong> no qual o cake carrega automáticamente. Esse arquivo serve para colocar as funções que vai utilizar em todos os controllers, sem a necessidade de ficar repetindo os mesmos.</p>
<p>Agora vem a parte mais interessante, vamos inserir o beforeFilter(); também dentro do <strong>/app/app_controller.php</strong>, para verificação do parametro /admin/ na url, e execução da verificação da sessão. Veja:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> beforeFilter<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>   
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'admin'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>   
           <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">checkAdminSession</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   
    <span style="color: #009900;">&#125;</span>   
 <span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p><strong>O que a função faz é:</strong> Se existe algum parametro na url &#8220;admin&#8221;, executa a função checkAdminSession e veja se existe a sessão &#8220;admin&#8221;. Se não existir a sessão, a checkAdminSession redireciona para login. </p>
<p>Pronto, e assim você tem uma certa segurança em relação a rota /admin/ não estar sendo visualizada por tudo e por todos! </p>
]]></content:encoded>
			<wfw:commentRss>http://technocil.com/2009/03/12/bloqueio-de-rota-administrativa-do-cakephp/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>OOP no PHP: Reaproveitamento, Sobrescrevendo métodos</title>
		<link>http://technocil.com/2008/12/17/oop-no-php-reaproveitamento-sobrescrevendo-metodos/</link>
		<comments>http://technocil.com/2008/12/17/oop-no-php-reaproveitamento-sobrescrevendo-metodos/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 22:09:43 +0000</pubDate>
		<dc:creator>Tobias</dc:creator>
				<category><![CDATA[Desenvolvimento web]]></category>
		<category><![CDATA[Destaques]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://technocil.com/?p=163</guid>
		<description><![CDATA[E ae blz?
Chegamos numa das partes interessantes da nossa série de posts, é onde começo a falar das gambiarras técnicas usadas por nós programadores para salvar horas de trabalho no desenvolvimento.
Para ilustrar o post de hoje vou usar um caso que aconteceu comigo a algum tempo. Na empresa onde trabalho, fizemos um sistema publicador de [...]]]></description>
			<content:encoded><![CDATA[<p>E ae blz?</p>
<p>Chegamos numa das partes interessantes da nossa série de posts, é onde começo a falar das <strike style="text-decoration:line-through;">gambiarras</strike> técnicas usadas por nós programadores para salvar horas de trabalho no desenvolvimento.</p>
<p>Para ilustrar o post de hoje vou usar um caso que aconteceu comigo a algum tempo. Na empresa onde trabalho, fizemos um sistema publicador de sites, um CMS próprio desenvolvido aqui, e que um belo dia recebi um pedido para incluir nele uma espécie de lixeira.</p>
<p>Bom para implementar essa feature a solução sugerida foi criar uma coluna em cada tabela com o nome de trash e que teria valor default 0 e quando um item fosse deletado esse valor seria alterado para 1.</p>
<p>Tendo isso em mente comecei a implementação, alterar o banco foi moleza, agora eu precisava implementar essa condição no sistema. Foi quando me deparei com a seguinte situação, teria que alterar cada uma das chamadas do método <acronym title="Método responsável pelas consultas no banco."><em>findAll()</em></acronym> em todo o sistema, pensei,&#8230; pensei,&#8230; e quando já não via mais solução pra isso um amigo sugeriu &#8220;<em>pow, sobrescreve findAll() que tu evita esse trabalhão</em>&#8220;, e assim foi feito :).</p>
<p>Agora que vocês já sabem o problema vou mostrar a solução que eu usei nessa situação.</p>
<p>Eu tinha em em mãos as classes Model, AppModel e uma classe pra cada um dos models específicos (sim, usamos <a href="http://www.cakephp.org">CakePHP</a>).</p>
<p>A classe Model é a base de toda interação com o banco, é uma classe do core do framework extendida pela classe AppModel.</p>
<p>A AppModel é uma classe feita exatamente para esse fim, ela inicialmente é vazio e só extende a classe Model do framework e é extendida pelos models da aplicação, ou seja, é usada por todos os models do sistema e ainda herda o método que eu preciso sobrescrever, tudo que eu precisava.</p>
<p>O método findAll original dentro da classe Model é tem essa estrutura de parâmetros: </p>
<pre lang="php" line="1" colla="+">
<?php
class Model {
	...
	function findAll($conditions = null, $fields = null, $order = null, $limit = null, $page = 1, $recursive = null) {
		...
	}
	...
}
?>
</pre>
<p>A método sobrescrito na AppModel ficou assim:</p>
<pre lang="php" line="1" colla="+">
<?php
class AppModel extends Model {
	...
	function findAll($conditions = array(), $fields = null, $order = null, $limit = null, $page = 1, $recursive = null) {
		$new_conditions = array();
		if (!is_array($conditions))
			$new_conditions[] = $conditions;
		else
			$new_conditions = $conditions;

		if (!$this->findInTrash)
			$new_conditions += array($this->name.'.trash' => '0');

		return parent::findAll($new_conditions, $fields, $order, $limit, $page, $recursive);
	}
	...
}
?>
</pre>
<p>Antes de mais nada vou avisar o óbvio, só coloquei aqui os códigos necessários para explicar o post as classes são bem maiores que isso ;).</p>
<p>Notem também que eu não mudei os parametros usados no método mas poderia faze-lo se fosse necessário, esse método recebe todos os paramêtros possíveis no <em>findAll</em> original, altera as condições necessárias e chama o método findAll da classe pai usando o <em>parent::</em>.</p>
<p>Nesse caso em particular eu só precisava sobrescrever o método para adicionar uma condição específica, mas dependendo do caso talvez você precise que um mesmo método seja chamado de formas diferentes ou com uma quantidade de parâmetros diferentes, o que também poderia ser feito, mas isso já é assunto para um próximo post.</p>
<p>Dúvidas? sugestões? puxões de orelha? comentários tão ai pra isso.</p>
<p>Um abraço e até o próximo post.</p>
]]></content:encoded>
			<wfw:commentRss>http://technocil.com/2008/12/17/oop-no-php-reaproveitamento-sobrescrevendo-metodos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>OOP no PHP: Heranças e Interfaces, extendendo e implementando classes</title>
		<link>http://technocil.com/2008/12/15/oop-no-php-herancas-e-interfaces-extendendo-e-implementando-classes/</link>
		<comments>http://technocil.com/2008/12/15/oop-no-php-herancas-e-interfaces-extendendo-e-implementando-classes/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 15:00:39 +0000</pubDate>
		<dc:creator>Tobias</dc:creator>
				<category><![CDATA[Desenvolvimento web]]></category>
		<category><![CDATA[Destaques]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[extends]]></category>
		<category><![CDATA[herança]]></category>
		<category><![CDATA[implements]]></category>
		<category><![CDATA[interfaces]]></category>

		<guid isPermaLink="false">http://technocil.com/?p=153</guid>
		<description><![CDATA[E ae blz?
Bom gente depois de um alguns dias atrasado devido a problemas pessoais aqui vai o segundo post da série OOP no PHP, nossos assuntos agora são Heranças e Interfaces, e aproveitando o assunto eu preparei uma classe de acesso ao banco de dados que ilustra perfeitamente o nosso assunto de hoje e também [...]]]></description>
			<content:encoded><![CDATA[<p>E ae blz?</p>
<p>Bom gente depois de um alguns dias atrasado devido a problemas pessoais aqui vai o segundo post da série OOP no PHP, nossos assuntos agora são Heranças e Interfaces, e aproveitando o assunto eu preparei uma classe de acesso ao banco de dados que ilustra perfeitamente o nosso assunto de hoje e também usa as definições do post anterior.</p>
<p>Vamos começar com a teoria:</p>
<p><strong><em>extends</em></strong> &#8211; Essa palavra chave indica que uma classe extende outra classe, ou seja, herda todos os métodos e atributos da classe pai.</p>
<p>Exemplos simples:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Pai <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> pai<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> “Função da classe pai”<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Filha <span style="color: #000000; font-weight: bold;">extends</span> Pai <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #000088;">$filha</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> chamaPai<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pai</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> responde<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Sou uma classe filha'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>No exemplo acima estão disponívels na classe filha todos os métodos/atributos públicos e protegidos (quando existerem) da classe pai.</p>
<p><strong><em>implements</em></strong> – Essa aqui é um pouco diferente, ela define que uma determinada classe implemente uma interface, que nada mais é uma que uma definição de nomes e parametros de cada método da classe, porém, a real utilidade das interfaces é mais conceitual no mundo OOP e na maioria das vezes é deixada de lado.</p>
<p>vamos a um exemplo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">interface</span> iFilha <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> chamaPai<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> responde<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Pai <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> pai<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> “Função da classe pai”<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Filha <span style="color: #000000; font-weight: bold;">extends</span> Pai implements iFilha <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #000088;">$filha</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> chamaPai<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pai</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> responde<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Sou uma classe filha'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Algumas considerações interessantes sobre interfaces:</p>
<ul>
<li>Somente métodos públicos aparecem nas interfaces;</li>
<li>Uma classe pode implementar mais de uma interface;</li>
<li>Uma classe não pode implementar duas interfaces com métodos de nomes iguais;</li>
<li>Interfaces podem ser herdadas assim como classes, basta usar extends.</li>
</ul>
<p>Bom acho que deu pra entender como funcionam essas coisas, então vamos pra um exemplo de uso nessa classe de acesso ao banco que eu fiz pra ajudar o nosso entendimento.</p>
<p>config.php</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Config <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">const</span> DB_HOST 	<span style="color: #339933;">=</span> <span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">const</span> DB_USER 	<span style="color: #339933;">=</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">const</span> DB_PASS 	<span style="color: #339933;">=</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">const</span> DB_SCHEMA <span style="color: #339933;">=</span> <span style="color: #0000ff;">'technocil'</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">const</span> DB_ENCODING <span style="color: #339933;">=</span> <span style="color: #0000ff;">'UTF8'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>dbo_mysql.php</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #b1b100;">require</span> <span style="color: #0000ff;">'config.php'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">interface</span> iDBOMysql <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> connect<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> insert<span style="color: #009900;">&#40;</span><span style="color: #000088;">$table</span><span style="color: #339933;">,</span><span style="color: #000088;">$fields</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> update<span style="color: #009900;">&#40;</span><span style="color: #000088;">$table</span><span style="color: #339933;">,</span><span style="color: #000088;">$fields</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> delete<span style="color: #009900;">&#40;</span><span style="color: #000088;">$table</span><span style="color: #339933;">,</span><span style="color: #000088;">$conditions</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> select<span style="color: #009900;">&#40;</span><span style="color: #000088;">$table</span><span style="color: #339933;">,</span><span style="color: #000088;">$fields</span><span style="color: #339933;">=</span><span style="color: #0000ff;">'*'</span><span style="color: #339933;">,</span><span style="color: #000088;">$conditions</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span><span style="color: #000088;">$order</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span><span style="color: #000088;">$limit</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> DBOMysql <span style="color: #000000; font-weight: bold;">extends</span> Config implements iDBOMysql <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$connection</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$result</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Construtor chama os métodos necessários quando a classe é instanciada
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Conecta com o banco de dados utilizando os dados das constantes de configuração
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> connect<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">connection</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span>parent<span style="color: #339933;">::</span><span style="color: #004000;">DB_HOST</span><span style="color: #339933;">,</span>parent<span style="color: #339933;">::</span><span style="color: #004000;">DB_USER</span><span style="color: #339933;">,</span>parent<span style="color: #339933;">::</span><span style="color: #004000;">DB_PASS</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">mysql_error</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">mysql_select_db</span><span style="color: #009900;">&#40;</span>parent<span style="color: #339933;">::</span><span style="color: #004000;">DB_SCHEMA</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">connection</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setEnconding</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> setEnconding<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SET NAMES '</span><span style="color: #0000ff;">' . parent::DB_ENCODING.'</span><span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> query<span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #339933;">,</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">connection</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Executa uma query de inserção no banco de dados
	 *
	 * @param string $table nome da tabela
	 * @param array $fields array com os campos e valores a serem inseridos
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> insert<span style="color: #009900;">&#40;</span><span style="color: #000088;">$table</span><span style="color: #339933;">,</span><span style="color: #000088;">$fields</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000088;">$columns</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$values</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
		<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$fields</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$column</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$columns</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$column</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$values</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000088;">$sql</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">'INSERT INTO '</span><span style="color: #339933;">.</span><span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$table</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' '</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$sql</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'('</span><span style="color: #339933;">.</span><span style="color: #990000;">join</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #339933;">,</span><span style="color: #000088;">$columns</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">') '</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$sql</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'VALUES ('</span><span style="color: #0000ff;">'.join(&quot;'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'&quot;,$values).'</span><span style="color: #0000ff;">')'</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Executa uma query de atualização no banco de dados
	 *
	 * @param string $table nome da tabela
	 * @param array $fields array com os campos e valores a serem inseridos
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> update<span style="color: #009900;">&#40;</span><span style="color: #000088;">$table</span><span style="color: #339933;">,</span><span style="color: #000088;">$fields</span><span style="color: #339933;">,</span><span style="color: #000088;">$conditions</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000088;">$columns</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$values</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>		
		<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$fields</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$column</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$itens</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$column</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'='</span><span style="color: #0000ff;">'.mysql_real_escape_string($value).'</span><span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000088;">$sql</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">'UPDATE '</span><span style="color: #339933;">.</span><span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$table</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' '</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$sql</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'SET '</span><span style="color: #339933;">.</span><span style="color: #990000;">join</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #339933;">,</span><span style="color: #000088;">$itens</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' '</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$conditions</span> <span style="color: #339933;">!=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000088;">$sql</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'WHERE '</span><span style="color: #339933;">.</span><span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$conditions</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Executa uma query para excluir registros do banco
	 *
	 * @param string $table nome da table
	 * @param string $conditions condições de exclusão (opcional)
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> delete<span style="color: #009900;">&#40;</span><span style="color: #000088;">$table</span><span style="color: #339933;">,</span><span style="color: #000088;">$conditions</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000088;">$sql</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">'DELETE FROM '</span><span style="color: #339933;">.</span><span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$table</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' '</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$conditions</span> <span style="color: #339933;">!=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000088;">$sql</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'WHERE '</span><span style="color: #339933;">.</span><span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$conditions</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Executa uma query para selecionar registros no banco de dados
	 *
	 * @param string $table 
	 * @param array $fields 
	 * @param string $conditions 
	 * @param string $order
	 * @param string $limit
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> select<span style="color: #009900;">&#40;</span><span style="color: #000088;">$table</span><span style="color: #339933;">,</span><span style="color: #000088;">$fields</span><span style="color: #339933;">=</span><span style="color: #0000ff;">'*'</span><span style="color: #339933;">,</span><span style="color: #000088;">$conditions</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span><span style="color: #000088;">$order</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span><span style="color: #000088;">$limit</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
		<span style="color: #000088;">$sql</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">'SELECT '</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$sql</span> <span style="color: #339933;">.=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fields</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #990000;">join</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #339933;">,</span><span style="color: #000088;">$fields</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$fields</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$sql</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">' FROM '</span><span style="color: #339933;">.</span><span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$table</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' '</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$conditions</span> <span style="color: #339933;">!=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000088;">$sql</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'WHERE '</span><span style="color: #339933;">.</span><span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$conditions</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$order</span> <span style="color: #339933;">!=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000088;">$sql</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'ORDER BY '</span><span style="color: #339933;">.</span><span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$order</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$limit</span> <span style="color: #339933;">!=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
			<span style="color: #000088;">$sql</span> <span style="color: #339933;">.=</span> <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$limit</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000088;">$fetch</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$loop</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$results</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$fetch</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$loop</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$fetch</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Só uma rápida explicação:<br />
A classe Config é uma classe que contem as constantes de configuração de acesso ao banco, a classe DBOMysql é a classe que implementa a interface iDBOMysql e extend a classe Config, vocês podem notar também o uso de public em private nos atributos, essa classe mostra o uso <em>extends</em> e <em>implements</em>, só gostaria de lembrar que como a classe os métodos private da classe não aparecem na interface, e que nesse caso a interface não é algo essencial.</p>
<p>Bom gente por enquanto é isso, quero me desculpar pelo atraso do post, a última semana foi meio corrida e o fim de semana foi de comemoração por que terminei a faculdade.</p>
<p>Abraços e até a próxima, onde nossos assuntos vão ficar cada vez mais interessantes.</p>
]]></content:encoded>
			<wfw:commentRss>http://technocil.com/2008/12/15/oop-no-php-herancas-e-interfaces-extendendo-e-implementando-classes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OOP no PHP: Visibilidade, definições de public, protected, private e static</title>
		<link>http://technocil.com/2008/12/11/oop-no-php-visibilidade-definicoes-de-public-protected-private-e-static/</link>
		<comments>http://technocil.com/2008/12/11/oop-no-php-visibilidade-definicoes-de-public-protected-private-e-static/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 03:52:00 +0000</pubDate>
		<dc:creator>Tobias</dc:creator>
				<category><![CDATA[Desenvolvimento web]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[escopo]]></category>
		<category><![CDATA[private]]></category>
		<category><![CDATA[protected]]></category>
		<category><![CDATA[public]]></category>
		<category><![CDATA[static]]></category>

		<guid isPermaLink="false">http://technocil.com/?p=137</guid>
		<description><![CDATA[E ae blz?
Bom inaugurando a minha participação aqui no blog resolvi começar com uma série de artigos sobre OOP e PHP, no primeiro post eu vou explicar o que significam as palavrinhas public, protected, private e static, o que significam e a função de cada uma delas em nossas classes.
Só pra constar essa série inicial [...]]]></description>
			<content:encoded><![CDATA[<p>E ae blz?</p>
<p>Bom inaugurando a minha participação aqui no blog resolvi começar com uma série de artigos sobre <acronym title="Programação Orientação a objetos">OOP</acronym> e PHP, no primeiro post eu vou explicar o que significam as palavrinhas public, protected, private e static, o que significam e a função de cada uma delas em nossas classes.</p>
<p>Só pra constar essa série inicial terá 5 posts com os seguintes assuntos.</p>
<ul>
<li>Visibilidade, definições de public, protected, private e static</li>
<li>Heranças e Interfaces, extendendo e implementando classes</li>
<li>Reaproveitamento, Sobrescrevendo métodos</li>
<li>Overloading, utilizando os métodos mágicos do PHP</li>
<li>Improviso, simulando a sobrecarga de métodos no PHP</li>
</ul>
<p>Bom já que estamos com tudo resolvido vamos começar a brincadeira.</p>
<p>As definições de escopo são bem simples e não há necessidade de se extender falando delas.</p>
<p><em><strong>public</strong></em> é a liberal das definições de escopo, todo método ou atributo de uma classe definido como<br />
public pode ser acessado de qualquer lugar.</p>
<p><em><strong>protected</strong></em> é um pouco mais contida só pode ser acessada de dentro da classe e de suas classes filhas.</p>
<p><em><strong>private</strong></em> como o nome já diz é totalmente restrita e só pode ser acessada de dentro da classe.</p>
<p>Exemplo abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>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
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Exemplo <span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$publicInfo</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Sou uma informação pública'</span><span style="color: #339933;">;</span>
  protected <span style="color: #000088;">$protectedInfo</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Sou uma informação protegida'</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$privateInfo</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Sou uma informação restrita'</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getPublicInfo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">publicInfo</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  protected <span style="color: #000000; font-weight: bold;">function</span> getProtectedInfo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">protectedInfo</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> getPrivateInfo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">privateInfo</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$exemplo</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Exemplo<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Imprime Sou uma informação pública</span>
<span style="color: #000088;">$exemplo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPublicInfo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Retorna Fatal error: Call to protected method Exemplo::getProtectedInfo() from context</span>
<span style="color: #000088;">$exemplo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getProtectedInfo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Retorna Fatal error: Call to private method Exemplo::getPrivateInfo() from context</span>
<span style="color: #000088;">$exemplo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPrivateInfo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Tudo bem aparentemente, então vamos pra função de static.</p>
<p><em><strong>static</strong></em> permite que algum método ou atributo de uma classe seja chamado sem a necessidade de instanciar a classe. O método/atributo é chamado da seguinte forma:</p>
<p>NomeDaClasse::NomeDoMetodo() ou<br />
NomeDaClasse::$NomeDoAtributo</p>
<p>Exemplo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> ExemploStatic <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000088;">$atributo</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Eu tenho alguma informação'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> fazAlgumaCoisa<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Eu faço alguma coisa'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Imprime Eu tenho alguma informação</span>
<span style="color: #b1b100;">echo</span> ExemploStatic<span style="color: #339933;">::</span><span style="color: #000088;">$atributo</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Imprime Eu faço alguma coisa</span>
ExemploStatic<span style="color: #339933;">::</span><span style="color: #004000;">fazAlgumaCoisa</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>É por hora acho que já ta de bom tamanho, você pode encontrar mais informações sobre <a href="http://br.php.net/manual/pt_BR/language.oop5.visibility.php">public, private e protected</a> e também sobre a <a href="http://br.php.net/manual/pt_BR/language.oop5.static.php">static</a> na documentação oficial do <a href="http://www.php.net">php</a>.</p>
<p>Ainda ficou com alguma dúvida? sim? bom os comentários tão aqui pra isso, mas se você não ficou com dúvidas e quer dar um puxão de orelha no menino aqui, os comentários também server pra isso.</p>
<p>Um abraço e até o próximo post.</p>
]]></content:encoded>
			<wfw:commentRss>http://technocil.com/2008/12/11/oop-no-php-visibilidade-definicoes-de-public-protected-private-e-static/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
