Posts Tagged PHP

Tutorial Series: Orientação a objetos utilizando PHP #2

Ver Tutorial Series: Orientação a objetos utilizando PHP
Ver Tutorial Series: Introdução a orientação a objetos

Implementando uma classe e criando objetos a partir dela

A implementação de uma classe só tem sentido se, no contexto do desenvolvimento de um sistema orientado a objeto, for identificada a necessidade de existência de um conjunto de objetos com atributos e comportamentos em comum. A partir do momento que esses objetos com atributos e comportamento em comum são identificados, já existe a necessidade de criar a estrutura (classe) que os defina.

Neste módulo, você irá aprender como implementar na linguagem PHP uma classe e como criar objetos (instâncias) a partir dela. Pode-se falar também no termo “instanciar objetos” a partir de uma classe.

Não iremos neste momento demonstrar o processo de identificação de objetos num dado problema, isso será feito nas seções seguintes.

Veremos agora, como implementar a classe Cliente do Sistema de Conta Corrente citado anteriormente e como criar objetos cliente a partir dela.

A visão prática desses dois conceitos (Classe e Objeto) facilitará o entendimento dos demais conceitos.

Implementação da Classe Cliente

A seguir será apresentada uma implementação resumida e mais didática da classe Cliente.

  1. class Cliente {
  2.  
  3.  private $nome;
  4.  private $endereco;
  5.  private $cpf;
  6.  
  7.  function __construct() {
  8.   $this->nome = "";
  9.   $this->endereco = "";
  10.   $this->cpf = "";
  11.  }
  12.  
  13.  public function setNome($nome) {
  14.   $this->nome = $nome;
  15.  }
  16.  
  17.  public function setEndereco($endereco) {
  18.   $this->endereco = $endereco;
  19.  }
  20.  
  21.  public function setCpf($cpf) {
  22.   $this->cpf = $cpf;
  23.  }
  24.  
  25.  public function getNome() {
  26.   return $this->nome;
  27.  }
  28.  
  29.  public function getEndereco() {
  30.   return $this->endereco;
  31.  }
  32.  
  33.  public function getCpf() {
  34.   return $this->cpf;
  35.  }
  36.  
  37. }

Análise da classe Cliente

Para se nomear classes, existem alguns requisitos que devem ser observados. Classes são nomeadas com um substantivo no singular.

- O nome de uma classe deve iniciar com a primeira letra maiúscula;

- Não devem ser utilizados símbolos de sublinhado (“_”)

- Nomes compostos por múltiplas palavras são organizados com todas as palavras juntas,  onde a primeira letra de cada uma fica maiúscula.

- Exemplos: Aluno, Professor, FolhaPagamento.

Após a definição inicial da classe, temos a definição dos seus atributos. Na definição dos atributos deve-se utilizar a palavra private (veremos mais adiante o significado dessa palavra) seguido do nome do atributo. No caso da classe Cliente, temos os atributos nome, endereço e cpf.

