Archive for category PHP

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

Ver Tutorial Series: Orientação a objetos utilizando PHP
Ver Tutorial Series: Introdução a orientação a objetos
Ver Tutorial Series: Implementando uma classe e criando objetos a partir dela

Referência e Objeto

No último tutorial, você aprendeu a criar um objeto a partir de uma classe. Esse foi o primeiro contato com o desenvolvimento completo de um programa orientado a objeto, ou seja, primeiramente foi modelada e implementada a classe Cliente e, posteriormente, utilizamos essa classe (na classe UsaCliente) para criar um objeto do tipo Cliente e manipular suas informações em memória. Vamos implementar uma classe chamada UsaCliente e explicar dois conceitos importantes relacionados à criação de objetos.

  1. class UsaCliente {
  2.  
  3. function usaCliente() {
  4. $c = new Cliente();
  5. $c->setNome("Ana");
  6. $c->setEndereco("Rua A");
  7. $c->setCpf("12352241123");
  8. echo $c->getNome();
  9. }
  10. }

Você lembra que a instrução da linha 4 cria um objeto (aloca espaço na memória) do tipo Cliente e que essa, é sintaxe para a criação de um objeto?

Isso está correto! Porém, nessa linha de instrução existem dois conceitos importantes envolvidos na criação de um objeto: o conceito de referência e o próprio conceito de objeto.

$c é uma variável de memória que pode armazenar uma referência (endereço de uma área de memória) para um objeto (área de memória) do tipo Cliente. Portanto, $c armazena uma referência para um objeto do tipo Cliente.

A instrução “new Cliente()” aloca uma área de memória para o objeto do tipo Cliente, isso quer dizer, que é reservada uma área de memória para armazenar os atributos definidos na classe Cliente. Quem faz essa alocação é a palavra new. Ela é responsável por identificar uma área livre na memória e reservar essa área. Essa área de memória reservada é o objeto do tipo Cliente.

Após reservar a área de memória do objeto o método construtor definido na classe desse objeto é chamado. No caso do exemplo acima, o método Cliente() está sendo chamado e dentro desse, foi implementado para que os atributos alocados dentro do objeto cliente sejam inicializados. Após, o endereço de memória da área alocada para o objeto Cliente é atribuído (armazenado) na variável $c. A partir desse momento, $c referencia um objeto Cliente.

A figura abaixo ilustra esse processo de criação de um objeto (linha 4) que na realidade envolve a criação de uma variável que fará referência a um objeto e o armazenamento nessa variável do endereço de memória do objeto criado.

As figuras abaixo ilustram o estado do objeto Cliente cuja identificação é c (o nome do objeto é c) à medida que as linhas do código da classe UsaCliente vão sendo executadas.

Linha 5: é chamado o método ou comportamento setNome(“Ana”) precedido da variável referência c e é passado um nome fixo como parâmetro. Como c “aponta” ou faz referência para o objeto (área de memória) que está no endereço 123x e o método chamado armazena o valor recebido no atributo nome desse objeto, o atributo nome que será alterado é o existente nessa área de memória (objeto) que c referencia.

Vamos revisar essa chamada de método setNome(“Ana”). A mesma explicação vale para os demais métodos set…( ). Todo método set…( ) implementado na classe Cliente espera receber um parâmetro. O método setNome($nome) espera receber um valor (parâmetro) que será armazenado na variável local do método chamada $nome. Por isso que, ao chamar esse método da classe UsaCliente, devemos passar um valor (parâmetro) para o método. No caso, “Ana” será armazenado na variável $nome e logo em seguida será armazenado no atributo nome do objeto $c.

O estado do objeto em memória fica assim:

Linhas 5 a 6: o mesmo se repete para as linhas 5 a 6.

