03. PHP Orientado a Objetos – Manipulação de Objetos
Apresentação
Introdução
Começaremos a trabalhar neste artigo os objetos. Estudaremos as principais funções nativas que o PHP disponibiliza para fazermos a manipulação de objetos. Este artigo foi antecedido pelo que trata dos Pseudos-tipos de variáveis – você pode encontrar o link no topo deste artigo.
Trabalharemos com as funções get_class_methods, get_class_vars, get_object_vars, get_class, get_parent_class, is_subclass_of, method_exists e call_user_func. Estudaremos agora cada uma separadamente. No início de cada segmento, mostraremos o escopo da função e vocês poderão entender do porque estudamos os tipos de variáveis antes de entrarmos em objetos. Sabendo o tipo de retorno e os parâmetros das funções, vocês serão capazes de deduzir o que a função faz sem ler o código-fonte.
Manipulação de Objetos
get_class_methods
Escopo da função:
1 | array get_class_methods(mixed class); |
A função get_class_methods retorna um array de índice numérico contendo os nomes dos métodos de uma determinada classe, cujo nome ou objeto é passado através do parâmetro class de tipo mixed. O parâmetro é do tipo mixed pois a função aceita tanto a passagem do nome da classe como string como a passagem de um objecto do tipo object.
# Exemplo 1
Neste exemplo, consideraremos que temos uma classe para manipulação de imagens, chamada Imagem, com os métodos (ações) Abrir, Cortar, Copiar, Redimensionar e Salvar. Não nos preocuparemos com muitos detalhes da classe, pois ainda não estudamo-as, então será apresentado apenas um escopo de uma classe.
1 2 3 4 5 6 7 8 | class Imagem { function Abrir(){} function Cortar(){} function Copiar(){} function Redimensionar(){} function Salvar(){} } |
Como podem observar, a classe possui os métodos que citamos anteriormente. Ao utilizarmos a função get_class_methods, devemos ter como retorno um array com os nomes dos métodos.
1 2 3 4 5 | // Passando o nome da classe como string $metodos = get_class_methods("Imagem"); // Imprimindo o array $metodos print_r($metodos); |
O resultado da operação acima deverá ser:
1 2 3 4 5 6 7 8 | Array ( [0] => Abrir [1] => Cortar [2] => Copiar [3] => Redimensionar [4] => Salvar ) |
Mas, uma forma alternativa e comumente utilizada é a passagem de um objeto pelo parâmetro, pois nem sempre saberemos de qual classe estamos trabalhando no momento. Ao passarmos um objeto pelo parâmetro, o PHP se encarrega de averiguar a qual classe o objeto instancia e faz a listagem dos métodos desta classe.
1 2 3 4 5 6 7 8 | // Instanciando um objeto para a classe Imagem $img = new Imagem; // Resgatando a lista de métodos $metodos = get_class_methods($img); // Imprimindo o array $metodos print_r($metodos); |
O resultado deste processo deverá ser exatamente o mesmo que o primeiro.
1 2 3 4 5 6 7 8 | Array ( [0] => Abrir [1] => Cortar [2] => Copiar [3] => Redimensionar [4] => Salvar ) |
Perceba que, como mostramos no escopo da função, o retorno da função get_class_methods é um array e, portanto, quando utilizamos a variável $metodos recebendo o resultado da função, a variável será do tipo array. Sem saber qual seria o tipo de variável de $metodos, não seríamos capazes de manipular os dados, o que faz, de novo, essencial conhecermos os tipos de variáveis.
get_class_vars
Escopo da função:
1 | array get_class_vars(string classname); |
A função get_class_vars, semelhantemente a função get_class_methods, retorna um array, de índice associativo, contendo os nomes e valores das propriedades de uma classe. Diferente da função anterior, a get_class_vars aceita apenas a passagem do nome da classe através de uma string.
# Exemplo 2
Seguindo com nossa classe para manipulação de imagens podemos pensar que algumas das propriedades possíveis para classe é as dimensões da imagem que estamos tratando, Largura e Altura, a qualidade da imagem, Qualidade, e o local onde a imagem está salva, Local. Veja:
1 2 3 4 5 6 7 8 9 10 11 12 | class Imagem { // Dimensões da imagem public $Largura = 1280; public $Altura = 1024; // Qualidade da imagem public $Qualidade = 80; // Local public $Local = "imagens/minha_imagem.png"; } |
Como comentado, a classe Imagem, agora, conta com as propriedades Largura, Altura, Qualidade e Local. Ao utilizarmos a função get_class_vars, teremos:
1 2 3 4 5 | // Recebendo o array de propriedades $vars = get_class_vars("Imagem"); // Imprimindo o array $vars print_r($vars); |
Como resultado, teremos:
1 2 3 4 5 6 7 | Array ( [Largura] => 1280 [Altura] => 1024 [Qualidade] => 80 [Local] => imagens/minha_imagem.png ) |
get_object_vars
Escopo da função:
1 | array get_object_vars(object name); |
Bom, como a função get_class_vars só aceita, como parâmetro, uma string com o nome da classe, era de se esperar que houvesse uma função análoga que trabalhasse com objetos. Pois existe e é a função get_object_vars. O parâmetro da função é exclusivamente um objeto e o retorno é um array de índice associativo contendo os nomes e valores das propriedades do objeto.
# Exemplo 4
Instanciando a nossa classe Imagem em uma variável $img, teremos:
1 2 3 4 5 6 7 8 9 10 11 | // Instanciando a classe Imagem $img = new Imagem; $img->Largura = 800; $img->Altura = 600; // Recuperando a lista de propriedades $vars = get_object_vars($img); // Imprimindo o array de propriedades print_r($vars); |
Poderíamos dizer que o resultado é o mesmo que da função get_class_vars, mas não é. A principal diferença entre as funções é que, para a classe, as propriedades possuem valores constantes, só se alteram quando o programador alterar o código-fonte. Para os objetos, os valores das propriedades podem ser alterados em tempo de execução, como podemos ver no código acima. Logo após instanciarmos a classe Imagem no objeto $img, alteramos os valores de Largura e Altura, então o resultado da operação será:
1 2 3 4 5 6 7 | Array ( [Largura] => 800 [Altura] => 600 [Qualidade] =>; 80 [Local] => imagens/minha_imagem.png ) |
Perceba que, mesmo que a classe Imagem possua as propriedades com um valor definido, não necessariamente seus objetos terão o mesmo valor. O próximo artigo tratará dos conceitos de Classe e Objeto e poderá ficar mais claro esta diferença.
get_class
Escopo da função:
1 | string get_class(object name); |
A função get_class retorna uma string contendo o nome da classe cujo objeto passado pelo parâmetro pertence. Basicamente, a função trás a resposta para a pergunta: Qual a classe foi instanciada neste objeto?
# Exemplo 5
Utilizando o mesmo objeto instanciado no Exemplo 4, poderemos recuperar o nome da classe pela função get_class. Veja:
1 2 3 4 5 | // Recuperando o nome da classe $class = get_class($img); // Imprimindo a string $class echo $class; |
O resultado desta operação é:
1 | Imagem |
get_parent_class
Escopo da função:
1 | string get_parent_class(mixed name); |
Como podemos ver no escopo, o retorno da função é uma string contendo o nome da classe ancestral a classe indicada no parâmetro. Podemos indicar a classe através de uma string com o nome da classe ou pelo objeto que a instancia. O conceito de classe ancestral nós estudaremos mais a frente, no artigo relacionado a heranças entre classes. Veja um exemplo:
# Exemplo 6
1 2 3 4 | class MinhaClasse extends ClasseAncestral { ... } |
Primeiramente criamos a classe MinhaClasse estendendo a classe ClasseAncestral. Primeiramente passaremos o nome da classe como string e depois como um objeto instanciado. O resultado será exatamente o mesmo.
1 2 3 4 5 6 7 8 9 10 | // Através de uma string $class_string = get_parent_class("MinhaClasse"); // Através de um objeto $myclass = new MinhaClasse; $class_object = get_parent_class($myclass); // Imprimindo as strings echo $class_string; echo $class_object; |
O resultado será:
1 2 | ClasseAncestral ClasseAncestral |
is_subclass_of
Escopo da função:
1 | boolean is_subclass_of(mixed name, string parent); |
A função is_subclass_of verifica se uma determinada classe, ou objeto instanciando esta classe, é descendente de outra classe específica. A função possui dois parâmetros: o primeiro do tipo mixed, name, e o segundo do tipo string, parent. O argumento name é a classe ou o objeto que iremos verificar. O argumento parent é a classe ancestral no qual queremos verificar se a classe passada em name é descendente. O retorno da função é booleano: TRUE se a classe name for descendente de parent e FALSE em caso contrário.
# Exemplo 7
Aproveitando o exemplo 6, temos a classe MinhaClasse sendo descendente da classe ClasseAncestral. Então, a partir disto, faremos duas verificações: se a classe MinhaClasse é descendente da classe ClasseAncestral, que nos deve retornar TRUE, e se a classe MinhaClasse é descendente da classe Imagem, que nos deve retornar FALSE.
1 2 3 4 5 6 7 8 9 10 11 12 13 | // MinhaClasse -> ClasseAncestral if(is_subclass_of("MinhaClasse", "ClasseAncestral")){ echo "MinhaClasse é descendente de ClasseAncestral"; }else{ echo "MinhaClasse não é descendente de ClasseAncestral"; } // MinhaClasse ->; Imagem if(is_subclass_of("MinhaClasse", "Imagem")){ echo "MinhaClasse é descendente de Imagem"; }else{ echo "MinhaClasse não é descendente de Imagem"; } |
O resultado é:
1 2 | MinhaClasse é descendente de ClasseAncestral MinhaClasse não é descendente de Imagem |
Lembrando que o primeiro parâmetro é do tipo mixed e assim aceita tando o nome da classe como string ou um objeto que instancia a classe.
method_exists
Escopo da função:
1 | boolean method_exists(object name, string method); |
A função method_exists verifica se determinado método passado no segundo parâmetro (string method) existe no objeto indicado no primeiro parâmetro (object name). Retorna TRUE se o método existir e FALSE caso contrário.
# Exemplo 8
Lembra da nossa classe Imagem? Entre os métodos que ela possui está o método Salvar. Então, ao verificar se o método Salvar existe no objeto $img, a função method_exists deve nos retornar TRUE. Se verificarmos a existência do método Rotacionar no mesmo objeto, a função deve nos retornar FALSE.
1 2 3 4 5 6 7 8 9 10 11 12 13 | // Verificando o método Salvar if(method_exists($img, "Salvar")){ echo "Salvar é um método de Imagem"; }else{ echo "Salvar não é um método de Imagem"; } // Verificando o método Rotacionar if(method_exists($img, "Rotacionar")){ echo "Rotacionar é um método de Imagem"; }else{ echo "Rotacionar não é um método de Imagem"; } |
O resultado é:
1 2 | Salvar é um método de Imagem Rotacionar não é um método de Imagem |
call_user_func
Escopo da função:
1 | mixed call_user_func(callback função [, mixed parâmetro [, mixed ...]]); |
Lembra do nosso pseudo-tipo de variável callback? Está aí. A função call_user_func é resposável por executar uma função ou um método de uma classe que é passada pelo parâmetro.
# Exemplo 9
Veja alguns exemplos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | function webartz() { echo "Isto é uma função"; } // call_user_func para uma função: call_user_func("webartz"); class Classe { function webartz() { echo "Isto é um método"; } } // call_user_func para um método de uma classe: call_user_func(array("Classe", "webartz")); $obj = new Classe; // call_user_func para um método através de um objeto: call_user_func(array($obj, "webartz")); |
O resultado destas operações deve ser:
1 2 3 | Isto é uma função Isto é um método Isto é um método |
Conclusão
Bom, espero que tenham gostado deste artigo. Essas são as principais funções nativas do PHP para a manipulação de objetos. No decorrer dos artigos, poderemos criar novas funções, não tenho nada previsto quanto a isso. Nos próximos artigos, entraremos no que eu chamo de sub-série conceitual: será uma sequência de artigos trazendo basicamente definições de termos e conceitos. Será pesado, mas o conhecimento desta parte é essencial para conseguirmos trabalhar com objetos.
Sugestões e críticas são bem-vindas. Comentem sem medo, procurarei atender aos pedidos e melhorar os artigos na medida do possível. Disponibilizei meu e-mail profissional nesta pequena descrição sobre mim logo abaixo, quem quiser entrar em contato, dando sugestões para novos artigos, mesmo que não seja relacionado a OO, dicas para os artigos postados, etc, sinta-se a vontade. Lerei-os com muito carinho e responderei o mais rápido possível.
Agradeço a atenção, espero que os artigos estão sendo de valia aos seus estudos.







10 Melhores dicas para WordPress
Nova colunista acaba de chegar para falar de WordPress
Grátis: API de CEPs para qualquer Linguagem
CodeIgniter e Zend – Frameworks PHP
Confira o Podcast webARTz, com vários assuntos abordados aqui no blog. Utilize os links abaixo para baixar os arquivos.



Comentários (1)
Trackbacks/Pingbacks (0)
1ºRafael escreveu:
Simples, objetivo e bem explicado, parabéns.