- Normalmente, atributos são colocados no início da definição da classe, depois do primeiro { .

- Devem começar com letra minúscula.

Depois da definição do nome da classe e dos atributos da classe, segue-se a definição dos comportamentos, no contexto da implementação, conhecidos como métodos. Por enquanto, os comportamentos ou métodos definidos para a classe Cliente são simples. Na medida em que formos avançando, mais comportamentos ou métodos poderão ser implementados. No momento, implementamos sete métodos: __construct(), setNome(), setEndereco(), setCpf(), getNome(), getEndereco() e getCpf().

O primeiro método implementado se chama __construct(). Este é um método construtor. Um método construtor no PHP (em sua versão 5, pois na versão 4 os métodos construtores tinham o mesmo nome da classe) deve ter sempre este nome e não devem retornar nada, apenas realizar as tarefas necessárias para a utilização do objeto no momento em que ele é criado (instanciado). Vamos saber mais sobre métodos construtores no momento da explicação da criação de objetos. Saiba por enquanto que é importante (não obrigatório) que cada classe tenha um método construtor implementado.

O que se pode programar dentro de um método construtor?

Qualquer coisa que se quer que aconteça quando um objeto do tipo Cliente, no caso, for criado, porque o código que está dentro de um método  construtor é executado sempre que um objeto desse tipo for criado. Porém, normalmente se programa para que os atributos do objeto sejam inicializados. No caso do nosso método construtor, os atributos da classe foram inicializados com uma string vazia (“”).

Abaixo do método construtor estão os métodos “setters” e “getters”. Estes métodos são geralmente utilizados com a nomenclatura neste padrão (setNomeDoAtributo() e getNomeDoAtributo()) definem os valores dos atributos da classe e “informam” estes valores. Os métodos set definem o valor que será definido para o atributo da classe e o método get retorna o valor que foi definido anteriormente pelo método set ou definido no construtor da classe.

Observe que os métodos gets utilizam a palavra “return”, que (obviamente) retorna algum valor caso seja a intenção do método.

Criar objetos a partir da classe Cliente

Depois que a classe Cliente for implementada, ela está pronta para ser “usada”, ou seja, é possível criar objetos do tipo Cliente a partir dela.

A explicação de criar um objeto é similar à criação (declaração) de uma variável de memória. Quando declaramos uma variável de memória também estamos reservando espaço na memória para armazenar algum valor. Essa variável de memória deve ter um nome que a identifica. O mesmo acontece com a criação de um objeto. Ao criar um objeto, precisamos dar um nome (identificação) para ele e, nesse espaço de memória que estamos declarando, serão armazenados os valores correspondentes aos atributos definidos na (classe) desse objeto.

Essa explicação para criação de objeto é simples e será utilizada no momento para facilitar seu entendimento. Posteriormente, essa explicação será refinada.

  1. $c = new Cliente();

Após a execução dessa linha, um objeto, ou seja, uma área de memória é alocada.. Note cuja a sintaxe é igual a definida acima para criação de objetos. Sempre que um objeto é criado, o método construtor definido na classe desse objeto é chamado (invocado) e, tudo o que está programado nesse método, é executado.

O que foi programado no método construtor da classe Cliente?

A inicialização de todos os atributos do objeto Cliente, portanto, ao criar o objeto cliente, todos os seus atributos já estarão inicializados. A figura abaixo ilustra de maneira simples o objeto alocado na memória e seus atributos inicializados:

O código abaixo demonstra o uso da classe cliente:

  1. $c = new Cliente();
  2.  
  3. $c->setNome(“Thiago”);
  4. $c->setCpf(000.000.000-00);
  5. $c->setEndereco(“Minha Casa”);
  6.  
  7. $nome = $c->getNome();
  8. $cpf = $c->getCpf();
  9. $endereco = $c->getEndereco();

Inicialmente, instanciamos um objeto do tipo Cliente chamado $c. Neste momento, o valor dos atributos ainda são “” (string vazia), conforme definido no construtor. Após a execução dos métodos setters, os valores dos atributos são alterados para os valores definidos em cada um. Depois dos métodos setters temos os métodos getters, que estão armazenando nas variáveis $nome, $cpf e $endereco os valores dos atributos do objeto que são retornados quando utilizamos os métodos getters.

A figura abaixo ilustra de o objeto alocado na memória após a execução do código acima:

Dúvidas? Sintam-se a vontade para perguntar… Um abraço e até a próxima!

, ,

No Comments

Cancelamento do PHP 6 Antecipa Aceleração para o PHP 5.4

Autor Convidado: Este post foi escrito por Manuel Lemos, criador do site PHPClasses.org em 1999 e fundador da Icontem, empresa na qual atua desde 2001.

Em Março de 2010, os desenvolvedores do núcleo do PHP decidiram repensar o futuro desta linguagem.
Após cerca de 5 anos desenvolvendo aquilo que seria o PHP 6, o criador do PHP, Rasmus Lerdorf anunciou que a abordagem da principal novidade do PHP 6, suporte nativo a Unicode, teria de ser repensada.
Unicode é um padrão internacional para representar texto de caracteres de todas as linguas vivas usando uma só codificação. Isto significa que o Unicode permite escrever e misturar textos que incluiem caracteres de qualquer língua.
O principal recurso do PHP 6 ia ser o suporte nativo a Unicode. Isto significa que os desenvolvedores de PHP poderiam manipular textos de vários idiomas com as mesmas funções da linguagem que usam hoje, mas sem precisar de usar funções adicionais para combinar textos que usam conjuntos de caracteres de línguas diferentes.
O problema é que a abordagem pensada originalmente em 2005 para implementar nativamente o suporte do Unicode no PHP 6 estava demorando a ser implementada, já que o projeto era muito ambicioso. Além disso, existiam algumas dúvidas, se essa implementação não ia forçar uma perda de desempenho de aplicações de PHP, mesmo para as que não usassem esse recurso de suporte nativo a Unicode.
Por isso, o desenvolvimento do PHP 6, como versão separada do PHP 5, foi cancelado. Agora existe apenas um tronco de desenvolvimento. Esse tronco inclui outras novidades que estavam sendo pensadas para o PHP 6, além do suporte nativo a Unicode.
Existem dúvidas se a próxima versão do PHP se vai chamar PHP 5.4 ou PHP 6. O mais provável é que se chame PHP 5.4 uma vez que ainda não está claro se o suporte nativo a Unicode vai ser de fato incluído. Apesar desta dúvida, vamos considerar por agora que realmente vai ser PHP 5.4.
Integração da extensão de aceleração APC
Como consequência destas mudanças, uma das novidades que vai ser antecipada para o PHP 5.4 é a integração da extensão de aceleração APC.
Esta é uma de várias extensões que existem para PHP que permitem acelerar o carregamento de scripts usando um método de cache dos scripts.
Desde o PHP 4, lançado no ano 2000, a execução de scripts de PHP foi dividida em 2 partes: a compilação e a execução propriamente dita. A compilação cria em memória uma espécie de código compilado, que pode ser executado muito mais rapidamente do que quando o PHP ainda era uma linguagem totalmente interpretada, como ocorria até ao PHP 3.
As extensões de cache guardam em memória o tal código compilado. Isso permite que, depois de rodar uma vez, os scripts de PHP demoram bem menos para começar a executar.
Já existem extensões de cache de PHP de pouco tempo depois do PHP 4 ter sido lançado. Porém, estas nunca foram incluídas na distribuição principal do PHP por pressão da empresa Zend.
A Zend foi fundada por 2 dos principais desenvolvedores do núcleo do PHP. Como a Zend vende a sua própria extensão de cache do PHP, sempre se opuseram a inclusão de outra extensão de cache de código aberto na distribuição do PHP, já que certamente isso canibalizaria o seu produto comercial.
Porém, aceitaram a inclusão de uma extensão de cache no PHP 6. Isso daria tempo para a Zend criar outros produtos comerciais para se sustentarem.
Agora que o PHP 6 foi cancelado, o caminho ficou livre para antecipar a inclusão de uma extensão de cache de código aberto no PHP 5.4.
Existem várias extensões de cache para o PHP, porém é mais provável que incluam a extensão APC, pois é bem recebida pelos desenvolvedores do núcleo do PHP.
Outra extensão para o mesmo fim, o eAccelerator, é inclusive mais robusta e está sendo desenvolvida ativamente. Porém é distribuída com a licença GPL, que é incompatível com a licença do PHP. Por isso dificilmente poderá vir a ser incluída.
Apesar de tanto o APC como o eAccelerator funcionarem em servidores Linux e Windows, a Microsoft desenvolveu também a sua extensão de cache de código aberto para PHP, o WinCache. Assim, espera-se que o PHP funcione de forma mais otimizada em servidores Windows com IIS. Essa extensão pode ser obtida gratuitamente instalando o Microsoft Web Platform Installer.
Qual a importância disso para os desenvolvedores de PHP?
Em relação ao suporte nativo para a Unicode, pouco ou nada afeta os atuais projetos de PHP. Era um recurso que poderia facilitar um pouco o desenvolvimento de sites internacionais, mas realmente não é necessário.
Existem inúmeros sites internacionais escritos em PHP que usam Unicode, como Wikipedia, Facebook, Yahoo, só para citar alguns dos mais conhecidos. Mas realmente eles não precisam do suporte nativo a Unicode. Esses certamente usam outras extensões de PHP existentes como mbstring ou intl.
Quem desenvolve sites apenas em um idioma, nem precisa sequer pensar no assunto. Mesmo sites que misturam Inglês, Português, ou vários outros idiomas Europeus, podem continuar a usar a codificação ISO-Latin-1 (ISO-8859-1) como sempre, sem qualquer preocupação.
Quem realmente tinha mais interesse nesse suporte nativo a Unicode seriam empresa de sites que misturam texto que podem incluir línguas de países asiáticos ou do Leste Europeu.
Em relação à extensão de cache, sites que usam servidores dedicados ou servidores virtuais privados (VPS – às vezes associados à computação em nuvem), com certeza já estão usando extensões de cache, já que elas podem ser instaladas sem a necessidade de solicitação da empresa de hospedagem.
Se você tem sites de PHP em servidores dedicados ou servidores virtuais privados, mas não está usando uma extensão de cache, não pense duas vezes. Instale qualquer uma das outras extensões de cache, e comece já a se beneficiar da possibilidade de rodar PHP mais rápido, consumindo menos recursos do seu servidor.
Quem realmente pode se beneficiar mais da inclusão da extensão de cache na distribuição principal do PHP, são os sites que estão hospedados em servidores partilhados, que normalmente são os que oferecem hospedagem por preços mais em conta.
Existem algumas empresas de hospedagem que já instalaram extensões de cache nos servidores partilhados onde estão os sites dos seus clientes. Porém, uma grande parte dessas empresas não faz isso. Talvez seja por desconhecimento dessas extensões ou por incerteza em relação à sua estabilidade.
Com a inclusão do APC no PHP 5.4, muitas empresas de hospegam partilhada vão passar a ativar essa extensão de cache nos seus servidores, uma vez declarado o suporte oficial à inclusão do APC na distribuição de PHP, essas empresas vão se sentir mais confiantes para instalar o PHP com essa extensão.
No entanto, a extensão APC virá incluida na distribuição principal do PHP, mas vem desativada na configuração do PHP. Os administradores de sistemas das empresas de hospedagem precisarão ativar a extensão manualmente nos servidores partilhados que rodam os sites dos seus clientes.
Onde obter mais informações?
Estes e outros assuntos foram debatidos no podcast Lately in PHP do site PHPClasses.org. No episódio mais recente do podcast foram comentados estes assuntos, assim como outros também de grande interesse como o suporte para desenvolvimento de aplicativos nativos para celulares Android escritos em PHP. Aproveite agora para escutar o podcast ou ler a transcrição das discussões que aparecem no fim dos artigos.

Em Março de 2010, os desenvolvedores do núcleo do PHP decidiram repensar o futuro desta linguagem.

Após cerca de 5 anos desenvolvendo aquilo que seria o PHP 6, o criador do PHP, Rasmus Lerdorf anunciou que a abordagem da principal novidade do PHP 6, suporte nativo a Unicode, teria de ser repensada.

Unicode é um padrão internacional para representar texto de caracteres de todas as linguas vivas usando uma só codificação. Isto significa que o Unicode permite escrever e misturar textos que incluiem caracteres de qualquer língua.

O principal recurso do PHP 6 ia ser o suporte nativo a Unicode. Isto significa que os desenvolvedores de PHP poderiam manipular textos de vários idiomas com as mesmas funções da linguagem que usam hoje, mas sem precisar de usar funções adicionais para combinar textos que usam conjuntos de caracteres de línguas diferentes.

O problema é que a abordagem pensada originalmente em 2005 para implementar nativamente o suporte do Unicode no PHP 6 estava demorando a ser implementada, já que o projeto era muito ambicioso. Além disso, existiam algumas dúvidas, se essa implementação não ia forçar uma perda de desempenho de aplicações de PHP, mesmo para as que não usassem esse recurso de suporte nativo a Unicode.

Por isso, o desenvolvimento do PHP 6, como versão separada do PHP 5, foi cancelado. Agora existe apenas um tronco de desenvolvimento. Esse tronco inclui outras novidades que estavam sendo pensadas para o PHP 6, além do suporte nativo a Unicode.

Existem dúvidas se a próxima versão do PHP se vai chamar PHP 5.4 ou PHP 6. O mais provável é que se chame PHP 5.4 uma vez que ainda não está claro se o suporte nativo a Unicode vai ser de fato incluído. Apesar desta dúvida, vamos considerar por agora que realmente vai ser PHP 5.4.

Integração da extensão de aceleração APC

Como consequência destas mudanças, uma das novidades que vai ser antecipada para o PHP 5.4 é a integração da extensão de aceleração APC.

Esta é uma de várias extensões que existem para PHP que permitem acelerar o carregamento de scripts usando um método de cache dos scripts.

Desde o PHP 4, lançado no ano 2000, a execução de scripts de PHP foi dividida em 2 partes: a compilação e a execução propriamente dita. A compilação cria em memória uma espécie de código compilado, que pode ser executado muito mais rapidamente do que quando o PHP ainda era uma linguagem totalmente interpretada, como ocorria até ao PHP 3.

As extensões de cache guardam em memória o tal código compilado. Isso permite que, depois de rodar uma vez, os scripts de PHP demoram bem menos para começar a executar.

Já existem extensões de cache de PHP de pouco tempo depois do PHP 4 ter sido lançado. Porém, estas nunca foram incluídas na distribuição principal do PHP por pressão da empresa Zend.

A Zend foi fundada por 2 dos principais desenvolvedores do núcleo do PHP. Como a Zend vende a sua própria extensão de cache do PHP, sempre se opuseram a inclusão de outra extensão de cache de código aberto na distribuição do PHP, já que certamente isso canibalizaria o seu produto comercial.

Porém, aceitaram a inclusão de uma extensão de cache no PHP 6. Isso daria tempo para a Zend criar outros produtos comerciais para se sustentarem.

Agora que o PHP 6 foi cancelado, o caminho ficou livre para antecipar a inclusão de uma extensão de cache de código aberto no PHP 5.4.

Existem várias extensões de cache para o PHP, porém é mais provável que incluam a extensão APC, pois é bem recebida pelos desenvolvedores do núcleo do PHP.

Outra extensão para o mesmo fim, o eAccelerator, é inclusive mais robusta e está sendo desenvolvida ativamente. Porém é distribuída com a licença GPL, que é incompatível com a licença do PHP. Por isso dificilmente poderá vir a ser incluída.

Apesar de tanto o APC como o eAccelerator funcionarem em servidores Linux e Windows, a Microsoft desenvolveu também a sua extensão de cache de código aberto para PHP, o WinCache. Assim, espera-se que o PHP funcione de forma mais otimizada em servidores Windows com IIS. Essa extensão pode ser obtida gratuitamente instalando o Microsoft Web Platform Installer.

Qual a importância disso para os desenvolvedores de PHP?

Em relação ao suporte nativo para a Unicode, pouco ou nada afeta os atuais projetos de PHP. Era um recurso que poderia facilitar um pouco o desenvolvimento de sites internacionais, mas realmente não é necessário.

Existem inúmeros sites internacionais escritos em PHP que usam Unicode, como Wikipedia, Facebook, Yahoo, só para citar alguns dos mais conhecidos. Mas realmente eles não precisam do suporte nativo a Unicode. Esses certamente usam outras extensões de PHP existentes como mbstring ou intl.

Quem desenvolve sites apenas em um idioma, nem precisa sequer pensar no assunto. Mesmo sites que misturam Inglês, Português, ou vários outros idiomas Europeus, podem continuar a usar a codificação ISO-Latin-1 (ISO-8859-1) como sempre, sem qualquer preocupação.

Quem realmente tinha mais interesse nesse suporte nativo a Unicode seriam empresa de sites que misturam texto que podem incluir línguas de países asiáticos ou do Leste Europeu.

Em relação à extensão de cache, sites que usam servidores dedicados ou servidores virtuais privados (VPS – às vezes associados à computação em nuvem), com certeza já estão usando extensões de cache, já que elas podem ser instaladas sem a necessidade de solicitação da empresa de hospedagem.

Se você tem sites de PHP em servidores dedicados ou servidores virtuais privados, mas não está usando uma extensão de cache, não pense duas vezes. Instale qualquer uma das outras extensões de cache, e comece já a se beneficiar da possibilidade de rodar PHP mais rápido, consumindo menos recursos do seu servidor.

Quem realmente pode se beneficiar mais da inclusão da extensão de cache na distribuição principal do PHP, são os sites que estão hospedados em servidores partilhados, que normalmente são os que oferecem hospedagem por preços mais em conta.

Existem algumas empresas de hospedagem que já instalaram extensões de cache nos servidores partilhados onde estão os sites dos seus clientes. Porém, uma grande parte dessas empresas não faz isso. Talvez seja por desconhecimento dessas extensões ou por incerteza em relação à sua estabilidade.

Com a inclusão do APC no PHP 5.4, muitas empresas de hospegam partilhada vão passar a ativar essa extensão de cache nos seus servidores, uma vez declarado o suporte oficial à inclusão do APC na distribuição de PHP, essas empresas vão se sentir mais confiantes para instalar o PHP com essa extensão.

No entanto, a extensão APC virá incluida na distribuição principal do PHP, mas vem desativada na configuração do PHP. Os administradores de sistemas das empresas de hospedagem precisarão ativar a extensão manualmente nos servidores partilhados que rodam os sites dos seus clientes.

Onde obter mais informações?

Estes e outros assuntos foram debatidos no podcast Lately in PHP do site PHPClasses.org. No episódio mais recente do podcast foram comentados estes assuntos, assim como outros também de grande interesse como o suporte para desenvolvimento de aplicativos nativos para celulares Android escritos em PHP. Aproveite agora para escutar o podcast ou ler a transcrição das discussões que aparecem no fim dos artigos.

Fonte: ReadWriteWeb

No Comments

Construindo uma aplicação PHP à prova de balas (Por Rafael Jaques)

Pessoal, acabei de ler este slide compartilhado pelo Rafael Jaques do phpit.com.br. Muito bacana mesmo! É tudo que se precisa saber para se abrir a mente com relação à segurança de uma aplicação PHP. Não deixem de ler!

UPDATE: Acabei de ler no PHPit os slides reformulados, “versão 2010″, rs. Segue abaixo!

,

No Comments

Tutorial Series: Orientação a objetos utilizando PHP #1

Ver Tutorial Series: Orientação a objetos utilizando PHP

Introdução a orientação a objetos

Um pouco de história

O conceito de programação orientada a objeto não é algo novo. No final da década de 60, a linguagem Simula67, desenvolvida na Noruega, introduzia conceitos hoje encontrados nas linguagens orientadas a objetos. Em meados de 1970, o Centro de Pesquisa da Xerox (PARC) desenvolveu a linguagem Smalltalk, a primeira totalmente orientada a objetos. No início da década de 80, a AT&T lançou a Linguagem C++, uma evolução da linguagem de programação C em direção à orientação a objetos. Atualmente, um grande número de linguagens incorpora características de orientação a objeto, tais como Java, Object Pascal, Python , PHP etc.

Conceitos básicos

O paradigma de programação orientada a objeto é baseado em alguns conceitos que definem uma forma de criar programas para computadores.

A filosofia principal desse paradigma de programação é solucionar um problema (via programação) através da representação computacional dos objetos existentes nesse problema (objetos do mundo real), usando para isso os conceitos mencionados acima. Com isso, essa maneira de se desenvolver programas fica mais próxima das situações, dos problemas como eles acontecem no mundo real. Será um pouco difícil entender todas as vantagens de OO (Orientação a Objetos). Agora, portanto, vamos mencionar apenas duas:

- É mais fácil conversar com o cliente que pediu o software se falarmos com objetos que existem no mundo dele (o mundo do software fica mais perto do mundo real).

- O software feito com OO pode ser feito com maior qualidade e pode ser mais fácil de escrever e, principalmente, alterar no futuro.

O nosso mundo está repleto de objetos, sejam eles concretos ou abstratos. Qualquer tipo de objeto possui atributos (características) e comportamentos que são inerentes a esses objetos.

Exemplos de objetos CONCRETOS:

1) Caneta