Linha 8: nas linhas anteriores os atributos do objeto $c foram todos preenchidos através da chamada dos métodos ou comportamentos set….( ). Agora queremos acessar, recuperar o valor de algum dos atributos do objeto $c. Nessa linha, estamos mandando imprimir o conteúdo do atributo nome do objeto c. Para isso, chamamos o comportamento ou método desse objeto chamado getNome(). Como $c faz referência para uma área de memória onde o objeto se encontra, o que será impresso é o valor do atributo nome desse objeto. Todo o objeto (área de memória), para existir, deve estar associado a uma variável que armazene a sua referência (endereço da área de memória do objeto). Pode-se chamar essa variável de “referência”. No exemplo acima foi criada uma referência para um objeto do tipo Cliente.

Refinando a criação de uma Classe

Nas duas seções anteriores você aprendeu a utilizar (usar) uma classe criando objetos a partir dela. Foi desenvolvido um programa que cria e manipula 1 objeto do tipo Cliente.

Normalmente, os programas que você fará irão criar e manipular muitos objetos. Antes disso, porém, você deve aprender mais alguns conceitos importantes relacionados ao desenvolvimento de uma classe.

Você já sabe o que é uma classe, pois, já implementou e utilizou uma para criar objetos. Contudo, existem mais conceitos relacionados à criação de classes. Agora, com um conhecimento um pouco mais maduro, você será apresentado a eles. Para isso, você deve voltar à unidade anterior, mais especificamente onde a classe Cliente foi implementada. O primeiro conceito importante que vamos rever é de método construtor de uma classe.

Método Construtor

Quando um objeto é criado ou instanciado (alocado na memória através do operador new), um método definido na classe desse objeto sempre é automaticamente chamado, esse método é designado de construtor.

Esse método deve (não é obrigatório) ser definido na classe do objeto instanciado da seguinte forma:

  1. function__construct() {
  2. $this->nome = "";
  3. $this->endereco = "";
  4. $this->cpf = "";
  5. }

Quando o método construtor é chamado, o código que está dentro do método, é executado, portanto, devemos programar dentro de método construtor, qualquer instrução que queiramos que seja executada quando um objeto é criado. Normalmente, é programado dentro de um método construtor para que os atributos do objeto que está sendo criado sejam inicializados, ou seja, tenham valores consistentes (corretos).

É comum o desenvolvimento de um método construtor que esteja preparado para receber parâmetros ou não, conforme o código a seguir:

  1. function __construct($nome = "", $endereco = "", $cpf = "") {
  2. $this->nome = $nome;
  3. $this->endereco = $endereco;
  4. $this->cpf = $cpf;
  5. }

Observe que o método construtor aguarda 3 parâmetros ($nome, $endereco e $cpf), mas possui valores padrão (vazio, “”) para eles. Caso estes valores não sejam enviados, eles são definidos como vazio (“”). Desta forma, o objeto pode ser instanciado das seguintes formas:

  1. $c = new Cliente();
  2. $c2 = new Cliente("Thiago", "Meu endereço", "123456789");

Para entender melhor, observe o código a seguir:

  1. $cliente1 = new Cliente();
  2. $cliente2 = new Cliente("Carlos", "Rua C", "123552244");

Após a execução da linha 1, o objeto $cliente1 representado em memória possui o seguinte estado:

O segundo objeto cliente ($cliente2) está sendo criado e o método construtor com parâmetros Cliente (“Carlos”, “Rua C”, “123552244” ) está sendo chamado. Cada valor (parâmetro) passado para o método é armazenado na respectiva variável de memória. Por exemplo: “Carlos”, será armazenado na variável de memória do método chamada $nome; “Rua C”, será armazenado na variável de memória do método chamada $endereco; o mesmo acontece com o valor “123552244”, que será armazenado na variável $cpf.

Os valores passados serão armazenados, respectivamente, nessas variáveis de memória e, logo após, o conteúdo dessas variáveis será armazenado (atribuído) aos atributos do objeto que está sendo criado.

