Você está na página 1de 13

PHP 5 Orientado a Objetos

Introduo ao PHP 5
Com as primeiras 2 verses de PHP, PHP 3 e PHP 4, conseguiram uma plataforma potente e estvel para a programao de pginas do lado do servidor. Estas verses serviram muito de a uda para a comunidade de desenvolvedores, tornando poss!vel "ue PHP se a a linguagem mais utili#ada na $e% para a reali#ao de pginas avanadas. Entretanto, ainda e&istiam pontos negros no desenvolvimento de PHP "ue trataram de solucionar com a verso ', aspectos "ue fi#eram falta na verso 4, "uase desde o dia de seu lanamento. (eferimo) nos principalmente * programao orientada a o% etos +P,,- "ue, apesar de estar suportada a partir de PHP3, s. implementava uma parte muito pe"uena das caracter!sticas deste tipo de programao. Nota: A orientao a objetos uma maneira de programar que trata de modelar os processos de programao de uma maneira prxima realidade: tratando a cada componente de um programa como um objeto com suas caractersticas e funcionalidades. odemos !er uma pequena introduo no artigo " que a programao orientada a objetos. , principal o% etivo de PHP' foi mel/orar os mecanismos de P,, para solucionar as car0ncias das verses anteriores. 1m passo necessrio para conseguir "ue PHP se a uma linguagem apta para todo tipo de aplicaes e meios, inclusive os mais e&igentes.

Instalao de PHP5 com WAMP5


Existe um pacote de instalao chamado WAMP5 que pode instalar em conjunto Apache PHP 5 M!"#$ e PHPM!Admin% &este cap'tulo ainda nos re(erimos ) (orma de instalao de WAMP5 e outras op*es para aumentar as possibilidades do pacote% E&iste uma maneira de comear a utili#ar PHP' em 2indo$s sem ter "ue sofrer as complicaes t!picas da instalao dos servidores necessrios para programar em PHP. 3rata)se de instalar um pacote c/amado 245P, "ue permite instalar e configurar em um s. processo o servidor 4pac/e, a %ase de dados 56789 e o m.dulo de programao em PHP verso '. 245P : um sistema indicado para os usurios "ue no t0m instalado no sistema nen/um dos programas necessrios para programar em PHP +4pac/e, PHP e 56789-, "ue reali#a uma instalao completa e desde #ero. 5as tam%:m podem utili#ar este programa os usurios "ue dispem de 4pac/e, PHP e;ou 56789 em seu sistema. Em cu o caso, simplesmente se reali#ar outra c.pia das aplicaes em um diret.rio distinto, "ue * princ!pio, no tem por"ue interferir com as outras instalaes alo adas em nosso computador. Pro+ramas que contem WAMP5 , soft$are "ue se instala com 245P' contem os seguintes servidores e programas< 4pac/e 2.2.=. , servidor de pginas $e% mais difundido do mercado. Em%ora a >ltima verso deste servidor se a 4pac/e 2, instala)se uma verso anterior "ue : mais estvel. E&iste um 4dd)on "ue permite su%stituir a verso ?.3.3? de 4pac/e pela >ltima verso. PHP '.2.'. , motor renovado da linguagem. 56789 '.@.4'. 4 %ase de dados mais difundida para utili#ar com PHP. PHPm6admin. 1m soft$are "ue permite administrar uma %ase de dados atrav:s de uma interface $e%. 789itemanager. 1m sistema para administrar uma %ase de dados a partir de sentenas 789. Anstalao de 245P Nota: A !erso dos soft#are acima so referentes at a data de criao desta apostila. 4 instalao se reali#a atrav:s de um e&ecutvel 2indo$s onde podem se introdu#ir poucas configuraes, apenas o diret.rio onde dese armos "ue se instalem os programas. Bepois do processo de instalao foram criados dois servios com o servidor $e% e o de %ase de dados< 7ervio $ampapac/e< (elacionado com o servidor 4pac/e. 7ervio $ampm6s"l< (elacionado com a %ase de dados 56789. 4demais, dentro do diret.rio onde tivermos instalado 245P' ter sido criado uma pasta c/amada C$$$C, "ue corresponde com o diret.rio de pu%licao, ou se a, o lugar onde devem ser colocadas as

