Você está na página 1de 19

Manuais e recursos para desenvolvimento web www.criarweb.

com

Manual de PHP 5

Autores do manual Este manual foi criado pelos seguintes colaboradores de Criarweb.com: Miguel Angel Alvarez Traduo de JML
(10 captulos)

Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

Introduo a PHP 5
Vamos comear com o manual da ltima verso de PHP, lanada recentemente no mercado: PHP 5. Uma esperada evoluo da, talvez, mais popular das linguagens de programao de pginas e aplicaes web do lado do servidor. Este manual no vai tratar de explicar desde zero a programao de aplicaes do lado do servidor com PHP, pois esse assunto o temos detalhado no manual de PHP e achamos que vale a pena sua leitura para comear os primeiros passos na linguagem. Se uma pessoa no sabe o que so as pginas dinmicas de servidor, lhe recomendamos que comece clareando estes conceitos. Para isso, temos dois manuais que explicam as noes de programao do lado do cliente e do servidor, bem mais terico, desde os dois pontos de vistas: Manual de pginas dinmicas e a Introduo s linguagens do web. Tambm, ainda queremos apresentar a vocs o Workshop de PHP, onde se concentra mais alguns contedos sobre PHP que CriarWeb.com dispem. Da mesma forma seria interessante o Manual de MySQL pois possui referncias teis para clarear os conceitos de acesso base de dados. Introduo a 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 ajuda para a comunidade de desenvolvedores, tornando possvel que PHP seja a linguagem mais utilizada na web para a realizao de pginas avanadas. Entretanto, ainda existiam pontos negros no desenvolvimento de PHP que trataram de solucionar com a verso 5, aspectos que fizeram falta na verso 4, quase desde o dia de seu lanamento. Referimo-nos principalmente programao orientada a objetos (POO) que, apesar de estar suportada a partir de PHP3, s implementava uma parte muito pequena das caractersticas 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. Podemos ver uma pequena introduo no artigo O que a programao orientada a objetos.

O principal objetivo de PHP5 foi melhorar os mecanismos de POO para solucionar as carncias das verses anteriores. Um passo necessrio para conseguir que PHP seja uma linguagem apta para todo tipo de aplicaes e meios, inclusive os mais exigentes. Artigo por Miguel Angel Alvarez - Traduo de JML

Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

Instalao de PHP5 com WAMP5


Existe uma maneira de comear a utilizar PHP5 em Windows sem ter que sofrer as complicaes tpicas da instalao dos servidores necessrios para programar em PHP. Trata-se de instalar um pacote chamado WAMP, que permite instalar e configurar em um s processo o servidor Apache, a base de dados MySQL e o mdulo de programao em PHP verso 5. WAMP um sistema indicado para os usurios que no tm instalado no sistema nenhum dos programas necessrios para programar em PHP (Apache, PHP e MySQL), j que realiza uma instalao completa e desde zero. Mas tambm podem utilizar este programa os usurios que dispem de Apache, PHP e/ou MySQL em seu sistema. Em cujo caso, simplesmente se realizar outra cpia das aplicaes em um diretrio distinto, que princpio, no tem porque interferir com as outras instalaes alojadas em nosso computador. Programas que contem WAMP5 O software que se instala com WAMP5 contem os seguintes servidores e programas: Apache 1.3.31. O servidor de pginas web mais difundido do mercado. Embora a ltima verso deste servidor seja Apache 2, instala-se uma verso anterior que mais estvel. Existe um Add-on que permite substituir a verso 1.3.31 de Apache pela ltima verso. PHP5. O motor renovado da linguagem. MySQL. A base de dados mais difundida para utilizar com PHP. PHPmyadmin. Um software que permite administrar uma base de dados atravs de uma interface web. SQLitemanager. Um sistema para administrar uma base de dados a partir de sentenas SQL.

Instalao de WAMP A instalao se realiza atravs de um executvel Windows onde podem se introduzir poucas configuraes, apenas o diretrio onde desejarmos que se instalem os programas. Depois do processo de instalao foram criados dois servios com o servidor web e o de base de dados: Servio wampapache: Relacionado com o servidor Apache. Servio wampmysql: Relacionado com a base de dados MySQL.

Ademais, dentro do diretrio onde tivermos instalado WAMP5 ter sido criado uma pasta chamada "www", que corresponde com o diretrio de publicao, ou seja, o lugar onde devem ser colocadas as pginas web. Durante a instalao tambm devemos decidir se desejamos que WAMP5 se inicie automaticamente ao ligar o computador ou se desejamos que seu funcionamento se realize manualmente. Funcionamento dos servidores Quando instalamos WAMP5 se cria um grupo de programas chamado WampServer, onde poderemos encontrar uma opo que pe "Start Wampserver", que ser necessrio executar se no tivermos selecionado que o servidor se inicie automaticamente. Uma vez o WampServer em funcionamento obteremos um cone na barra de tarefas com a
Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 3

Manuais e recursos para desenvolvimento web www.criarweb.com

forma parecida a de um marcador de velocidade. Se clicarmos sobre esse cone, abrir um menu com opes variadas para providenciar os servios relacionados com o pacote. A imagem abaixo mostra esse menu.

