Você está na página 1de 9

Tutorial PHP - Programao Orientada Objeto (OOP) Porque um tutorial de OOP?

uma forma de programao pouco vista no PHP, mas com o lanamento da verso final do PHP 5.0 tudo indica que ele passar a ser mais Orientado Objeto. Tanto como j na verso 5.0 como ser nas prximas. O futuro ningum conhece, ento no posso falar, PHP depois da verso 7.0 ser somente OOP, como talvez ele pode no fazer tanto sucesso entre os programadores e nem existir mais na verso 5.1. Um tutorial destinado aos Programadores PHP em geral, aos usurios do Frum WM Online, e para o cara que no me deixou em paz at isso ficar pronto, thiagorls. At quando estive me ausentando do Frum, veio me cobrar isso, cara de pau, no? Chega de babozeira e vamos ao que interessa, PHP! ================================================================================

Porque programar OO (Orientado Objeto)?


Nem eu, nem qualquer outra pessoa no mundo pode chegar pra voc e falar: - Programe OO que muito melhor. Ou vice-versa. No teve, no tem e provavelmente no ter nenhuma vantagem em relao a outra forma de programao. Tudo uma questo de gosto e prtica. Claro que, algumas vantagens uma tem em relao a outra, muitas pessoas comentam que programando OO voc poder publicar e buscar classes j prontas para fazer alguma funo. Mas o mesmo aconteceria com a Programao "Normal". Comparar OO ao Mtodo normal, semelhante a comparar as funes echo ou print. Portanto, no vou estar aconselhando a usar ou no usar OO, simplesmente o seu gosto. Mas, como li em uma frase no livro PHP 4 - A bblia. "No fique constrangido, caso um Programador OO diga que o script dele de 10 linhas melhor que o seu de 5 linhas" Realmente, programando em OO voc ter um cdigo fonte maior. Mas por outro lado, melhor compreendido (para outros programadores de OO) do que um cdigo ao modo "normal". O suporte a OO no PHP, como est no site oficial (php.net) para usurios com experincias em outras linguaguens que so OO, como C#, e esto acostumados com ela. Por isso da introduo OO no PHP. Vamos dar os parabns para quem continuar, pois, est ciente que uma maneira um pouco mais demorada, mas talvez possa ser mais organizada de programar. No dvido que muitos programadores ao lerem o texto acima, tenham para por ai. Nada de incomum, muitos iro ver OO e comear a programar nela, os demais, no veram vantagem nenhuma e deixaro de lado. ================================================================================