Portanto, esse método construtor tem o objetivo de armazenar nos atributos do objeto, valores que são passados como parâmetro para o método. Nesse momento, o objeto representado em memória possui o seguinte estado:

Observe que, ao criar o segundo objeto e chamar o método construtor com parâmetros, os atributos nome, endereço e cpf já possuem valores e não precisam mais ser modificados através dos comportamentos ou métodos setNome(), setEndereco(), etc., como terá que acontecer com o objeto $cliente1, nas linhas seguintes.

Importante!

Quando nenhum método construtor é especificado na classe, um construtor padrão é chamado automaticamente e inicializa atributos automaticamente. Outro conceito importante que vamos detalhar é o de métodos modificadores (set) e recuperadores (get) de uma classe.

Métodos modificadores(set) e recuperadores(get)

Você implementou na classe Cliente uma série de métodos ou comportamentos para alterar o valor dos atributos de um objeto (métodos chamados altera…( ) ) e para recuperar o valor desses atributos (métodos chamados fornece…( ) ). É importante você saber, e isso ficará mais claro na seção seguinte, que os atributos de um objeto só devem ser manipulados via comportamento ou métodos desse objeto e, nunca diretamente, como no exemplo:

  1. $cliente1->nome = "Ana";

Essa instrução está tentando armazenar no atributo nome, do objeto $cliente1, o nome “Ana”. Está se tentando acessar o atributo diretamente e, não através de um método ou comportamento desse objeto. Isso não deve feito e, nem ao menos funcionará, pois, os atributos da classe Cliente estão com a palavra private. Veremos com mais detalhes o significado e impacto dessa palavra nos atributos de uma classe mais tarde, por enquanto, é suficiente dizer que é essa palavra que impede que qualquer atributo de um

objeto seja acessado diretamente em outra classe (a linha acima estaria na classe UsaCliente), como no exemplo acima. Portanto, para alterar o valor do atributo nome, só nos resta chamar o método setNome(“Ana”) passando o nome “Ana” como parâmetro. Isso só é possível porque todos os métodos implementados na classe Cliente têm a palavra public (isso também será explicado mais tarde).

Essa questão será revisada na próxima seção. O que nos interessa nesse momento está relacionado ao nome dos métodos ou comportamentos implementados na classe Cliente. Na versão implementada da classe Cliente todos os métodos que alteram o valor dos atributos são chamados de set…( ). Esse nome foi utilizado para facilitar o entendimento da necessidade de existência desses métodos, o mesmo valendo para os métodos get..( ) que recuperam o valor dos atributos de um objeto.

O objetivo desse tópico é informar que existe um padrão de nomenclatura para nomes de métodos, classes e atributos.

Em relação aos métodos de uma classe, sempre que um método tem a função única e exclusiva de alterar (modificar) o atributo de uma classe ele deve começar com o a palavra set seguido do nome do atributo que ele altera.

O mesmo acontece com os métodos que tem a função de fornecer ou recuperar o valor dos atributos de um objeto, os métodos get…( ). Esses métodos devem começar com a palavra get seguido do nome do atributo que ele recupera.

Métodos set são denominados métodos modificadores porque modificam o valor dos atributos. Métodos get são denominados métodos recuperadores porque recuperam o valor dos atributos.

Gostaria de lembrar que a nomenclatura get e set não é obrigatória, é um padrão considerado como boa prática usada pela maioria dos programadores.

Dúvidas ou sugestões, sintam-se à vontade para comentar 😉 Um abraço!

, ,

Nenhum comentário.

Manual em português do Zend Framework

Bom dia!

Ví hoje que o pessoal do zfdes.com está traduzindo o manual do Zend Framework para 7 linguagens, entre elas o português do Brasil. Atualmente a tradução está 12,9% feita.

Pra galerinha que ainda arranha no inglês, vale a pena dar uma olhada: http://manual.zfdes.com/pt-br/

, ,