pginas $e%. Burante a instalao tam%:m devemos decidir se dese amos "ue 245P' se inicie automaticamente ao ligar o computador ou se dese amos "ue seu funcionamento se reali#e manualmente. ,uncionamento dos ser-idores 8uando instalamos 245P' se cria um grupo de programas c/amado 2amp7erver, onde poderemos encontrar uma opo "ue pe C7tart 2ampserverC, "ue ser necessrio e&ecutar se no tivermos selecionado "ue o servidor se inicie automaticamente. 1ma ve# o 2amp7erver em funcionamento o%teremos um !cone na %arra de tarefas com a forma parecida a de um marcador de velocidade. 7e clicarmos so%re esse !cone, a%rir um menu com opes variadas para providenciar os servios relacionados com o pacote. Podemos provar se os servios esto funcionando perfeitamente acessando * pgina de in!cio do servidor, escrevendo na %arra de endereos de nosso navegador algo como /ttp<;;local/ost;. Ento dever aparecer uma pgina com vrios linDs *s distintas ferramentas instaladas com 245P', al:m de algumas pginas de pro%a de PHP. Add.ons E&istem vrios acr:scimos "ue podem ser instalados com 245P, para ampliar as possi%ilidades do pacote. Por e&emplo, podemos instalar um add)on para permitir "ue 245P tra%al/e com PHP' ou com PHP4, criando una nova opo no menu de 245P' "ue permite mudar de uma verso a outra de PHP. E&istem outros acr:scimos dispon!veis< Anstalar 4ctive7tate Perl em nosso sistema, para permitir a e&ecuo de CEA. 4tuali#ar a verso de 4pac/e 2. Anstalar Fend ,ptimi#er, para mel/orar o comportamento em tempo de e&ecuo de PHP. Por >ltimo, o add)on "ue instala 2e%ali#er, um sistema para o%ter estat!sticas de uso do servidor $e%. Pode)se o%ter mais informao deste sistema e opes para do$nload na pgina /ttp<;;$$$.en.$ampserver.com;

Modelo de orientao a objetos em PHP 5


/omo PHP 5 trabalha com a orientao a objetos% $ista das no-idades em relao aos objetos em -ers*es anteriores% 1m dos pro%lemas mais %sicos das verses anteriores de PHP era a clonagem de o% etos, "ue se reali#ava ao atri%uir um o% eto a outra varivel ou ao passar um o% eto por parGmetro em uma funo. Para resolver este pro%lema PHP' usa os manipuladores de o% etos +,% ect /andles-, "ue so uma esp:cie de ponteiros "ue apontam os espaos de mem.ria onde residem os o% etos. 8uando se atri%ui um manipulador de o% etos ou se passa como parGmetro em uma funo, se duplica o pr.prio o% ect /andle e no o o% eto em si. Nota: $ambm pode%se reali&ar uma clonagem de um objeto' para obter uma cpia exata' mas que no o prprio objeto. ara isso' utili&amos uma no!a instruo c(amada ) clone)' que !eremos mais adiante.

Al+umas caracter'sticas do trabalho com POO em PHP 5