Podemos provar se os servios esto funcionando perfeitamente acessando pgina de incio do servidor, escrevendo na barra de endereos de nosso navegador algo como http://localhost/. Ento dever aparecer uma pgina com vrios links s distintas ferramentas instaladas com WAMP5, alm de algumas pginas de proba de PHP. Add-ons Existem vrios acrscimos que podem ser instalados com WAMP, para ampliar as possibilidades do pacote. Por exemplo, podemos instalar um add-on para permitir que WAMP trabalhe com PHP5 ou com PHP4, criando una nova opo no menu de WAMP5 que permite mudar de uma verso a outra de PHP. Existem outros acrscimos disponveis: Instalar ActiveState Perl em nosso sistema, para permitir a execuo de CGI. Atualizar a verso de Apache 2. Instalar Zend Optimizer, para melhorar o comportamento em tempo de execuo de PHP. Por ltimo, o add-on que instala Webalizer, um sistema para obter estatsticas de uso do servidor web.

Pode-se obter mais informao deste sistema e opes para download na pgina http://www.en.wampserver.com/ Artigo por Miguel Angel Alvarez - Traduo de JML

Modelo de orientao a objetos de PHP 3 e 4


A verso 3 de PHP j suportava a programao orientada a objetos (POO), embora seja verdade que a maioria das caractersticas deste tipo de programao ainda no estavam implementadas. Teoricamente, com PHP3 podamos criar classes e instanciar objetos. As classes permitiam agrupar tanto mtodos como propriedades ou atributos, mas a coisa ficava por a. Em PHP4, se reescreveu o motor de PHP para torn-lo muito mais rpido e estvel, mas a POO, que havia introduzido a verso anterior da linguagem, praticamente no chegou a se modificar. Mesmo assim, durante a vigncia de PHP 4, a programao orientada a objetos foi utilizada habitualmente, muitas vezes em aplicaes de grande tamanho. At que se manifestou a falta de potncia da POO em PHP 4 e a necessidade de melhora-la em uma nova verso.

Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

O maior problema da POO nas verses 3 e 4 de PHP se baseava em que, cada vez que se atribua uma varivel que continha um objeto a outra varivel, ou se passava um objeto por parmetro em uma funo, se realizava uma cpia (um clone) desse objeto e ficava disposio do programa na nova varivel ou parmetro.
$carol = new pessoa("carol"); $carol2 = $carol;

Em um cdigo como o anterior, se tiver um objeto pessoa alojado na varivel $carol e na segunda linha de cdigo, cria-se um clone de $carol e se atribui varivel $carol2. Neste caso e sempre seguindo o anterior modo de trabalho de PHP, embora $carol e $carol2 contenham um objeto idntico, no se trata do mesmo objeto e sim, de uma cpia. Tudo isto implica que o espao de memria para salvar os dois objetos o dobro que se fosse um mesmo objeto com dois nomes distintos. Esta situao ocorreria porque os objetos eram tratados da mesma forma que as variveis normais, que se passam por valor nas funes e no caso de se atribuir, se realiza uma cpia da varivel antes de se atribuir ao novo espao. Exemplo da forma de trabalho com objetos de PHP 3 e 4 Vamos realizar um exemplo para ilustrar a forma de trabalho de PHP 3 e 4 com os objetos. Neste exemplo poder ficar patente o processo de clonagem dos objetos ao serem passados em uma funo ou ao se atriburem a outra varivel. Primeiro, veremos uma declarao de um objeto muito simples. Trata-se de uma "caixa" que tem um atributo que o contedo e dois mtodos, um para introduzir novos contedos na caixa e outro para mostrar o contedo atual da caixa.
class Caixa{ var $conteudo; function introduz($coisa){ $this->conteudo = $coisa; } function mostra_conteudo(){ echo $this->conteudo; } }

Agora veremos poucas linhas de cdigo que fazem uso da classe Caixa para ilustrar a forma de trabalho dos objetos em PHP 4. Vamos instanciar o objeto, logo o atribumos a outra varivel, com o qual se criar um clone desse objeto, continuamos modificando o clone e veremos o que acontece.
$minhacaixa = new Caixa(); $minhacaixa->introduz("algo"); $minhacaixa->mostra_conteudo(); "<br>"; $segunda_caixa = $minhacaixa; $segunda_caixa->introduz("conteudo na segunda caixa"); $segunda_caixa->mostra_conteudo();

Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

"<br>"; $minhacaixa->mostra_conteudo();