3 Comentários

PHP Conference Brasil 2010

O PHP Conference Brasil 2010 acontecerá durante os dias 25, 26, 27 e 28 de Novembro, das 9h00 às 17h00.
Em continuidade ao sucesso obtido nos 4 anos anteriores, com mais de 3000 participantes, com o conteúdo técnico organizado pelo PHP-SP e voluntários das diversas comunidades de PHP distribuídas pelo país, o PHP Conference Brasil 2010, que comemorará 5 anos, apresentará as mais importantes tendências do mercado de PHP, que contemplarão, através de Tutoriais Mão na Massa – 6 horas, Palestras Técnicas, Estudos de Caso e Painés de Debate e Exposição com Patrocinadores, os seguintes macro-temas:
Veja abaixo a programação:
Dia 25/11, 5ª feira, das 9h00 às 17h00
Programação: Apenas Tutoriais Mão na Massa – 6 horas.
Quem pode participar? Aqueles que se inscreveram na Modalidade Gold.
Dia 26/11, 6ª feira, das 9h00 às 17h00
Programação: Abertura Oficial, Keynote Speaker 1, Palestras Técnicas, Estudos de Caso e Painés de Debate e Exposição com Patrocinadores.
Quem pode participar? Aqueles que se inscreveram na Modalidade Gold e Silver
Dia 27/11, sábado, das 9h00 às 17h00
Programação: Keynote Speaker 2, Palestras Técnicas, Estudos de Caso e Painés de Debate e Exposição com Patrocinadores.
Quem pode participar? Aqueles que se inscreveram na Modalidade Gold e Silver.
Dia 28/11, domingo, das 9h00 às 17h00
Programação: Um dia off topic na praia do Gonzaga, em Santos.
Quem pode participar? Todos que participaram do evento.
Esta atividade exige inscrição à parte (saiba mais).
Mais informações e inscrições em:
http://www.phpconf.com.br

O PHP Conference Brasil 2010 acontecerá durante os dias 25, 26, 27 e 28 de Novembro, das 9h00 às 17h00.

Em continuidade ao sucesso obtido nos 4 anos anteriores, com mais de 3000 participantes, com o conteúdo técnico organizado pelo PHP-SP e voluntários das diversas comunidades de PHP distribuídas pelo país, o PHP Conference Brasil 2010, que comemorará 5 anos, apresentará as mais importantes tendências do mercado de PHP, que contemplarão, através de Tutoriais Mão na Massa – 6 horas, Palestras Técnicas, Estudos de Caso e Painés de Debate e Exposição com Patrocinadores, os seguintes macro-temas:

Veja abaixo a programação:

Dia 25/11, 5ª feira, das 9h00 às 17h00

Programação: Apenas Tutoriais Mão na Massa – 6 horas.

Quem pode participar? Aqueles que se inscreveram na Modalidade Gold.

Dia 26/11, 6ª feira, das 9h00 às 17h00

Programação: Abertura Oficial, Keynote Speaker 1, Palestras Técnicas, Estudos de Caso e Painés de Debate e Exposição com Patrocinadores.

Quem pode participar? Aqueles que se inscreveram na Modalidade Gold e Silver

Dia 27/11, sábado, das 9h00 às 17h00

Programação: Keynote Speaker 2, Palestras Técnicas, Estudos de Caso e Painés de Debate e Exposição com Patrocinadores.

Quem pode participar? Aqueles que se inscreveram na Modalidade Gold e Silver.

Dia 28/11, domingo, das 9h00 às 17h00

Programação: Um dia off topic na praia do Gonzaga, em Santos.

Quem pode participar? Todos que participaram do evento.

Esta atividade exige inscrição à parte (saiba mais).

Mais informações e inscrições em: http://www.phpconf.com.br

,

Nenhum comentário.

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!

, ,

2 Comentários

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

Nenhum comentário.

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!

,

Nenhum comentário.

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!