Atributos de qualquer Caneta:

- Altura
- Espessura
- Cor

Nesse caso, o nosso objeto Caneta tem os seguintes dados em cada característica:

- Altura: 10 cm
- Espessura: 2 cm
- Cor: rosa

Comportamentos

- Desenhar
- Escrever
- Etc.

2) Pessoa

Atributos de qualquer Pessoa:

- Altura
- Peso
- Idade

Nesse caso, o nosso objeto Pessoa tem os seguintes dados em cada característica:

- Altura: 1,80
- Peso: 70
- Idade: 25

Comportamentos de qualquer Pessoa:

- Andar
- Sorrir
- Ler
- Etc.

Exemplos de objetos que NÃO SÃO CONCRETOS:

1) Retângulo

Atributos de qualquer retângulo:

- Base
- Altura

Nesse caso, o nosso objeto retângulo tem os seguintes dados em cada característica:

- Base: 10
- Altura: 5

Comportamentos de qualquer Retangulo

- Calcular área
- Calcular perímetro
- Etc.

2) Disciplina

Atributos de qualquer Disciplina:

- Código da disciplina
- Nome da disciplina

Nesse caso, o nosso objeto Disciplina tem os seguintes dados em cada característica:

- Código da disciplina: 1
- Nome da disciplina: Álgebra Linear