0ejamos a se+uir uma pequena lista das no-as caracter'sticas da pro+ramao orientada a objetos 1POO2 em PHP5% &o -amos descre-er exausti-amente cada caracter'stica% ,aremos isso mais adiante neste mesmo manual% 3%. &omes (ixos para os construtores e destrutores Em PHP ' temos "ue utili#ar nomes pr:)definidos para os m:todos construtores e destrutores +,s "ue se encarregam de resumir as tarefas de iniciao e de destruio dos o% etos. 4gora se c/amam

__construct e __destruct. 4%. Acceso public pri-ate e protected a propriedades e m5todos 4 partir de agora podemos utili#ar os modificadores de acesso /a%ituais da P,,. Estes modificadores servem para definir "ue m:todos e propriedades das classes so acess!veis desde cada meio. 6%. Possibilidade de uso de inter(aces 4s interfaces se utili#am na P,, para definir um con unto de m:todos "ue implementa uma classe. 1ma classe pode implementar vrias interfaces ou con untos de m:todos. Ha prtica, o uso de interfaces : utili#ado muitas ve#es para suprir a falta de /erana m>ltipla de linguagens como PHP ou Iava. E&plicaremos isto com detal/e mais adiante. 7%. M5todos e classes (inal Em PHP ' pode)se indicar "ue um m:todo : CfinalC. Com isso, no se permite so%rescrever esse m:todo, em uma nova classe "ue o /erde. 7e a classe : CfinalC, o "ue se indica : "ue esta classe no permite ser /erdada por outra classe. 5%. Operador instanceo( 1tili#a)se para sa%er se um o% eto : uma instGncia de uma classe determinada. 8%. Atributos e m5todos static Em PHP' podemos fa#er uso de atri%utos e m:todos CstaticC. 7o as propriedades e funcionalidades as "uais se pode acessar a partir do nome de classe, sem a necessidade de /aver instanciado um o% eto de tal classe. 9%. /lasses e m5todos abstratos 3am%:m : poss!vel criar classes e m:todos a%stratos. 4s classes a%stratas no se podem instanciar, costumam ser utili#adas para /erda)las de outras classes "ue no t0m por"ue serem a%stratas. ,s m:todos a%stratos no podem ser c/amados, utili#am)se mais para serem /erdados por outras classes, onde no t0m por"ue serem declarados a%stratos. :%. /onstantes de classe Pode)se definir constantes dentro da classe. 9ogo, pode)se acessar tais constantes atrav:s da pr.pria classe. ;%. ,un*es que especi(icam a classe que recebem por par<metro 4gora podem se definir funes e declarar "ue devem rece%er um tipo espec!fico de o% eto. Ho caso de "ue o o% eto no se a da classe correta, se produ# um erro. 3=%. ,uno >>autoload J /a%itual "ue os desenvolvedores escrevam um ar"uivo por cada classe "ue reali#am, como t:cnica para organi#ar o c.digo das aplicaes. Por essa ra#o, *s ve#es : fatigante reali#ar os incluis de cada um dos c.digos das classes "ue se utili#am em um script. 4 funo KKautoload serve para tentar incluir o c.digo de uma classe "ue se necessite, e "ue no ten/a sido declarada ainda no c.digo "ue est sendo e&ecutada. 33%. /lona+em de objetos 7e dese armos, podemos reali#ar um o% eto a partir da c.pia e&ata de outro o% eto. Para isso, utili#a) se a instruoCcloneC. 3am%:m pode se definir o m:todo KKclone para reali#ar tarefas associadas coma clonagem de um o% eto.

/lasses em PHP 5
0emos o que 5 uma classe como podemos de(ini.la e instanci?.la% /lasses em PHP 5 4s classes em Programao orientada a o% etos +P,,- so definies dos elementos "ue formam um sistema, neste caso, definies dos o% etos "ue vo intervir em nossos programas.

1m o% eto se define indicando "ue propriedades e funcionalidades t0m. Iustamente essas declaraes so o "ue : uma classe. 8uando se fa# uma classe simplesmente se especifica "ue propriedades e funcionalidades t0m. Por e&emplo, um /omem poderia ter como propriedades o nome ou a idade e como funcionalidades, comer, mover)se ou estudar. Ha classe /omem, declarar!amos dois atri%utos< a idade ou o nome, "ue seriam como duas variveis. 3am%:m dever!amos criar tr0s m:todos, com os procedimentos a seguir para "ue o /omem possa comer, mover)se ou estudar. Estes m:todos se definem declarando funes dentro da classe. , c.digo para definir uma classe pode ser visto a seguir< class home{ var $nome; var $idade; function comer($comida){ //aqui o cdigo do mtodo } function moverse($destino){ //aqui o cdigo do mtodo } function estudar($diciplina){ //aqui o cdigo do mtodo }

Poder se comprovar "ue este c.digo no difere em nada das verses anteriores de PHP, "ue suportavam certas caracter!sticas da P,,. Esta situao mudar e&plorando um pouco mais as caracter!sticas mais avanadas de PHP ', "ue implicaro mel/oras "ue no estavam presentes nas verses anteriores Anstanciar o% etos a partir de classes Limos "ue uma classe : somente uma definio. 7e "uisermos tra%al/ar com as classes devemos instanciar o% etos, processo "ue consiste em gerar um e&emplar de uma classe. Por e&emplo, temos a classe /omem anterior. Com a classe em si no podemos fa#er nada, mas podemos criar o% etos /omem a partir dessa classe. Cada o% eto /omem ter umas caracter!sticas pr.prias, como a idade ou o nome. 4demais poder desempen/ar umas funes como comer ou mover)se, agora tam%:m, cada um comer ou se mover por sua pr.pria conta "uando l/e for solicitado, sem interferir * princ!pio, com o "ue possa estar fa#endo outro /omem. 4proveitando, vamos ver como se gerariam dois /omens, ou se a, como se instanciariam dois o% etos da classe /omem. Para isso, utili#amos o operador ne$. $carol = ne $!orge = ne /oncluso J importante se dar conta da diferena entre um o% eto e uma classe. 4 classe : uma definio de umas caracter!sticas e funcionalidades, algo a%strato "ue se concreti#a com a instanciao de um o% eto de tal classe. 1m o% eto tem propriedades, com seus valores concretos, e podem ser passadas mensagens +c/amar aos m:todos- para "ue faam coisas. nome; nome;

/onstrutores em PHP 5
0amos -er o que 5 um construtor e para que ser-e al5m de um exemplo simples de uma classe que de(ine um construtor% ,s construtores se encarregam de resumir as aes de iniciao dos o% etos. 8uando instanciamos um o% eto, temos "ue reali#ar vrios passos em sua iniciao, por e&emplo, dar valores a seus atri%utos e isso : o "ue se encarrega o construtor. ,s construtores podem rece%er dados para iniciar os o% etos como se dese e em cada caso. 4 sinta&e para a criao de construtor varia em relao a do PHP 3 e 4, pois deve se c/amar com um nome fi&o< __construct. +7o dois /!fens %ai&os+underline-, antes da palavra CconstructC4 longo dos e&emplos deste manual vamos ir criando um c.digo para gesto de um v!deo clu%. Lamos comear definindo uma classe cliente, "ue utili#aremos logo em nosso programa. class cliente{ var $nome; var $numero; var $filmes_alugados; function __construct($nome"$numero){ $this#$nome=$nome; $this#$numero=$numero; $this#$filmes_alugados=arra%; } function dame_numero{ return $this#$numero; } } , construtor nesta classe rece%e o nome e n>mero "ue atri%uir ao cliente, "ue introdu# logo em suas correspondentes propriedades. 4demais inicia o atri%uto filmesKalugados como um arra6, neste caso va#io por"ue ainda no tem nen/um filme em seu poder. 9ogo, criamos um m:todo muito simples para poder utili#ar o o% eto. Lamos ver umas aes simples para ilustrar o processo de instanciao e utili#ao dos o% etos. //instanciamos dois o&!etos cliente $cliente' = ne cliente(()edro(" '); $cliente* = ne cliente((+o&erto(" ,-.); //mostramos o numero de cada cliente criado (/ identificador do cliente ' 0 ( 1 $cliente'#$dame_numero; (/ identificador do cliente * 0 ( 1 $cliente*#$dame_numero; Este e&emplo o%teria esta sa!da como resultado de sua e&ecuo< , identificador do cliente ? :< ? , identificador do cliente 2 :< '=4

@estrutores em PHP 5
Explicao dos destrutores em PHP5 e exemplos de (uncionamento% ,s destrutores so funes "ue se encarregam de reali#ar as tarefas "ue se necessita e&ecutar "uando um o% eto dei&a de e&istir. 8uando um o% eto no est referenciado por nen/uma varivel, dei&a de ter sentido "ue este a arma#enado na mem.ria, portanto, o o% eto deve ser destru!do para li%erar seu espao. Ho momento de sua destruio, a funo se c/ama destrutor, "ue pode reali#ar as tarefas "ue o programador estime oportuno reali#ar.

4 criao do destrutor : opcional. 7omente devemos cri)lo, se dese armos fa#er alguma coisa "uando um o% eto se elimine da mem.ria. , destrutor : como "ual"uer outro m:todo da classe, em%ora deve se declarar com um nome fi&o< __destruct. Ho c.digo seguinte veremos um destrutor em funcionamento. Em%ora a ao "ue se reali#a ao destruir o o% eto no : muito >til, pode nos servir %em para ver como tra%al/a. class cliente{ var $nome; var $numero; var $filmes_alugados; function __construct($nome"$numero){ $this#$nome=$nome; $this#$numero=$numero; $this#$filmes_alugados=arra%; } function __destruct{ (2&r$destruido0 ( 1 $this#$nome; } function dame_numero{ return $this#$numero; } } //instanciamos dois o&!etos cliente $cliente' = ne cliente(()edro(" '); $cliente* = ne cliente((+o&erto(" ,-.); //mostramos o numero de cada cliente criado (/ identificador do cliente ' 0 ( 1 $cliente'#$dame_numero; (2&r$/ identificador do cliente * 0 ( 1 $cliente*#$dame_numero; Este c.digo : igual "ue o anterior. 7omente acrescentamos o destrutor, "ue imprime uma mensagem na tela com o nome do cliente "ue foi destru!do. Bepois de sua e&ecuo o%ter!amos a seguinte sa!da. , identificador do cliente ? :< ? , identificador do cliente 2 :< '=4 destru!do< Pedro destru!do< (o%erto Como vimos, antes de aca%ar o script, li%era)se o espao na mem.ria dos o% etos, com o "ual se e&ecuta o destrutor e aparece a correspondente mensagem na pgina. 1m o% eto pode ficar sem refer0ncias e, portanto, ser destru!do, por muitas ra#es. Por e&emplo, o o% eto pode ser uma varivel local de uma funo e ao finali#ar a e&ecuo dessa funo local dei&aria de ter validade, sendo ento destru!do. , c.digo seguinte ilustra como uma varivel local a "ual"uer Gm%ito +por e&emplo, local a uma funo-, se destr.i "uando esse Gm%ito foi finali#ado. function cria_cliente_local{ $cliente_local = ne cliente((sou local(" ,); } cria_cliente_local 4 funo simplesmente cria uma varivel local "ue contem a instanciao de um cliente. 8uando a funo se aca%a, a varivel local dei&a de e&istir, e ento, c/ama)se ao destrutor definido para esse o% eto.

Nota: $ambm podemos nos desfa&er de um objeto sem a necessidade de acabar com o *mbito onde foi criado. ara isso' temos a funo unset que recebe uma !ari+!el e a elimina da memria. ,uando se perde uma !ari+!el que contem um objeto e esse objeto deixa de ter refer-ncias' elimina%se ao objeto e c(ama%se ao destrutor.

Modi(icadores de acesso a m5todos e propriedades em PHP


"o os Public Protected e Pri-ate que se podem conhecer porque j? se utiliAam e outras lin+ua+ens orientados a objetos% Leremos neste cap!tulo os novos modificadores de acesso aos m:todos e atri%utos dos o% etos "ue foram incorporados em PHP '. Estes modificadores de acesso so os con/ecidos pu%lic, protected e private, "ue dispem de outras linguagens como Iava. 1m dos princ!pios da programao orientada a o% etos : o encapsulamento, "ue : um processo no "ual se ocultam as caracter!sticas internas de um o% eto *"ueles elementos "ue no t0m por"ue con/ece) las. ,s modificadores de acesso servem para indicar as permisses "ue tero outros o% etos para acessar a seus m:todos e propriedades. Modi(icador public J o n!vel de acesso mais permissivo. 7erve para indicar "ue o m:todo ou atri%uto da classe : p>%lico. Heste caso pode)se acessar a este atri%uto, para visuali#)lo ou edita)lo, por "ual"uer outro elemento de nosso programa. J o modificador "ue se aplica se no se indica outra coisa. Le amos um e&emplo de classe onde declaramos como pu%lic seus elementos, um m:todo e uma propriedade. 3rata)se da classe CdadoC, "ue tem um atri%uto com sua pontuao e um m:todo para tirar o dado o o%ter uma nova pontuao aleat.ria. class dado{ pu&lic $pontos; function __construct{ srand((dou&le)microtime3'444444); } pu&lic function tirar{ $this#$pontos=$randval = rand('"-); } dado;

$meu_dado = ne

for ($i=4;$i254;$i66){ $meu_dado#$tirar; (2&r$7aiu ( 1 $meu_dado#$pontos 1 ( pontos(; } Lemos a declarao da classe dado, e logo umas lin/as de c.digo para ilustrar seu funcionamento. Ho e&emplo se reali#a um loop 3@ ve#es, nas "uais se tira o dado e se mostra a pontuao "ue se o%teve. Como o atri%uto Mpontos e o m:todo tirar so p>%licos, podemos acess)los de fora do o% eto, ou "ue : o mesmo, de fora do c.digo da classe. Modi(icador pri-ate J o n!vel de acesso mais restritivo. 7erve para indicar "ue essa varivel somente vai poder ser acessada pelo pr.prio o% eto, nunca de fora. 7e tentarmos acessar um m:todo ou atri%uto declarado private de fora do pr.prio o% eto, o%teremos uma mensagem de erro indicando "ue no : poss!vel a este elemento. 7e no e&emplo anterior tiv:ssemos declarado private o m:todo e a propriedade da classe dado, ter!amos rece%ido uma mensagem de erro.

4"ui temos outra poss!vel implementao da classe dado, declarando como private o atri%uto pontos e o m:todo tirar. class dado{ private $pontos; function __construct{ srand((dou&le)microtime3'444444); } private function tirar{ $this#$pontos=$randval = rand('"-); } pu&lic function dar_nova_pontuacao{ $this#$tirar; return $this#$pontos; } dado;

$meu_dado = ne

for ($i=4;$i254;$i66){ (2&r$8an salido ( 1 $meu_dado#$dar_nova_pontuacao 1 ( pontos(; } 3ivemos "ue criar um novo m:todo p>%lico para operar com o dado, por"ue se : tudo privado no / forma de fa#er uso dele. , mencionado m:todo : darKnovaKpontuacao, "ue reali#a a ao de tirar o dado e devolver o valor "ue saiu. Modi(icador protected Este indica n!vel de acesso m:dio e um pouco mais especial "ue os anteriores. 7erve para "ue o m:todo ou o atri%uto se a p>%lico dentro do c.digo da pr.pria classe e de "ual"uer classe "ue /erde da"uela onde est o m:todo ou propriedade protected. J privado e no acess!vel de "ual"uer outra parte. ,u se a, um elemento protected : p>%lico dentro da pr.pria classe e em suas /eranas. 5ais adiante e&plicaremos a /erana e poderemos oferecer e&emplos com o modificador protected. /oncluso 5uitas ve#es o pr.prio desenvolvedor : o "ue fi&a seu crit:rio na /ora de aplicar os distintos modificadores de acesso a atri%utos e m:todos. Pouca proteo implica "ue os o% etos percam seu encapsulamento e com isso, uma das vantagens da P,,. 1ma proteo maior pode tornar mais tra%al/oso gerar o c.digo do programa, mas em geral, : aconsel/vel.

A herana em PHP5
Explicamos a herana em PHP 5 um processo pelo qual os objetos podem herdar as caracter'sticas de outros de modo que se podem (aAer objetos especialiAados baseados em outros mais +erais% 4 /erana : um dos mecanismos fundamentais da programao orientada a o% etos. Por meio da /erana, podem se definir classes a partir da declarao de outras classes. 4s classes "ue /erdam incluem os m:todos como as propriedades da classe a partir da "ual esto definidos. Por e&emplo, pensemos na classe Cve!culoC. Esta classe geral pode incluir as caracter!sticas gerais de todos os ve!culos +atri%utos da classe-, como a matr!cula, ano de fa%ricao e pot0ncia. 4demais, incluir algumas funcionalidades +m:todos da classe- como poderiam ser, ligar ou mover. 4gora tam%:m, na prtica e&istem vrios tipos de ve!culos, como os carros, os Nni%us e os camin/es. 3odos eles t0m umas caracter!sticas comuns, "ue foram definidas na classe ve!culo. 4demais,

tero uma s:rie de caracter!sticas pr.prias do tipo de ve!culo, "ue, * princ!pio, no t0m outros tipos de ve!culos. Por e&emplo, os camin/es podem ter uma carga m&ima permitida ou os Nni%us um n>mero de lugares dispon!veis. Ba mesma forma, as classes mais espec!ficas podem ter umas funcionalidades pr.prias, como os camin/es carregar e descarregar, ou os Nni%us aceitarKpassageiros ou venderKpassagem. , normal em sistemas de /erana : "ue as classes "ue /erdam de outras incluam novas caracter!sticas e funcionalidades, * parte dos atri%utos e m:todos /erdados. Por:m, isto no : imprescind!vel, de modo "ue podem se criar o% etos "ue /erdem de outros e no incluam nada novo. "intaxe de herana em PHP 5 4 programao orientada a o% etos nos oferece uma s:rie de mecanismos para definir este tipo de estruturas, de modo "ue possam se criar /ierar"uias de o% etos "ue /erdam uns de outros. Leremos agora como definir estas estruturas de /erana em PHP '. Para isso, continuando com nosso e&emplo da locadora de v!deo, vamos criar os distintos tipos de elementos "ue so oferecidos no aluguel. Como todo mundo con/ece, as locadoras de v!deos oferecem distintos tipos de elementos para alugar, como podem ser os filmes +fitas de v!deo ou BLB- e os ogos. Cada elemento tem umas caracter!sticas pr.prias e algumas comuns. C/amamos CsuporteC * classe geral, "ue inclui as caracter!sticas comuns para todos os tipos de elementos em aluguel. 9ogo, criamos tr0s tipos de suportes diferentes, "ue /erdam da classe suporte, mas "ue incluem algumas caracter!sticas e funcionalidades novas. Estes tipos de suporte sero CfitaKvideoC, CdvdC e C ogoC. , es"uema de /erana "ue vamos reali#ar neste e&emplo pode ser visto na seguinte imagem.

Comeamos pela classe suporte. 7eu c.digo ser o seguinte< class suporte{ pu&lic $titulo; protected $numero; private $preco; function __construct($tit"$num"$preco){ $this#$titulo = $tit; $this#$numero = $num; $this#$preco = $precio; } pu&lic function dar_preco_sem_imposto{ return $this#$preco; } pu&lic function dar_preco_com_imposto{ return $this#$preco 3 '1'-; } pu&lic function dar_numero_identificacao{ return $this#$numero; }

pu&lic function imprime_caracteristicas{ echo $this#$titulo; echo (2&r$( 1 $this#$preco 1 ( (imposto nao incluido)(; } } ,s atri%utos "ue definimos so, t!tulo, n>mero +um identificador do suporte- e preo. 4plicamos a cada um, um modificador de acesso distinto, para poder praticar os diferentes tipos de acesso. Befinimos um constructor, "ue rece%e os valores para a iniciao do o% eto. 1m m:todo darKprecoKsimKimposto, "ue devolve o preo do suporte, sem aplicar o imposto. ,utro m:todo darKprecoKcomKimposto, "ue devolve o preo uma ve# aplicado por e&emplo, ?=O de imposto. , m:todo darKnumeroKidentificacao, "ue devolve o n>mero de identificador e imprimeKcaracteristicas, "ue mostra na pgina as caracter!sticas deste suporte. Nota: .omo se foi definido como pri!ate o atributo preo' este atributo s poder+ ser acessado dentro do cdigo da classe' ou seja' na prpria definio do objeto. /e quisermos acessar ao preo de fora da classe 0algo muito normal se temos em conta que !amos necessitar o preo de um suporte de outras partes da aplicao1 ser+ necess+rio criar um mtodo que nos de!ol!a o !alor do preo. 2ste mtodo de!era se definir como public' para que possa ser acessado de qualquer lugar que se necessite. Em todos os m:todos usa)se a varivel Mt/is. Esta varivel no : mais "ue uma refer0ncia ao o% eto so%re o "ual se est e&ecutando o m:todo. Em programao orientada a o% etos, para e&ecutar "ual"uer destes m:todos, primeiro temos "ue ter criado um o% eto a partir de uma classe. 9ogo, poderemos c/amar os m:todos de um o% eto. Asto se fa# com MmeuKo% eto)PmetodoKaKc/amar. Bentro de m:todo, "uando se utili#a a varivel Mt/is, se est fa#endo refer0ncia ao o% eto so%re o "ual se c/amou ao m:todo, neste caso, o o% eto MmeuKo% eto. Com Mt/is)Ptitulo estamos fa#endo refer0ncia ao atri%uto CtituloC "ue tem o o% eto MmeuKo% eto. 7e "uisermos provar a classe suporte, para confirmar "ue se e&ecuta corretamente e "ue oferece resultados coerentes, podemos utili#ar um c.digo como o seguinte. $suporte' = ne suporte((/s 9ntoc:veis("**"5); echo (2&$( 1 $suporte'#$titulo 1 (2/&$(; echo (2&r$)reco0 ( 1 $suporte'#$dar_preco_sem_imposto 1 (euros(; echo (2&r$)reco imposto inclu;do0 ( 1 $suporte'#$dar_preco_com_imposto 1 ( euros(; Heste caso criamos uma instGncia da classe suporte, em um o% eto "ue c/amamos Msuporte?. 9ogo, imprimimos seu atri%uto titulo +como o t!tulo foi definido como pu%lic, podemos acessa)lo desde fora do c.digo da classe. 9ogo, c/amam)se aos m:todos darKprecoKsemKimposto e darKprecoKcomKimposto para o o% eto criado. Bar!a isto como resultado< ,s Antocveis Preo< 3 euros Preo imposto inclu!do< 3,4Q euros Continuando com nosso e&emplo da locadora de v!deo, vamos construir uma classe para os suportes de tipo fita de v!deo. 4s fitas de v!deo t0m um atri%uto novo "ue : a durao da fita. Ho t0m nen/uma classe nova, em%ora devemos aprender a so%rescrever m:todos criados para o suporte, visto "ue agora t0m "ue fa#er tarefas mais espec!ficas. "obrescre-er m5todos 4ntes de mostrar o c.digo da classe fitaKvideo, vamos falar so%re a so%rescritura ou su%stituio de m:todos, "ue : um mecanismo pelo "ual uma classe "ue /erda pode redefinir os m:todos "ue est /erdando. Pensemos em uma cafeteira. 7a%emos "ue e&istem muitos tipos de cafeteiras e todas fa#em caf:, mas o mecanismo para fa#er o caf: : distinto dependendo do tipo de cafeteira. E&istem cafeteiras e&press,

cafeteiras por gotas e at: se pode fa#er caf: com uma meiaR Hossa cafeteira CpaiC +da "ue vai /erdar todas as cafeteiras- pode ter definido um m:todo fa#erKcafe+-, mas no necessariamente todas as cafeteiras "ue possam /erdar desta fa#em o caf: seguindo o mesmo processo. Ento podemos definir um m:todo para fa#er caf: padro, "ue teria a classe cafeteira. 5as ao definir as classes cafeteiraKe&press e cafeteiraKgotas, dever!amos so%rescrever o m:todo fa#erKcafe+- para "ue se a uste ao procedimento pr.prio destas. 4 so%rescritura de m:todos : algo %astante comum em mecanismos de /erana, visto "ue os m:todos "ue foram criados para uma classe CpaiC no t0m por"u0 ser os mesmos "ue os definidos nas classes "ue /erdam. Leremos como so%rescrever ou su%stituir m:todos em um e&emplo de /erana, seguindo nosso e&emplo da locadora de v!deo. "intaxe para herdar em PHP 5 Hav!amos comentado "ue a locadora de v!deo dispe de diferentes elementos para alugar, como fitas de v!deo, BLB ou ogos. Hav!amos criado uma classe suporte, "ue vamos /erdar em cada um dos elementos dispon!veis para alugar. Lamos comear pela classe fitaKvideo, cu o c.digo ser o seguinte< class fita_video e<tends suporte{ private $duracao; function __construct($tit"$num"$preco"$duracao){ parent00__construct($tit"$num"$preco); $this#$duracao = $duracao; } pu&lic function imprime_caracteristicas(){ echo (=ilme em >8702&r$(; parent00imprime_caracteristicas(); echo (2&r$?uracao0 ( 1 $this#$duracao; }

Com a primeira lin/a class fitaKvideo e&tends suporte estamos indicando "ue est sendo definida a classe fitaKvideo e "ue vai /erdar da classe suporte. Nota: .omo est+ sendo (erdado de uma classe' 3 tem que con(ecer o cdigo da classe )pai)' neste caso' a classe suporte. 4e modo que o cdigo da classe suporte de!e estar includo dentro do arqui!o da classe fita5!ideo. odemos colocar os dois cdigos no mesmo diretrio' ou se esto em diretrios independentes' de!emos incluir o cdigo da classe suporte com a instruo include ou require de 3 . Ha classe fitaKvideo definimos um novo atri%uto c/amado Mduracao, "ue arma#ena o tempo "ue dura o filme. Em%ora a classe so%re a "ual /erdamos +a classe suporte- tin/a definido um construtor, a fita de v!deo deve iniciar a nova propriedade Mduracao, "ue : espec!fica das fitas de v!deo. Por isso, vamos so%rescrever ou su%stituir o m:todo construtor, o "ue se fa# simplesmente voltando a escrever o m:todo. 4 graa a"ui consiste em "ue o sistema pode %asear a nova declarao do construtor na declarao "ue e&istia para a classe da "ue /erda. ,u se a, /avia sido definido um construtor para a classe suporte, "ue iniciava os atri%utos desta classe. 4gora, para a classe fitaKvideo, / "ue iniciar os atri%utos definidos na classe suporte, mais o atri%uto Mduracao, "ue : o pr.prio de fitaKvideo. , c.digo do construtor : o seguinte< function __construct($tit"$num"$preco"$duracao){ parent00__construct($tit"$num"$preco); $this#$duracao = $duracao; }

Ha primeira lin/a do construtor : c/amado ao construtor criado para a classe CsuporteC. Para isso, utili#amos parent<< e logo o nome do m:todo da classe pai ao "ue se "uer c/amar, neste caso KKconstrutor+-. 4o construtor da classe pai l/e enviamos as variveis "ue sero iniciadas com a classe pai. Ha segunda lin/a do construtor inicia)se o atri%uto durao, com o "ue tivermos rece%ido por parGmetro. 4contece o mesmo com o m:todo imprimeKcaracteristicas+-, "ue agora deve mostrar tam%:m o novo atri%uto, pr.prio da classe fitaKvideo. Como se pode o%servar no c.digo da funo, fa#)se uso tam%:m de parent<<imprimeKcaracteristicas+- para utili#ar o m:todo definido na classe pai. 7e "uisermos provar a classe fitaKvideo, poder!amos utili#ar um c.digo como este< $minhafita = ne fita_video((/s /utros(" **" .1," ('', minutos(); echo (2&$( 1 $minhafita#$titulo 1 (2/&$(; echo (2&r$)reco0 ( 1 $minhafita#$dar_preco_sem_imposto() 1 ( euros(; echo (2&r$)reco 9>@ incluido0 ( 1 $minhafita#$dar_preco_com_iva() euros(; , "ue nos devolveria o seguinte< ,s ,utros Preo< 4.' euros Preo AL4 inclu!do< '.22 euros Silme em LH7< ,s ,utros 4.' +AL4 no inclu!doBurao< ??' minutos