, ,

2 Comentários

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 Comentários

Controle de acesso com Zend_Acl

A muito tempo não posto um bom “php” por aqui, então vamos lá… A algum tempo postei sobre Zend_Auth e fiquei devendo um post sobre Zend_Acl.

Problemas com controle de acesso viram soluções com Zend_Acl. A alguns meses precisei implementar o controle de acesso para um sistema com ZF e me encantei com a facilidade e praticidade do Acl. Primeiro, alguns conceitos básicos…

Roles: São os perfis definidos. Basicamente, quem tem ou não acesso.

Resources: São as funcionalidades a serem controladas.

Usarei como exemplo o código que implementei já citado anteriormente. Criamos uma tabela simples para as funcionalidades, uma para perfis e duas tabelas associativas: uma entre perfis e funcionalidades e outra entre usuários e funcionalidades. Para abreviar, vou mostrar somente a tabela de funcionalidades:

CREATE TABLE funcionalidade (
  1. cd_funcionalidade NUMBER NOT NULL,
  2. descricao VARCHAR2(150) NOT NULL,
  3. funcionalidade VARCHAR2(200) NOT NULL,
  4. PRIMARY KEY(cd_funcionalidade));

Nesta tabela de funcionalidades será cadastrado uma descrição e a url da funcionalidade (resource). Ex: /usuarios ou /administracao/perfil

Assim que o usuário se autentica no sistema, redireciono ele para um controller chamado “acesso” para montar o objeto Acl. Neste exemplo, o usuário pode ter as funcionalidades definidas pelo perfil ou definidas diretamente para ele. Da seguinte forma…

  1.  
  2. //Model da tabela associativa entre Usuário e Perfil
  3. $objPerfilUsuario = new PerfilUsuario();
  4.  
  5. //Model da tabela de funcionalidades
  6. $objFuncionalidade = new Funcionalidade();
  7.  
  8. //Dados da autenticação do usuário…
  9. $nsAutenticacao = new Zend_Session_Namespace('autenticacao');
  10.  
  11. $idUser = $nsAutenticacao->id;
  12.  
  13. //Recuperando os dados do perfil do usuário
  14. $arrPerfil = $objPerfilUsuario->getPerfilUsuario($idUser);
  15.  
  16. $nsAutenticacao->idPerfil  = $arrPerfil['idPerfil'];
  17. $nsAutenticacao->perfil  = $arrPerfil['perfil'];
  18.  
  19. //Criando o objeto Acl
  20. $acl = new Zend_Acl();
  21.  
  22. //Crio uma role com o nome do perfil do usuário
  23. $acl->addRole(new Zend_Acl_Role($arrPerfil['perfil']));
  24.  
  25. //Funcionalidades definidas por perfil
  26.  
  27. //Recupero as funcionalidades definidas para o perfil…
  28. $arrFuncionalidades = $objFuncionalidade->getFuncionalidadesAcl($arrPerfil['idPerfil']);
  29.  
  30. //Em um foreach, adiciono ao objeto Acl as funcionalidades (resources) e a permissão
  31. foreach($arrFuncionalidades['allow'] as $array) {
  32.  $acl->add(new Zend_Acl_Resource($array));
  33.  $acl->allow($arrPerfil['perfil'],$array);
  34. }
  35.  
  36. if(isset($arrFuncionalidades['deny'])){
  37.  foreach($arrFuncionalidades['deny'] as $array) {
  38.   $acl->add(new Zend_Acl_Resource($array));
  39.   $acl->deny($arrPerfil['perfil'],$array);
  40.  }
  41. }
  42.  
  43. //Funcionalidades definidas por usuário
  44.  
  45. //Model da tabela associativa entre usuário e funcionalidade…
  46. $objUserFunc = new UsuarioFuncionalidade();
  47.  
  48. //Recupero as funcionalidades definidas para o usuário
  49. $arrFuncUser = $objUserFunc->getFuncionalidadesAcl($idUser);
  50.  
  51. //Como a role já está criada no objeto Acl, apenas adiciono as permissões…
  52. foreach($arrFuncUser as $arr) {
  53.  $acl->allow($arrPerfil['perfil'],$arr);
  54. }
  55.  
  56. //Crio um namespace para o objeto Acl
  57. $ns = new Zend_Session_Namespace();
  58. $ns->acl = $acl;