Comportamentos de qualquer Disciplina

- Listar o nome da disciplina
- Etc.

Para usar objetos na programação, primeiro precisamos distinguir entre um objeto real e a representação de um objeto. No desenvolvimento de programas, sempre trabalhamos com representações de objetos. Essa representação precisa refletir os objetos reais, ou seja, objetos existentes no problema do mundo real que queremos solucionar. Por exemplo, um sistema de conta corrente não manipula diretamente os clientes, contas e cheques (esses são os objetos reais do problema).

Em vez disso, o software deve criar representações desses objetos, com os mesmos atributos e comportamentos dos objetos do mundo real. Essa representação é chamada de ABSTRAÇÃO.

Para entender isso, vamos voltar ao exemplo do sistema de conta corrente.

No mundo real existem vários objetos Cliente, vários objetos Conta e vários objetos Agência (pode ser somente um), ou seja, muito provavelmente não existirá somente um cliente, uma conta e uma agência.

Todos os objetos cliente possuem o mesmo conjunto de atributos, por exemplo, todos os objetos cliente possuem nome e endereço, assim como todos os objetos conta possuem um número, um saldo, um histórico de transações e todos os objetos agência possui um número e um nome.

Assim como os atributos, todos os objetos de um mesmo tipo compartilham do mesmo conjunto de comportamentos, por exemplo, todos os objetos Cliente fazem depósitos e saques.