Introduo
Enfim, comearemos. Para qualquer programao OO, voc criar tudo baseado em Classes, e as variveis que voc costumava usar, passaro a ser Objetos. Vamos um exemplo: <?php class MinhaClasse { // Declarao da Classe var $txt1; // Declarao das Variveis var $txt2; } $MeuObjeto = new MinhaClasse(); ?> Um exemplo sem utilizao, mas que poder nos ajudar a entender como criar uma classe. Na linha 2 (class MinhaClasse {) onde declaramos nossa Classe, cada vez que quiser criar um objeto a partir dela, criaremos chamando pelo nome definido "MinhaClasse". Podemos criar quantas classes diferentes quiser, mas no pode ser em bloco: <?php class MinhaClasse { ?> <?php var $txt1; var $txt2; } ?> O exemplo acima no ir funcionar. Voltando ao exemplo correto, as linhas 3 e 4 onde declaramos nossas variveis. Exato, para se trabalhar com classes, precisamos declarar as variveis antes de us-las. Mas no precisamos definir seu tipo, a no ser que queiramos uma Matriz: <?php class MinhaClasse { var $txt1 = array(); var $txt2; } $MeuObjeto = new MinhaClasse(); ?> Acho que at aqui no teremos maiores problemas, vamos prosseguir.

Retornando Valores das Classes


Sei que a minha classe tem as vriaveis $txt1 e $txt2, mas como gravo e imprimo o que tem nelas? De uma maneira simples, mas no aconselhada, seria utilizar o operador "->". Vamos supor que o script acima faa parte do nosso cdigo: echo $MeuObjeto -> txt1; No, no esqueci do sinal $ antes de vriavel $txt1. Ao utilizar um objeto referenciamos as vriaveis dele somente com 1 sinal de $. Essa mesma forma poderia ser utilizada para definir valores variavel: $MeuObjeto -> txt1 = "Ol Brasil!"; Mas ento, porque comentei antes que no era aconselhado utilizar dessa forma? Pelo simples fato de estarmos trabalhando com classes no somente para ter uma espcie de Matriz Multidimensional, mas sim para organizar nosso cdigo. E uma maneira organizada de se fazer isso seria trabalhar com funes

dentro das classes: <?php class MinhaClasse { var $txt1; var $txt2; function Retornar1() { echo $this -> txt1; } } $MeuObjeto = new MinhaClasse(); ?> Agora voc se pergunta "O que diabos faz aquele $this ali?". $this somente uma referncia classe em que se encontra a funo. Poderiamos sem problemas colocar no nome da classe para retornar o valor da vriavel, mas iria atrapalhar caso estivessemos trabalhando com classes hierarquicas, ter uma classe pai e filho. Mas isso no hora de comentar ainda, mais pra frente veremos Voltando ao nosso cdigo, veja que, a funo est dentro de nossa classe, ento para executar ela seria dessa forma: $MeuObjeto -> Retornar1(); Certo, mas j que no utilizo a forma "antiga" para ler a vriavel, como fao para armazenar um valor ela? O segredo est nas funes <?php class MinhaClasse { var $txt1; var $txt2; function Retornar1() { echo $this -> txt1; } function Gravar1($valor) { $this -> txt1 = $valor; } } $MeuObjeto = new MinhaClasse(); ?> Ento ao executar a funo $MeuObjeto -> Gravar1(), temos que passar um valor que ser o novo valor da vriavel $txt1. Quaisquer outros tipos de funes podem ser declaradas dentro da classe, mas tenha idia que trabalhar com OO justamente para ter no final, um cdigo limpo e de fcil entendimento. Talvez algum est se perguntando, porque venho colocando vriaveis com letras maiusculas. Isso somente seu estilo de programao, vinha fazendo com _ a um bom tempo, mas mudei o jeito por vontade prpria ao iniciar em OO, acho que dessa forma fica mais fcil identificar. Mas como disse, somente o gosto, poderia sem problema algum criar a classe minha_classe e $meu_objeto. S cuidado com a forma MinhaClasse, pois PHP faz distino entre vriaveis maiusculas e minusculas. Acho que podemos encerrar nossa introduo por aqui. Vamos alguns exemplos mais prticos. ================================================================================

J conheo, agora, como utilizo?


Vamos continuar ento Sr. Classe Nosso prximo passo desenvolver algo til com essas benditas classes. Vou tentar mostrar no exemplo a seguir, uma comparao entre Programao OO e o Mtodo "Normal". Vamos para o desenvolvimento de um mini carrinho de compras, talvez uma Cesta ^^. <?php class Cesta { var $Desconto; var $Preco = array(); var $Quantidade = array(); function Cesta($desconto) { $this -> Desconto = $desconto; } function AdicionarItem($item, $preco, $quantidade) { if( isset($this -> Preco[$item]) ) { $this -> Quantidade[$item] += $quantidade; } else { $this -> Preco[$item] = $preco; $this -> Quantidade[$item] = $quantidade; } } } $MinhaCesta = new Cesta(10); ?> CALMA, no desista, Objetos no complicado, sei que deve ter parecido, mas veja com calma o exemplo: - Do inicio at a linha 5, o que vinhamos fazendo at agora, nada de novo. - A funo Cesta() est pedindo por uma vriavel $desconto, e essa funo tem o mesmo nome que nossa classe, coencidencia? No, de mandeira alguma, veja que ao chamar nossa classe na penultima linha, passamos um valor pela classe "10". Ao criar uma nova classe, ela automaticamente executa uma funo com o mesmo nome que a classe. Ento ao mesmo tempo executamos essa funo e declaramos a vriavel Desconto com o valor 10. Que no final de tudo, essa ser a porcentagem de descontos que o usurio ganhar em cima das compras. - J a funo AdicionarItem() tem mais explicaes sobre ela mesmo do que OO. Primeiro verificamos se j existe o item na nossa matriz, se ele existir, somamos o valor ao que j existe, se no existir, definimos o Preco[$item] com o valor que foi passado e atribuimos a quantidade que foi passada. Como isso iriamo funcionar? Para adicionar itens ao nosso carrinho, fariamos dessa forma: (O script acima j est em nosso cdigo) $MinhaCesta -> AdicionarItem(1, 15.75, 10); Somente executamos a funo AdicionarItem passando os valores 1 para o cdigo do item, 15.75 como o valor do item e 10 como a quantidade. Vamos virar o angulo de nossa ateno e ver como isso seria pela maneira tradicional. Provavelmente voc teria que utilizar um banco de dados, onde cada item que seria adicionado no banco teria um cdigo do usurio e sempre que fosse necessrio puxar os dados, teriamos que fazer consultas ao banco de dados. Mas qual a vantagem de jogar dentro de uma vriavel e na prxima pgina perdeu tudo? Ento utilizaremos uma vriavel que no seja perdida na prxima pgina, podemos declarar uma vriavel de sesso como nosso objeto:

$_SESSION['MinhaCesta'] = new Cesta(10); Resolvido o problema? Ento temos um script que ficaria fcil de fazer uma manuteno, e sem utilizar recursos do servidor para conexes e consultados ao banco de dados. Vamos ver agora algumas funes que poderiamos anexar nesse nosso cdigo: <?php class Cesta { var $Desconto; var $Preco = array(); var $Quantidade = array(); function Cesta($desconto) { $this -> Desconto = $desconto; } function AdicionarItem($item, $preco, $quantidade) { if( isset($this -> Preco[$item]) ) { $this -> Quantidade[$item] += $quantidade; } else { $this -> Preco[$item] = $preco; $this -> Quantidade[$item] = $quantidade; } } function RemoverItem($item, $quantidade) { if ( isset( $this -> Quantidade[$item] ) ) { if ( $this -> Quantidade[$item] >= $quantidade ) { $this -> Quantidade[$item] -= $quantidade; } else { $this -> Quantidade[$item] = 0; } } else { return false; } } } session_start(); $_SESSION['MinhaCesta'] = new Cesta(10); ?> Implementamos uma funo para remover alguns itens que desejarmos. Algo como, adicionamos 50 mas tenho dinheiro para comprar somente 30, ento preciso remover 20. Nossa primeiro comparao da funo ver se o item j est em nossa cesta, se no estiver, essa funo retorna FALSE. A segunda comparao ver se existe o total a ser removido no carrinho. No teria lgica remover 70 itens se s tenho 50, e ficar com -20, isso provavelmente iria acarretar em problemas na contagem final. Se ele no tiver o total a ser removido ele define a vriavel Quantidade como 0. J temos nossas mos na cesta, podemos adicionar e remover itens que desejamos, agora nos resta somente contratar nosso caixa:

<?php class Cesta { var $Desconto; var $Preco = array(); var $Quantidade = array(); function Cesta($desconto) { $this -> Desconto = $desconto; } function AdicionarItem($item, $preco, $quantidade) { if( isset($this -> Preco[$item]) ) { $this -> Quantidade[$item] += $quantidade; } else { $this -> Preco[$item] = $preco; $this -> Quantidade[$item] = $quantidade; } } function RemoverItem($item, $quantidade) { if ( isset( $this -> Quantidade[$item] ) ) { if ( $this -> Quantidade[$item] >= $quantidade ) { $this -> Quantidade[$item] -= $quantidade; } else { $this -> Quantidade[$item] = 0; } } else { return false; } } function TotalCompras() { $soma = 0; while ( list($cod, $valor) = each($this -> Quantidade) ) { $soma += $this -> Quantidade[$cod] * $this -> Preco[$cod]; } $soma -= $soma * ($this -> Desconto / 100); return $soma; } } session_start(); $_SESSION['MinhaCesta'] = new Cesta(10); ?> Alguma dvida sobre essa funo? Uma simples para terminar. Somente percorremos toda a Matriz e calculamos a Quantidade de cada item * seu Proo unitrio, aplicamos a porcentagem de descontos que o usurio tem e retornamos a Soma Total.

E como funcionaria todo o nosso script? <?php class Cesta { var $Desconto; var $Preco = array(); var $Quantidade = array(); function Cesta($desconto) { $this -> Desconto = $desconto; } function AdicionarItem($item, $preco, $quantidade) { if( isset($this -> Preco[$item]) ) { $this -> Quantidade[$item] += $quantidade; } else { $this -> Preco[$item] = $preco; $this -> Quantidade[$item] = $quantidade; } } function RemoverItem($item, $quantidade) { if ( isset( $this -> Quantidade[$item] ) ) { if ( $this -> Quantidade[$item] >= $quantidade ) { $this -> Quantidade[$item] -= $quantidade; } else { $this -> Quantidade[$item] = 0; } } else { return false; } } function TotalCompras() { $soma = 0; while ( list($cod, $valor) = each($this -> Quantidade) ) { $soma += $this -> Quantidade[$cod] * $this -> Preco[$cod]; } $soma -= $soma * ($this -> Desconto / 100); return $soma; } } session_start(); $_SESSION['MinhaCesta'] = new Cesta(10); $_SESSION['MinhaCesta'] -> AdicionarItem("AF 1520", 17.90, 15); $_SESSION['MinhaCesta'] -> AdicionarItem("AE 1735", 21.00, 5); $_SESSION['MinhaCesta'] -> TotalCompras(); ?> Dessa forma, se conclui o exemplo de nossa Cesta de Compras. Agora vocs se perguntam: - Pronto, fico bunito, mas s posso fazer isso com OOP? Como comentei no inicio, tudo pode ser feito, qualquer script que voc faria da maneira "convencional" poderia ser feito Orientado Objeto. Para se ter uma idia de alguns outros tipos que podem ser bastante teis nas Manutenes gerais de um site, upload de arquivos, murais de mensagens/recados, ...

Muitos scripts podem ser criados, de asas a sua imaginao E para quem gosta de repassar seus scripts, o que ficaria mais fcil, passar esse trecho de um cdigo: class Cesta { var $Desconto; var $Preco = array(); var $Quantidade = array(); function Cesta($desconto) { $this -> Desconto = $desconto; } function AdicionarItem($item, $preco, $quantidade) { if( isset($this -> Preco[$item]) ) { $this -> Quantidade[$item] += $quantidade; } else { $this -> Preco[$item] = $preco; $this -> Quantidade[$item] = $quantidade; } } function RemoverItem($item, $quantidade) { if ( isset( $this -> Quantidade[$item] ) ) { if ( $this -> Quantidade[$item] >= $quantidade ) { $this -> Quantidade[$item] -= $quantidade; } else { $this -> Quantidade[$item] = 0; } } else { return false; } } function TotalCompras() { $soma = 0; while ( list($cod, $valor) = each($this -> Quantidade) ) { $soma += $this -> Quantidade[$cod] * $this -> Preco[$cod]; } $soma -= $soma * ($this -> Desconto / 100); return $soma; } } Ou uns 10-15 arquivos? ================================================================================

Concluso
Sei que passei rpido demais o assunto sobre OO, mas acredite, no h muito o que se explicar. Isso um mtodo de programao, no uma funo ou algo assim, que possa ter detalhes, exemplos ou mais coisas. Confesso que da forma que passei isso, restringue a pessoas que tenham j algum conhecimento em PHP, mas realmente, voc primeiro precisa aprender PHP, para depois passar para OO, como espera criar funes e tudo mais se est apenas comeando? Tudo ao seu tempo. A inteno desse tutorial no mudar o jeito de todos programar, pessoalmente, devo ter nem 30% dos meus trabalhos feitos OO. Como iniciei o tutorial, no h uma vantagem de um mtodo sobre o outro, em alguns casos OO pode ser melhor e em outros a maneira convencional pode ser a melhor forma.

Com certeza, muitas dvidas ficaram, expliquei um mtodo de programao em 10 segundos... Espero somente desse tutorial que, quem se interessar por OO, realmente tente desenvolver alguns mini projetos, e a qualquer dvida, h vrias pessoas aqui para lhe ajudar Mas acredite em uma coisa, saber quando, onde e porque utilizar OO muito mais dficil que aprender a programar em OO. Ento, como diria algum que mata 2 lees por dia com as unhas e dentes... "Let the carnage begin" - Stormbringer

Você também pode gostar