Na primeira linha de cdigo se instancia a caixa e se aloja o objeto na varivel $minhacaixa. Na segunda linha se introduz o string "algo" no contedo da caixa. Logo, mostra-se o contedo, com o que sair o string "algo" na pgina web. No segundo bloco de cdigo se atribui o objeto $minhacaixa varivel $segunda_caixa, com o que se cria o mencionado clone do objeto $minhacaixa e se atribui nova varivel. Logo, introduzimos um novo contedo instancia alojada na varivel $segunda_caixa. Ateno aqui, porque o clone alojado foi modificado na varivel $segunda_caixa, deixando inaltervel o objeto original $minhacaixa. Para comprovar, mostra-se o contedo do objeto $segunda_caixa, com o que aparece na pgina web o string "contedo em segunda caixa". Tambm se mostra o contedo $minhacaixa, que no se modificou apesar de atualizar o contedo de seu clone, com o que se mostra o string "algo". Espero que no seja muito difcil de entender. Vocs mesmos podem provar para compreender bem o exerccio. De qualquer forma, vamos dar outro exemplo o qual se utiliza a classe Caixa, que esperamos que sirva para esclarecer melhor o trabalho com objetos em PHP 3 e 4.
$minhacaixa = new Caja(); $minhacaixa->introduz("algo"); $minhacaixa->mostra_conteudo(); "<br>"; function vazia_caixa($caixa_esvaziar){ $caixa_esvaziar->introduz("p"); } vazia_caixa($minhacaixa); $minhacaixa->mostra_conteudo();

Neste exemplo, criamos uma funo que recebe por parmetro um objeto da classe caixa. Como os parmetros nas funes so recebidos por valor ao invs de referncia, quando se passa o parmetro do objeto caixa, no fundo o que se est realizando uma cpia desse objeto, de modo que dentro da funo se trabalha com um clone do objeto, ao invs do objeto mesmo. No cdigo se instancia o objeto caixa e se introduz "algo" em seu contedo. Logo, se declara uma funo que recebe o objeto e modifica seu contedo, introduzindo o string "p" no contedo da caixa. Nas seguintes linhas de cdigo, chama-se a funo declarada anteriormente, passando por parmetro o objeto $minhacaixa. Dentro da funo, como dizia, modifica-se o contedo da caixa, embora realmente se esteja modificando o contedo de um clone. Por ltimo, mostra-se o contedo do objeto $minhacaixa. Neste caso aparece "algo", apesar de que na funo esse "algo" se modificou por "p". Apesar de poder parecer chato, volto a repetir que na funo se modificou um clone do objeto e no o objeto original. Os comportamentos descritos anteriormente no so muito habituais em outras linguagens de

Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

programao orientada a objetos, como Java, onde o objeto no se duplica cada vez que se realiza uma atribuio ou um passo por parmetro. Para evitar o comportamento que descrevemos, PHP dispe da opo de passo de parmetros por referncia, que se realiza com o caractere "&". Por exemplo, para atribuir o prprio objeto e no um clone, poderamos ter utilizado este cdigo:
$segunda_caixa = &$minhacaixa;