Apesar de cada objeto ter o mesmo conjunto de atributos, cada objeto possui valores próprios para cada atributo, ou seja, cada objeto é único.

Essa explicação para objetos do mundo real vale para quando trabalhamos com a representação desses objetos no contexto de desenvolvimento desse sistema (programação).

Portanto, podemos perceber que o sistema de conta corrente (programa de conta corrente) será composto de vários objetos, cada qual com um conjunto de atributos e comportamento em comum (se forem do mesmo tipo) e com valores próprios nos seus atributos. A figura abaixo ilustra os vários objetos cliente, conta e agência.

O termo instância é freqüentemente usado para descrever um objeto com valores próprios em seus atributos. Por exemplo, observe a figura acima:

- Ana é uma instância de Cliente
- 9916 é uma instância de Conta

Todo objeto deve ter:

- Estado
- Comportamento
- Identidade

1) Estado

É representado pelos valores dos atributos de um objeto em um determinado instante do tempo. O estado do objeto usualmente muda ao longo da existência do objeto.

2) Comportamento

Determina como um objeto age e reage: suas modificações de estado e interações com outros objetos.

O comportamento é determinado pelo conjunto de operações ou métodos que o objeto pode realizar. Operações ou métodos são algo que você pede para o objeto fazer, como fazer um depósito (comportamento de qualquer objeto do tipo Conta).