Obs: Nos métodos getFuncionalidadesAcl() das modelos utilizadas retorno um array com a seguinte estrutura: array(‘idDaFuncionalidade’ => ‘Url da funcionalidade’). No caso da model Funcionalidades, existe uma particularidade: o array “deny”:

  1.  
  2.  public function getFuncionalidadesAcl($idPerfil) {
  3.  
  4.   $select = 'Seu sql';
  5.  
  6.   $rs = $this->fetchAll($select)->toArray();
  7.   $arrFinal = array();
  8.  
  9.   foreach($rs as $arrAllow) {
  10.  
  11.    $arrFinal['allow'][$arrAllow['cd_funcionalidade']] = $arrAllow['TX_URL'];
  12.  
  13.   }
  14.  
  15.   unset($rs);
  16.  
  17.   $rs = $this->fetchAll()->toArray();
  18.  
  19.   /** Neste foreach eu verifico se existe alguma funcionalidade que está cadastrada na tabela funcionalidades
  20.   * mas não está definida para o perfil. Se existir, precisamos tirar a permissão de acesso a ela.
  21.   * Toda funcionalidade que não estiver cadastrada na tabela de funcionalidades tem seu acesso liberado.
  22.   */
  23.  
  24.  
  25.   foreach($rs as $arrDeny) {
  26.    if((!array_key_exists($arrDeny['cd_funcionalidade'], $arrFinal['allow'])) AND ($arrDeny['funcionalidade'])) {
  27.     $arrFinal['deny'][$arrDeny['cd_funcionalidade']] = $arrDeny['funcionalidade'];
  28.    }
  29.   }
  30.  
  31.   return $arrFinal;
  32.  
  33.  }

Pronto, o objeto Acl está criado e com as permissões setadas. Agora basta fazer a verificação sempre que o usuário tentar acessar os controllers do sistema. No caso deste exemplo, temos uma classe que extende da Zend_Controller_Action, ou seja, qualquer redirecionamento do sistema passará por ela. Nesta classe, adicionei o seguinte código para realizar a verificação da permissão:

  1.  
  2. //Recupero o objeto Acl do namespace…
  3. $ns = new Zend_Session_Namespace();
  4.  
  5. if(isset($ns->acl)) {
  6.  $acl = $ns->acl;
  7.         //Monto a Url que está tentando ser acessada para a verificação…
  8.  $url = '/'.$this->_request->getControllerName().'/'.$this->_requestgetActionName();
  9.  
  10.  if($acl->has($url)) {
  11.  
  12.   //Recupero os dados de autenticação do usuário…
  13.   $nsAutenticacao = new Zend_Session_Namespace('autenticacao');
  14.  
  15.                 //Verifico se o perfil do usuário tem acesso à url
  16.   if(!$acl->isAllowed($nsAutenticacao->perfil, $url)) {
  17.  
  18.    //Caso não seja, redireciono o usuário para algum lugar avisando que ele não tem acesso…
  19.    $this->_redirect('/index/sem-acesso');
  20.   }
  21.  }
  22. }

Caso o usuário tenha o acesso, não preciso fazer nada… Apenas deixo a requisição continuar a sua execução e o usuário chegará à url.

Simples, não? Caso tenha alguma dúvida ou tenha alguma crítica ou sugestão para melhorar, deixe seu comentário ou entre em contato por email 😉

Um abraço!

, , ,

5 Comentários

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

,

Nenhum comentário.