Para receber um parmetro por referncia ao invs de por valor em uma funo utilizaramos esta declarao de funo:
function vazia_caixa(&$caixa_esvaziar){

A possibilidade de utilizar o caractere "&" para forar um passo por referncia no deixa de ser um problema, visto que nos obriga a utilizar esse mecanismo em mltiplos lugares e muito fcil se esquecer do "&" em algum lugar, com o qual nosso programa j no realizar os resultados esperados. Muitos programadores gastaram horas para encontrar o problema e de qualquer forma, um incmodo ter que estar pendentes de incluir constantemente o signo "&" no cdigo para fazer com que funcione como eles desejam. Artigo por Miguel Angel Alvarez - Traduo de JML

Modelo de orientao a objetos em PHP 5


No artigo anterior comentamos as carncias do modelo de orientao a objetos em PHP 3 e 4, que felizmente foram supridas na verso PHP 5. Como dizamos, um dos problemas mais bsicos das verses anteriores de PHP era a clonagem de objetos, que se realizava ao atribuir um objeto a outra varivel ou ao passar um objeto por parmetro em uma funo. Para resolver este problema PHP5 usa os manipuladores de objetos (Object handles), que so uma espcie de ponteiros que apontam os espaos de memria onde residem os objetos. Quando se atribui um manipulador de objetos ou se passa como parmetro em uma funo, se duplica o prprio object handle e no o objeto em si.
Nota: Tambm pode-se realizar uma clonagem de um objeto, para obter uma cpia exata, mas que no o prprio objeto. Para isso, utilizamos uma nova instruo chamada "clone", que veremos mais adiante.

Algumas caractersticas do trabalho com POO em PHP 5 Vejamos a seguir uma pequena lista das novas caractersticas da programao orientada a objetos (POO) em PHP5. No vamos descrever exaustivamente cada caracterstica. Faremos isso mais adiante neste mesmo manual. 1.- Nomes fixos para os construtores e destrutores Em PHP 5 temos que utilizar nomes pr-definidos para os mtodos construtores e destrutores (Os que se encarregam de resumir as tarefas de iniciao e de destruio dos objetos. Agora se chamam __construct() y __destruct(). 2.- Acceso public, private e protected a propriedades e mtodos A partir de agora podemos utilizar os modificadores de acesso habituais da POO. Estes
Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 7

Manuais e recursos para desenvolvimento web www.criarweb.com

modificadores servem para definir que mtodos e propriedades das classes so acessveis desde cada meio. 3.- Possibilidade de uso de interfaces As interfaces se utilizam na POO para definir um conjunto de mtodos que implementa uma classe. Uma classe pode implementar vrias interfaces ou conjuntos de mtodos. Na prtica, o uso de interfaces utilizado muitas vezes para suprir a falta de herana mltipla de linguagens como PHP ou Java. Explicaremos isto com detalhe mais adiante. 4.- Mtodos e classes final Em PHP 5 pode-se indicar que um mtodo "final". Com isso, no se permite sobrescrever esse mtodo, em uma nova classe que o herde. Se a classe "final", o que se indica que esta classe no permite ser herdada por outra classe. 5.- Operador instanceof Utiliza-se para saber se um objeto uma instncia de uma classe determinada. 6.- Atributos e mtodos static Em PHP5 podemos fazer uso de atributos e mtodos "static". So as propriedades e funcionalidades as quais se pode acessar a partir do nome de classe, sem a necessidade de haver instanciado um objeto de tal classe. 7.- Classes e mtodos abstratos Tambm possvel criar classes e mtodos abstratos. As classes abstratas no se podem instanciar, costumam ser utilizadas para herda-las de outras classes que no tm porque serem abstratas. Os mtodos abstratos no podem ser chamados, utilizam-se mais para serem herdados por outras classes, onde no tm porque serem declarados abstratos. 8.- Constantes de classe Pode-se definir constantes dentro da classe. Logo, pode-se acessar tais constantes atravs da prpria classe. 9.- Funes que especificam a classe que recebem por parmetro Agora podem se definir funes e declarar que devem receber um tipo especfico de objeto. No caso de que o objeto no seja da classe correta, se produz um erro. 10.- Funo __autoload() habitual que os desenvolvedores escrevam um arquivo por cada classe que realizam, como tcnica para organizar o cdigo das aplicaes. Por essa razo, s vezes fatigante realizar os incluis de cada um dos cdigos das classes que se utilizam em um script. A funo __autoload() serve para tentar incluir o cdigo de uma classe que se necessite, e que no tenha sido declarada ainda no cdigo que est sendo executada. 11.- Clonagem de objetos Se desejarmos, podemos realizar um objeto a partir da cpia exata de outro objeto. Para isso, utiliza-se a instruo"clone". Tambm pode se definir o mtodo __clone() para realizar tarefas associadas coma clonagem de um objeto. Artigo por Miguel Angel Alvarez - Traduo de JML

Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

Classes em PHP 5
Classes em PHP 5 As classes em Programao orientada a objetos (POO) so definies dos elementos que formam um sistema, neste caso, definies dos objetos que vo intervir em nossos programas. Um objeto se define indicando que propriedades e funcionalidades tm. Justamente essas declaraes so o que uma classe. Quando se faz uma classe simplesmente se especifica que propriedades e funcionalidades tm. Por exemplo, um homem poderia ter como propriedades o nome ou a idade e como funcionalidades, comer, mover-se ou estudar. Na classe homem, declararamos dois atributos: a idade ou o nome, que seriam como duas variveis. Tambm deveramos criar trs mtodos, com os procedimentos a seguir para que o homem possa comer, mover-se ou estudar. Estes mtodos se definem declarando funes dentro da classe. O cdigo para definir uma classe pode ser visto a seguir:
class homem{ 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 que este cdigo no difere em nada das verses anteriores de PHP, que j suportavam certas caractersticas da POO. Esta situao mudar explorando um pouco mais as caractersticas mais avanadas de PHP 5, que implicaro melhoras que no estavam presentes nas verses anteriores Instanciar objetos a partir de classes Vimos que uma classe somente uma definio. Se quisermos trabalhar com as classes devemos instanciar objetos, processo que consiste em gerar um exemplar de uma classe. Por exemplo, temos a classe homem anterior. Com a classe em si no podemos fazer nada, mas podemos criar objetos homem a partir dessa classe. Cada objeto homem ter umas caractersticas prprias, como a idade ou o nome. Ademais poder desempenhar umas funes como comer ou mover-se, agora tambm, cada um comer ou se mover por sua prpria conta quando lhe for solicitado, sem interferir princpio, com o que possa estar fazendo outro homem. Aproveitando, vamos ver como se gerariam dois homens, ou seja, como se instanciariam dois objetos da classe homem. Para isso, utilizamos o operador new.
Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 9

Manuais e recursos para desenvolvimento web www.criarweb.com

$carol = new homem(); $jorge = new homem();

Concluso importante se dar conta da diferena entre um objeto e uma classe. A classe uma definio de umas caractersticas e funcionalidades, algo abstrato que se concretiza com a instanciao de um objeto de tal classe. Um objeto j tem propriedades, com seus valores concretos, e podem ser passadas mensagens (chamar aos mtodos) para que faam coisas. Artigo por Miguel Angel Alvarez - Traduo de JML

Construtores em PHP 5
Os construtores se encarregam de resumir as aes de iniciao dos objetos. Quando instanciamos um objeto, temos que realizar vrios passos em sua iniciao, por exemplo, dar valores a seus atributos e isso o que se encarrega o construtor. Os construtores podem receber dados para iniciar os objetos como se deseje em cada caso. A sintaxe para a criao de construtor varia em relao a do PHP 3 e 4, pois deve se chamar com um nome fixo: __construct(). (So dois hfens baixos, antes da palavra "construct") A longo dos exemplos deste manual vamos ir criando um cdigo para gesto de um vdeo club. Vamos comear definindo uma classe cliente, que utilizaremos 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=array(); } function dame_numero(){ return $this->numero; }

O construtor nesta classe recebe o nome e nmero que atribuir ao cliente, que introduz logo em suas correspondentes propriedades. Ademais inicia o atributo filmes_alugados como um array, neste caso vazio porque ainda no tem nenhum filme em seu poder. Logo, criamos um mtodo muito simples para poder utilizar o objeto. Vamos ver umas aes simples para ilustrar o processo de instanciao e utilizao dos objetos.
//instanciamos dois objetos cliente $cliente1 = new cliente("Pedro", 1); $cliente2 = new cliente("Roberto", 564);

Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

10

Manuais e recursos para desenvolvimento web www.criarweb.com

//mostramos o numero de cada cliente criado "O identificador do cliente 1 : " . $cliente1->dame_numero(); " O identificador do cliente 2 : " . $cliente2->dame_numero();

Este exemplo obteria esta sada como resultado de sua execuo: O identificador do cliente 1 : 1 O identificador do cliente 2 : 564 Artigo por Miguel Angel Alvarez - Traduo de JML

Destrutores em PHP 5
Os destrutores so funes que se encarregam de realizar as tarefas que se necessita executar quando um objeto deixa de existir. Quando um objeto j no est referenciado por nenhuma varivel, deixa de ter sentido que esteja armazenado na memria, portanto, o objeto deve ser destrudo para liberar seu espao. No momento de sua destruio, a funo se chama destrutor, que pode realizar as tarefas que o programador estime oportuno realizar. A criao do destrutor opcional. Somente devemos cri-lo, se desejarmos fazer alguma coisa quando um objeto se elimine da memria. O destrutor como qualquer outro mtodo da classe, embora deve se declarar com um nome fixo: __destruct(). No cdigo seguinte veremos um destrutor em funcionamento. Embora a ao que se realiza ao destruir o objeto no muito til, pode nos servir bem para ver como trabalha.
class cliente{ var $nome; var $numero; var $filmes_alugados; function __construct($nome,$numero){ $this->nome=$nome; $this->numero=$numero; $this->filmes_alugados=array(); } function __destruct(){ "<br>destruido: " . $this->nome; } function dame_numero(){ return $this->numero; }

//instanciamos dois objetos cliente $cliente1 = new cliente("Pedro", 1); $cliente2 = new cliente("Roberto", 564); //mostramos o numero de cada cliente criado "O identificador do cliente 1 : " . $cliente1->dame_numero(); "<br>O identificador do cliente 2 : " . $cliente2->dame_numero();

Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

11

Manuais e recursos para desenvolvimento web www.criarweb.com

Este cdigo igual que o anterior. Somente acrescentamos o destrutor, que imprime uma mensagem na tela com o nome do cliente que foi destrudo. Depois de sua execuo obteramos a seguinte sada. O identificador do cliente 1 : 1 O identificador do cliente 2 : 564 destrudo: Pedro destrudo: Roberto Como vimos, antes de acabar o script, libera-se o espao na memria dos objetos, com o qual se executa o destrutor e aparece a correspondente mensagem na pgina. Um objeto pode ficar sem referncias e, portanto, ser destrudo, por muitas razes. Por exemplo, o objeto pode ser uma varivel local de uma funo e ao finalizar a execuo dessa funo local deixaria de ter validade, sendo ento destrudo. O cdigo seguinte ilustra como uma varivel local a qualquer mbito (por exemplo, local a uma funo), se destri quando esse mbito foi finalizado.
function cria_cliente_local(){ $cliente_local = new cliente("sou local", 5); } cria_cliente_local()

A funo simplesmente cria uma varivel local que contem a instanciao de um cliente. Quando a funo se acaba, a varivel local deixa de existir, e ento, chama-se ao destrutor definido para esse objeto.
Nota: Tambm podemos nos desfazer de um objeto sem a necessidade de acabar com o mbito onde foi criado. Para isso, temos a funo unset() que recebe uma varivel e a elimina da memria. Quando se perde uma varivel que contem um objeto e esse objeto deixa de ter referncias, elimina-se ao objeto e chama-se ao destrutor.

Artigo por Miguel Angel Alvarez - Traduo de JML

Modificadores de acesso a mtodos e propriedades em PHP


Veremos neste captulo os novos modificadores de acesso aos mtodos e atributos dos objetos que foram incorporados em PHP 5. Estes modificadores de acesso so os conhecidos public, protected e private, que j dispem de outras linguagens como Java. Um dos princpios da programao orientada a objetos o encapsulamento, que um processo no qual se ocultam as caractersticas internas de um objeto queles elementos que no tm porque conhece-las. Os modificadores de acesso servem para indicar as permisses que tero outros objetos para acessar a seus mtodos e propriedades.

Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

12

Manuais e recursos para desenvolvimento web www.criarweb.com

Modificador public o nvel de acesso mais permissivo. Serve para indicar que o mtodo ou atributo da classe pblico. Neste caso pode-se acessar a este atributo, para visualiz-lo ou edita-lo, por qualquer outro elemento de nosso programa. o modificador que se aplica se no se indica outra coisa. Vejamos um exemplo de classe onde declaramos como public seus elementos, um mtodo e uma propriedade. Trata-se da classe "dado", que tem um atributo com sua pontuao e um mtodo para tirar o dado o obter uma nova pontuao aleatria.
class dado{ public $pontos; function __construct(){ srand((double)microtime()*1000000); } public function tirar(){ $this->pontos=$randval = rand(1,6); }

$meu_dado = new dado(); for ($i=0;$i<30;$i++){ $meu_dado->tirar(); "<br>Saiu " . $meu_dado->pontos . " pontos"; }

Vemos a declarao da classe dado, e logo umas linhas de cdigo para ilustrar seu funcionamento. No exemplo se realiza um loop 30 vezes, nas quais se tira o dado e se mostra a pontuao que se obteve. Como o atributo $pontos e o mtodo tirar() so pblicos, podemos acess-los de fora do objeto, ou que o mesmo, de fora do cdigo da classe. Modificador private o nvel de acesso mais restritivo. Serve para indicar que essa varivel somente vai poder ser acessada pelo prprio objeto, nunca de fora. Se tentarmos acessar um mtodo ou atributo declarado private de fora do prprio objeto, obteremos uma mensagem de erro indicando que no possvel a este elemento. Se no exemplo anterior tivssemos declarado private o mtodo e a propriedade da classe dado, teramos recebido uma mensagem de erro. Aqui temos outra possvel implementao da classe dado, declarando como private o atributo pontos e o mtodo tirar().
class dado{ private $pontos; function __construct(){ srand((double)microtime()*1000000); } private function tirar(){ $this->pontos=$randval = rand(1,6); Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 13

Manuais e recursos para desenvolvimento web www.criarweb.com

} public function dar_nova_pontuacao(){ $this->tirar(); return $this->pontos; }

$meu_dado = new dado(); for ($i=0;$i<30;$i++){ "<br>Han salido " . $meu_dado->dar_nova_pontuacao() . " pontos"; }

Tivemos que criar um novo mtodo pblico para operar com o dado, porque se tudo privado no h forma de fazer uso dele. O mencionado mtodo dar_nova_pontuacao(), que realiza a ao de tirar o dado e devolver o valor que saiu. Modificador protected Este indica nvel de acesso mdio e um pouco mais especial que os anteriores. Serve para que o mtodo ou o atributo seja pblico dentro do cdigo da prpria classe e de qualquer classe que herde daquela onde est o mtodo ou propriedade protected. privado e no acessvel de qualquer outra parte. Ou seja, um elemento protected pblico dentro da prpria classe e em suas heranas. Mais adiante explicaremos a herana e poderemos oferecer exemplos com o modificador protected. Concluso Muitas vezes o prprio desenvolvedor o que fixa seu critrio na hora de aplicar os distintos modificadores de acesso a atributos e mtodos. Pouca proteo implica que os objetos percam seu encapsulamento e com isso, uma das vantagens da POO. Uma proteo maior pode tornar mais trabalhoso gerar o cdigo do programa, mas em geral, aconselhvel. Artigo por Miguel Angel Alvarez - Traduo de JML

A herana em PHP5
A herana um dos mecanismos fundamentais da programao orientada a objetos. Por meio da herana, podem se definir classes a partir da declarao de outras classes. As classes que herdam incluem os mtodos como as propriedades da classe a partir da qual esto definidos. Por exemplo, pensemos na classe "veculo". Esta classe geral pode incluir as caractersticas gerais de todos os veculos (atributos da classe), como a matrcula, ano de fabricao e potncia. Ademais, incluir algumas funcionalidades (mtodos da classe) como poderiam ser, ligar() ou mover(). Agora tambm, na prtica existem vrios tipos de veculos, como os carros, os nibus e os caminhes. Todos eles tm umas caractersticas comuns, que foram definidas na classe veculo. Ademais, tero uma srie de caractersticas prprias do tipo de veculo, que,

Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

14

Manuais e recursos para desenvolvimento web www.criarweb.com

princpio, no tm outros tipos de veculos. Por exemplo, os caminhes podem ter uma carga mxima permitida ou os nibus um nmero de lugares disponveis. Da mesma forma, as classes mais especficas podem ter umas funcionalidades prprias, como os caminhes carregar() e descarregar(), ou os nibus aceitar_passageiros() ou vender_passagem(). O normal em sistemas de herana que as classes que herdam de outras incluam novas caractersticas e funcionalidades, parte dos atributos e mtodos herdados. Porm, isto no imprescindvel, de modo que podem se criar objetos que herdem de outros e no incluam nada novo. Sintaxe de herana em PHP 5 A programao orientada a objetos nos oferece uma srie de mecanismos para definir este tipo de estruturas, de modo que possam se criar hierarquias de objetos que herdam uns de outros. Veremos agora como definir estas estruturas de herana em PHP 5. Para isso, continuando com nosso exemplo da locadora de vdeo, vamos criar os distintos tipos de elementos que so oferecidos no aluguel. Como todo mundo conhece, as locadoras de vdeos oferecem distintos tipos de elementos para alugar, como podem ser os filmes (fitas de vdeo ou DVD) e os jogos. Cada elemento tem umas caractersticas prprias e algumas comuns. Chamamos "suporte" classe geral, que inclui as caractersticas comuns para todos os tipos de elementos em aluguel. Logo, criamos trs tipos de suportes diferentes, que herdam da classe suporte, mas que incluem algumas caractersticas e funcionalidades novas. Estes tipos de suporte sero "fita_video", "dvd" e "jogo". O esquema de herana que vamos realizar neste exemplo pode ser visto na seguinte imagem.

Comeamos pela classe suporte. Seu cdigo ser o seguinte:


class suporte{ public $titulo; protected $numero; private $preco; function __construct($tit,$num,$preco){ $this->titulo = $tit; $this->numero = $num; $this->preco = $precio; }

Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

15

Manuais e recursos para desenvolvimento web www.criarweb.com

public function dar_preco_sem_imposto(){ return $this->preco; } public function dar_preco_com_imposto(){ return $this->preco * 1.16; } public function dar_numero_identificacao(){ return $this->numero; } public function imprime_caracteristicas(){ echo $this->titulo; echo "<br>" . $this->preco . " (imposto nao incluido)"; }

Os atributos que definimos so, ttulo, nmero (um identificador do suporte) e preo. Aplicamos a cada um, um modificador de acesso distinto, para poder praticar os diferentes tipos de acesso. Definimos um constructor, que recebe os valores para a iniciao do objeto. Um mtodo dar_preco_sim_imposto(), que devolve o preo do suporte, sem aplicar o imposto. Outro mtodo dar_preco_com_imposto(), que devolve o preo uma vez aplicado por exemplo, 16% de imposto. O mtodo dar_numero_identificacao(), que devolve o nmero de identificador e imprime_caracteristicas(), que mostra na pgina as caractersticas deste suporte.
Nota: Como se foi definido como private o atributo preo, este atributo s poder ser acessado dentro do cdigo da classe, ou seja, na prpria definio do objeto. Se quisermos acessar ao preo de fora da classe (algo muito normal se temos em conta que vamos necessitar o preo de um suporte de outras partes da aplicao) ser necessrio criar um mtodo que nos devolva o valor do preo. Este mtodo devera se definir como public, para que possa ser acessado de qualquer lugar que se necessite.

Em todos os mtodos usa-se a varivel $this. Esta varivel no mais que uma referncia ao objeto sobre o qual se est executando o mtodo. Em programao orientada a objetos, para executar qualquer destes mtodos, primeiro temos que ter criado um objeto a partir de uma classe. Logo, poderemos chamar os mtodos de um objeto. Isto se faz com $meu_objeto>metodo_a_chamar(). Dentro de mtodo, quando se utiliza a varivel $this, se est fazendo referncia ao objeto sobre o qual se chamou ao mtodo, neste caso, o objeto $meu_objeto. Com $this->titulo estamos fazendo referncia ao atributo "titulo" que tem o objeto $meu_objeto. Se quisermos provar a classe suporte, para confirmar que se executa corretamente e que oferece resultados coerentes, podemos utilizar um cdigo como o seguinte.
$suporte1 = new suporte("Os Intocveis",22,3); echo "<b>" . $suporte1->titulo . "</b>"; echo "<br>Preco: " . $suporte1->dar_preco_sem_imposto() . "euros"; echo "<br>Preco imposto includo: " . $suporte1->dar_preco_com_imposto() . " euros";

Neste caso criamos uma instncia da classe suporte, em um objeto que chamamos $suporte1. Logo, imprimimos seu atributo titulo (como o ttulo foi definido como public, podemos acessalo desde fora do cdigo da classe. Logo, chamam-se aos mtodos dar_preco_sem_imposto() e dar_preco_com_imposto() para o objeto criado.

Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

16

Manuais e recursos para desenvolvimento web www.criarweb.com

Dara isto como resultado: Os Intocveis Preo: 3 euros Preo imposto includo: 3,48 euros Nos prximos captulos vamos ver como definir classes que herdem da classe suporte. Artigo por Miguel Angel Alvarez - Traduo de JML

A herana em PHP 5 Segunda Parte


Como estamos vendo, os mecanismos de herana em PHP 5 so similares aos existentes em outras linguagens de programao. Agora vamos relatar como construir uma classe que herda de outra. Continuando com nosso exemplo da locadora de vdeo, vamos construir uma classe para os suportes de tipo fita de vdeo. As fitas de vdeo tm um atributo novo que a durao da fita. No tm nenhuma classe nova, embora devemos aprender a sobrescrever mtodos criados para o suporte, visto que agora tm que fazer tarefas mais especficas. Sobrescrever mtodos Antes de mostrar o cdigo da classe fita_video, vamos falar sobre a sobrescritura ou substituio de mtodos, que um mecanismo pelo qual uma classe que herda pode redefinir os mtodos que est herdando. Pensemos em uma cafeteira. Sabemos que existem muitos tipos de cafeteiras e todas fazem caf, mas o mecanismo para fazer o caf distinto dependendo do tipo de cafeteira. Existem cafeteiras express, cafeteiras por gotas e at se pode fazer caf com uma meia! Nossa cafeteira "pai" (da que vai herdar todas as cafeteiras) pode ter definido um mtodo fazer_cafe(), mas no necessariamente todas as cafeteiras que possam herdar desta fazem o caf seguindo o mesmo processo. Ento podemos definir um mtodo para fazer caf padro, que teria a classe cafeteira. Mas ao definir as classes cafeteira_express e cafeteira_gotas, deveramos sobrescrever o mtodo fazer_cafe() para que se ajuste ao procedimento prprio destas. A sobrescritura de mtodos algo bastante comum em mecanismos de herana, visto que os mtodos que foram criados para uma classe "pai" no tm porqu ser os mesmos que os definidos nas classes que herdam. Veremos como sobrescrever ou substituir mtodos em um exemplo de herana, seguindo nosso exemplo da locadora de vdeo. Sintaxe para herdar em PHP 5 Havamos comentado que a locadora de vdeo dispe de diferentes elementos para alugar, como fitas de vdeo, DVD ou jogos. Havamos criado uma classe suporte, que vamos herdar
Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 17

Manuais e recursos para desenvolvimento web www.criarweb.com

em cada um dos elementos disponveis para alugar. Vamos comear pela classe fita_video, cujo cdigo ser o seguinte:
class fita_video extends suporte{ private $duracao; function __construct($tit,$num,$preco,$duracao){ parent::__construct($tit,$num,$preco); $this->duracao = $duracao; } public function imprime_caracteristicas(){ echo "Filme em VHS:<br>"; parent::imprime_caracteristicas(); echo "<br>Duracao: " . $this->duracao; }

Com a primeira linha class fita_video extends suporte estamos indicando que est sendo definida a classe fita_video e que vai herdar da classe suporte.
Nota: Como est sendo herdado de uma classe, PHP tem que conhecer o cdigo da classe "pai", neste caso, a classe suporte. De modo que o cdigo da classe suporte deve estar includo dentro do arquivo da classe fita_video. Podemos colocar os dois cdigos no mesmo diretrio, ou se esto em diretrios independentes, devemos incluir o cdigo da classe suporte com a instruo include ou require de PHP.

Na classe fita_video definimos um novo atributo chamado $duracao, que armazena o tempo que dura o filme. Embora a classe sobre a qual herdamos (a classe suporte) tinha definido um construtor, a fita de vdeo deve iniciar a nova propriedade $duracao, que especfica das fitas de vdeo. Por isso, vamos sobrescrever ou substituir o mtodo construtor, o que se faz simplesmente voltando a escrever o mtodo. A graa aqui consiste em que o sistema pode basear a nova declarao do construtor na declarao que existia para a classe da que herda. Ou seja, j havia sido definido um construtor para a classe suporte, que iniciava os atributos desta classe. Agora, para a classe fita_video, h que iniciar os atributos definidos na classe suporte, mais o atributo $duracao, que o prprio de fita_video. O cdigo do construtor o seguinte:
function __construct($tit,$num,$preco,$duracao){ parent::__construct($tit,$num,$preco); $this->duracao = $duracao; }

Na primeira linha do construtor chamado ao construtor criado para a classe "suporte". Para isso, utilizamos parent:: e logo o nome do mtodo da classe pai ao que se quer chamar, neste caso __construtor(). Ao construtor da classe pai lhe enviamos as variveis que sero iniciadas com a classe pai. Na segunda linha do construtor inicia-se o atributo durao, com o que tivermos recebido por parmetro. Acontece o mesmo com o mtodo imprime_caracteristicas(), que agora deve mostrar tambm o novo atributo, prprio da classe fita_video. Como se pode observar no cdigo da funo, fazse uso tambm de parent::imprime_caracteristicas() para utilizar o mtodo definido na classe
Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 18

Manuais e recursos para desenvolvimento web www.criarweb.com

pai. Se quisermos provar a classe fita_video, poderamos utilizar um cdigo como este:
$minhafita = new fita_video("Os Outros", 22, 4.5, "115 minutos"); echo "<b>" . $minhafita->titulo . "</b>"; echo "<br>Preco: " . $minhafita->dar_preco_sem_imposto() . " euros"; echo "<br>Preco IVA incluido: " . $minhafita->dar_preco_com_iva() . " euros";

O que nos devolveria o seguinte: Os Outros Preo: 4.5 euros Preo IVA includo: 5.22 euros Filme em VHS: Os Outros 4.5 (IVA no includo) Durao: 115 minutos Artigo por Miguel Angel Alvarez - Traduo de JML

Manual de PHP 5: http://www.criarweb.com/php5/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

19