Fazer depósito é um comportamento de qualquer objeto do tipo Conta e não de qualquer objeto do tipo Cliente, como você deve ter pensado a princípio.

Isso acontece porque há diferenças grandes quando pensamos no comportamento de representações de objetos, ou seja, objetos do mundo do software.

Ao identificar comportamentos de objetos do mundo do software devemos levar em conta os seguintes princípios:

- Primeiro princípio: não vamos modelar todo o comportamento dos objetos. Exemplo: Clientes tomam café no mundo real, mas provavelmente não no software.

- Segundo princípio: os comportamentos freqüentemente são assumidos por objetos diferentes. Exemplo: No mundo real, quem faz um depósito? Um Cliente.

No software, quais objetos assumiriam a responsabilidade de fazer um depósito? Objetos do tipo Conta.

A primeira grande regra de programação Orientada a Objeto é a seguinte:

“Comportamentos são associados aos objetos que possuem os atributos afetados pelo comportamento”.

Um depósito afeta duas coisas, do ponto de vista de um sistema bancário:

- O saldo de uma conta.

- O histórico de transações feitas a uma conta.

Como se pode ver, o depósito afeta apenas atributos de uma Conta. Portanto, esse comportamento está associado à Conta e não ao Cliente, embora, no mundo físico, seja o Cliente que faz o depósito.

Outros comportamentos associados aos objetos do tipo Conta:

- Fazer um saque, informar seu saldo, etc.

3) Identidade

Refere-se à identificação do objeto. Como cada objeto é único, ou seja, tem seus próprios valores nos atributos, ele deve ser identificado por algum nome. Mesmo que seu estado seja idêntico ao de outro objeto ele tem identificação própria.

A identificação do objeto do tipo Agência mostrado na figura abaixo é Centro. Esse objeto poderia ter qualquer nome identificando-o.

Agora você já sabe que qualquer programa orientado a objeto deve trabalhar com representações de objetos que reflitam as características e comportamento de objetos do mundo real e já aprendeu os principais conceitos relacionados a objetos.

No sistema de conta corrente foram identificados, a princípio, 3 tipos ou grupos de objetos: Cliente, Agência e Conta.

Sabemos que poderão existir vários objetos de cada um desses tipos e todos eles irão possuir o mesmo conjunto de atributos e comportamentos do seu tipo.

Para criar uma representação de cada objeto dentro do programa, devemos antes criar uma estrutura, uma espécie de molde ou template que represente os atributos e comportamentos do tipo do objeto.Essa estrutura é chamada de classe.

Portanto, devemos ter uma classe Cliente, uma classe Agência e uma classe Conta.

É a partir dessa estrutura conhecida como classe que iremos criar as representações de objetos que precisamos para desenvolver o programa, ou seja, precisamos criar a estrutura (classe) apenas uma vez e, a partir dela, serão criadas as representações dos objetos.

