Resumo: Neste artigo, o autor nos mostra várias tecnologias OOP avançadas em PHP por meio de exemplos baseados em sua compreensão dos conceitos de OOP. Como disse o autor, "A imaginação é a única limitação.
" serão mostradas técnicas mais avançadas.
Serialização (Serialização)
PHP não suporta objetos persistentes Em OOP, um objeto persistente é um objeto que pode manter o estado e a funcionalidade entre referências em vários aplicativos. objeto mais tarde. Este é o chamado mecanismo de serialização. PHP possui um método de serialização que pode ser chamado em um objeto, e o método de serialização pode retornar uma representação em string do objeto. No entanto, a serialização salva apenas os dados dos membros do objeto e não os métodos.
No PHP4, se você serializar o objeto na string $s, depois liberar o objeto e desserializar o objeto em $obj, você poderá continuar a usar os métodos do objeto! Não recomendo fazer isso porque (a) não há garantia na documentação de que esse comportamento ainda funcionará em versões futuras. (b) Isso pode levar a um mal-entendido quando você salva uma versão serializada em disco e sai do script. Ao executar esse script posteriormente, você não pode esperar que, ao desserializar um objeto, os métodos do objeto estejam lá, porque a representação de string não inclui nenhum método.
Resumindo, a serialização em PHP é muito útil para salvar variáveis-membro de um objeto. (Você também pode serializar arrays e arrays relacionados em um arquivo).
Exemplo:
<?php
$obj=new Classfoo();
$str=serialize($obj);
//Salvar $str no disco
//Alguns meses depois
//Carregar str do disco
$obj2=desserializar($str)
Você restaurou os dados dos membros, mas não os métodos (de acordo com a documentação). Isso resulta na única maneira de acessar variáveis-membro (você não tem outra maneira!) algo como usar $obj2->x, então não tente fazer isso em casa.
Existem algumas maneiras de resolver esse problema, estou deixando-as de fora porque são ruins para este artigo sucinto. Eu ficaria feliz em receber recursos totalmente serializados em versões subsequentes do PHP.
Usando classes para armazenamento de dados Uma das grandes vantagens do PHP e OOP é que você pode facilmente definir uma classe para fazer algo e chamar a classe correspondente sempre que quiser usá-la. Suponha que você tenha um formulário HTML que permite ao usuário selecionar um produto selecionando o número de ID do produto. Há informações do produto no banco de dados e você deseja exibir o produto, seu preço, etc. Você tem diferentes tipos de produtos e a mesma ação pode significar coisas diferentes para produtos diferentes. Por exemplo, exibir um som pode significar reproduzi-lo, mas para outros tipos de produtos pode significar exibir uma imagem armazenada em um banco de dados. Você pode usar OOP ou PHP para reduzir a codificação e melhorar a qualidade.
Defina uma classe de produto, defina os métodos que ela deve ter (por exemplo: display), e depois defina uma classe para cada tipo de produto, derivada da classe de produto (classe SoundItem, classe ViewableItem, etc.), abrangendo os métodos de produtos em classes para fazê-los se comportar como você deseja.
Nomeie a classe de acordo com o campo tipo de cada produto no banco de dados. Uma tabela de produto típica pode ter (campos id, tipo, preço, descrição, etc.)... Em seguida, no script de processamento, você pode recuperá-la do banco de dados. Obtenha o valor do tipo e instancie um objeto chamado type:
<?php
$obj=new $type()
;
Este é um recurso muito bom do PHP. Você pode chamar o método display ou outros métodos de $obj sem considerar o tipo do objeto. Usando esta técnica, você não precisa modificar o script para adicionar um novo tipo de objeto, apenas uma classe para lidar com ele.
Esta função é muito poderosa. Basta definir métodos sem considerar os tipos de todos os objetos, implementá-los em diferentes classes em métodos diferentes e, em seguida, usá-los no script principal para qualquer objeto, não, if...else, não Requer dois programadores, apenas feliz.
Agora você concorda que a programação é fácil, a manutenção é barata e a reutilização é verdadeira?
Se você gerencia um grupo de programadores, atribuir trabalho é simples; cada pessoa pode ser responsável por um tipo de objeto e pela classe que o trata.
A internacionalização pode ser alcançada através desta tecnologia, bastando aplicar a classe correspondente de acordo com a área de idioma selecionada pelo usuário, e assim por diante.
Copiando e clonando
Quando você cria um objeto de $obj, você pode copiar o objeto por $obj2=$obj O novo objeto é uma cópia (não uma referência) de $obj, portanto ele tem o estado de $obj naquele momento. . Às vezes, você não quer fazer isso. Você só quer gerar um novo objeto como a classe obj. Você pode chamar o construtor da classe usando a instrução new. Isso também pode ser alcançado em PHP por meio de serialização e de uma classe base, mas todas as outras classes devem ser derivadas da classe base.
Entrando na zona de perigo
Quando você serializa um objeto, você obtém uma string em algum formato, que você pode interrogar se estiver interessado, onde, na string, está o nome da classe (ótimo!) e você pode colocá-la é retirado como:
<?php
$herring=serialize($obj);
$vec=explode(':',$herring)
;
Então, supondo que você crie uma classe "Universo" e force todas as classes a se estenderem do universo, você pode definir um método clone no universo, como segue:
<?php
function clone() {
$herring=serialize($ this)
; explode(':',$herring
=str_replace(""",'',$vec[2]);
$ret=new $nam;
return $ret;
}
}
//Então
$obj=new Something();
//Expandir do Universo
$other=$obj->clone();
O que você obtém é um novo objeto da classe Something, que é igual ao objeto criado usando o novo método e chamando o construtor. Não sei se isso funcionará para você, mas é uma boa regra que a classe universo saiba o nome da classe derivada. A imaginação é o único limite.
Esta instrução escreve a hora atual.