webARTz - Onde a WEB encontra a ARTE

Cadastre-se no Mercado Livre, clique aqui !!
14 ago
03. PHP Orientado a Objetos – Manipulação de Objetos

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.

Categorias:
PHP

Comentários (1)

Trackbacks/Pingbacks (0)

  • Rafael escreveu:

    Responder

    Simples, objetivo e bem explicado, parabéns.

    terça-feira, 14 de maio de 2013 às 20:15
  • Este post ainda não possui Pingbacks ou Trackbacks

Faça seu Comentário

webARTz - Onde a WEB encontra a ARTE

Free Page Rank Tool Visitantes Online Server Monitor Spam Poison Creative Commons License
Contribuindo na Web desde Março de 2008| Powered by Wordpress.org| Hospedado na KingHost| Fundado por Rodrigo Luis e Anderson Backes
Voltar ao Topo