Classes e Objetos

Uma classe é a descrição de atributos e comportamentos de um grupo de objetos com propriedades similares (atributos) e comportamento comum (operações ou métodos).

Por representar atributos e comportamento de um determinado tipo de objeto que existe no mundo real, uma classe é uma abstração da realidade, pois nela estão especificados somente parte dos atributos e comportamentos de um objeto do mundo real. Somente parte, porque não são todos os atributos e comportamentos dos objetos do mundo real que interessam ao sistema.

A figura a seguir, ilustra a representação gráfica das classes do sistema de conta corrente. Na primeira parte da figura está o nome da classe, na parte do meio, estão os atributos e, na parte final, está o comportamento (métodos ou operações).

Observe que a classe Conta e Agencia ainda não estão com os comportamentos definidos. Faremos isso na medida que avançarmos nos conceitos de OO.

Um objeto é uma instância de uma classe. Essa instância possui valores próprios em cada atributo definido na classe. As figuras a seguir ilustram a classe Cliente e os vários objetos (instâncias) da classe Cliente.

A notação que estamos utilizando para representar classes e objetos é a utilizada pela UML (Unified Modelling Language) ou Linguagem de Modelagem Unificada. A UML não é uma linguagem de programação e sim, uma linguagem composta de vários diagramas (cada qual com seu conjunto de símbolos gráficos) que expressam como um sistema orientado a objetos deve funcionar. Ela é utilizada nas fases iniciais do desenvolvimento de um software, ou seja, antes da programação propriamente dita, com o objetivo de especificar e documentar o funcionamento do sistema. O diagrama que iremos utilizar é o Diagrama de Classes que especifica as classes do sistema e o relacionamento entre elas.

Para finalizar este módulo, uma pequena revisão:

Um programa orientado a objeto é composto por vários objetos do mesmo tipo e de outros tipos que se relacionam. Chamamos esses objetos do mundo do software de representações de objetos. Como num programa muito provavelmente existirão vários objetos do mesmo tipo, devemos criar uma estrutura ou template que represente os atributos e comportamentos desses objetos do mesmo tipo, essa estrutura é chamada de classe. Portanto classe é uma estrutura a partir da qual os objetos (do software) são criados.

Dúvidas? Comentem! Até a próxima!

, ,

1 Comment

Tutorial Series: Orientação a objetos utilizando PHP

Pessoal, boa tarde!

Vou iniciar (esta semana se possível) uma série de tutoriais sobre orientação a objetos utilizando o PHP. Sempre tive um certo “bloqueio” com orientação a objetos.  Se você ainda fica meio perdido na orientação a objetos, esta pode ser uma boa hora pra aprender! Usarei como base um material  de EaD muito bom criado pela Andréa Bordin. No material, a linguagem utilizada foi o Java. Meu trabalho será transcrevê-lo para o PHP.

PS: Nos tutoriais irei partir do princípio que você já sabe PHP, mas podem tirar dúvidas à vontade nos comentários.

Iremos começar com um módulo introdutório em breve.

Um abraço!

, ,

2 Comments

Zend Framework Tutorial Series (por Adler Medrado)

Programar em PHP profissionalmente sem um framework decente é impráticavel. Em 2008 comecei a estudar (na teoria) o Zend Framework e em 2009 participei pela primeira vez em um projeto de grande porte utilizando o ZF. Hoje indico o ZF a todos que estiverem procurando um framework completo e descomplicado.

Estava pensando em escrever um tutorial básico sobre o ZF, mas ao acessar o blog do Adler Medrado hoje ví que ele está preparando uma série de tutoriais semanais sobre o ZF, do básico ao avançado. Não vou escrever um tutorial só pra ter o meu nome nele. Aproveitem e se deliciem com essa série que tenho certeza que vai ser ótima!

Parabéns ao Adler pela iniciativa! Vou atualizando o post à medida que forem saindo os outros capítulos…

Zend Framework Tutorial Series – Capítulo 1

Zend Framework Tutorial Series – Capítulo 2

,

No Comments

NetBeans IDE 6.8 – PHP Development

Devido a alguns problemas aqui no trabalho, a duas semanas atrás tive que voltar ao Windows XP.  Resolví inovar um pouco utilizando o Zend Server CE (que já comentei aqui no blog) e continuei utilizando o Eclipse. Estava complicado programar no Eclipse pois estava muito pesado, sem falar no tempo que demora para inicializar/finalizar… Então resolví instalar o NetBeans PHP Development. Quando comecei a programar não gostei muito do NetBeans e uso o Eclipse desde então, mas nestas condições (sistema operacional e máquina com pouco poder de processamento) preciso reconhecer que o NetBeans está deixando o Eclipse no chinelo.  Inicializa em um piscar de olhos e utiliza pelo menos 40% menos de memória que o Eclipse. O autocomplete da versão para PHP funciona perfeitamente, o navegador de projetos, templates de código… Enfim, fica a dica para quem estiver na mesma situação que eu. Se você tiver uma máquina meia boca e estiver procurando desempenho, experimente o Netbeans.

Deixo bem claro que não passei a ser “defensor cego” do Netbeans. Em casa continuo utilizando Eclipse no Ubuntu 9.10.

Visite o site do NetBeans IDE 6.8 – PHP Development

, , ,

2 Comments

Zend Server CE

A um bom tempo venho desenvolvendo com o Linux aqui na minha máquina do trabalho (e em casa também), mas esta semana precisei voltar ao Windows. Confesso que tinha um certo “trauma” para configurar o ambiente de desenvolvimento no Windows, seja instalando separado o Apache e o PHP, seja usando os “AMP´s” da vida. Mas dessa vez resolví usar o Zend Server Comunity Edition. Com ele não tive problema nenhum para integrar o Apache com o PHP, nem muito menos para habilitar as extensões que uso aqui (mysql, pgsql, oci)… O console de administração também é bem bacana. Realmente gostei e recomendo!  No Linux ainda não testei, mas quem sabe em breve…

Site oficial do Zend Server Comunity Edition

, , ,

1 Comment

PDO: PHP Data Objects (Parte 2)

Continuando o post sobre PDO, veremos agora as operações de insert, update e delete utilizando PDO.

Inserindo registros

//Inserindo dados com o PDO…
  1.  
  2. $sql = "INSERT INTO usuario (login, senha)
  3.           VALUES (?, ?)";
  4.  
  5. $stmt = $pdo->prepare($sql);
  6. $stmt->bindParam(1, $login);
  7. $stmt->bindParam(2, $senha);
  8. $stmt->execute();
  9.  
  10. $pdo->commit();


Atualizando registros

//Atualizando com PDO…
  1.  
  2. $sql = "UPDATE usuario
  3.           SET login = ?,
  4.           senha = ?
  5.           WHERE id = ?";
  6.  
  7. $stmt = $pdo->prepare($sql);
  8. $stmt->bindParam(1, $login);
  9. $stmt->bindParam(2, $senha);
  10. $stmt->bindParam(3, $id);
  11. $stmt->execute();
  12. $pdo->commit();


Excluindo registros

//Excluindo com PDO…
  1.  
  2. $sql = "DELETE FROM usuario WHERE id = ?";
  3.  
  4. $stmt = $pdo->prepare($sql);
  5. $stmt->execute(array($id));
  6. $pdo->commit();

Enfim, é isto. Foi apenas uma introdução… Espero que seja de grande utilidade pra vocês :D

Documentação oficial do PDO: http://www.php.net/manual/pt_BR/book.pdo.php

Um abraço!

, ,

No Comments

Autenticação com Zend_Auth

Falar em Zend Framework sem citar o Zend_Auth é impossível. Afinal, qual sistema não possui autenticação de usuários? Nesse post darei um exemplo prático do uso do Zend Auth.

É importante lembrar a diferença entre o Zend_Auth e o Zend_Acl, pois apesar deles se complementarem, tem funções totalmente diferenes. O Zend_Auth é responsável somente pela autenticação, e o Zend_Acl é responsável por mapeamento de permissões do sistema. Falaremos do Zend_Acl em outra oportunidade.

Inicialmente, temos a configuração inicial no bootstrap:

//Bootstrap
  1.  
  2. //Criando um objeto Registry para utilização posterior
  3. $registry = Zend_Registry::getInstance();
  4.  
  5. //Determinando a conexão através de um arquivo INI (ou qualquer outra forma à sua escolha)
  6. $configDb = new Zend_Config_Ini('./application/config/db.ini', 'identificador') ;
  7. $db = Zend_Db::factory ( $configDb->db->adapter, $configDb->db->config->toArray() ) ;
  8.  
  9. //Setando no registro a conexão criada
  10. $registry->set( 'dbSistema', $db ) ;
  11.  
  12. //Definição do Zend_Auth
  13. $authAdapter = new Zend_Auth_Adapter_DbTable($db);
  14. $registry->set( 'authAdapter', $authAdapter ) ;

Não vamos entrar na questão do formulário, vamos direto para a action do controller, onde só chamaremos uma função do model e verificaremos o seu retorno:

//Controller
  1.  
  2. $login = new User();
  3. $result = $login->login($_POST);
  4.  
  5. if($result){
  6. //Usuário autenticado
  7. } else {
  8. //Autenticação inválida
  9. }

Agora a parte mais importante, a função da model:

//Model
  1.  public function login($objPost){
  2.   //Recuperando o objeto que registramos no bootstrap
  3.   $authAdapter = Zend_Registry::get('authAdapter');
  4. //Setando a tabela e as colunas de identificação do usuário no banco
  5.   $authAdapter
  6.   ->setTableName('USUARIO')
  7.   ->setIdentityColumn('LOGIN')
  8.   ->setCredentialColumn('SENHA');
  9.  
  10. //Recebendo os dados do POST
  11.   $authAdapter
  12.   ->setIdentity(strtolower($objPost['input_usuario']))
  13.   ->setCredential(md5($objPost['input_senha']));
  14.  
  15. //Autenticação
  16.   $result = $authAdapter->authenticate();
  17.  
  18. //Verificando a autenticação…
  19.   if($result->isValid()){
  20.  
  21.    return true;
  22.   }
  23.   else{
  24.    return false;
  25.   }
  26.  }

Simples, não? Espero ter ajudado… Um abraço a todos!

Documentação oficial do Zend_Auth: http://framework.zend.com/manual/en/zend.auth.html

, ,

2 Comments