Estudos

Design Patterns no PHP – Parte II.I: Criando Classes – Métodos e atributos estáticos


Continuando o estudo relacionando ao modelo de classes e sua aplicação no PHP, vamos ver hoje métodos e atributos estáticos. Aperte os cintos!

Para recapitular, no primeiro post eu falei sobre conceitos universais relacionados a POO e no segundo post falei sobre a criação de classes. Em breve vou falar sobre herança, modificadores de acesso, polimorfismo e métodos mágicos. Acabando isso tudo, poderei então dar partida em coisas mais interessantes e menos abstratas.

Métodos e atributos estáticos

Ao falar sobre classes, eu dei uma pincelada no $this, que é uma forma de nos referenciarmos ao próprio objeto, usando um método ou atributo do mesmo. Usando esta mentalidade, para que $this realmente entre em ação, precisamos fazer com que a classe vire um objeto, ou seja, precisamos instanciar a classe. Vou usar um exemplo parecido do ultimo post para exemplificar melhor:

No exemplo acima estamos usando o atributo nomeDoUsuario no echo da função imprime. Logo, ao criarmos os dois objetos abaixo ($meuOlaMundo e $seuOlaMundo) cada um deles terá seu respectivo valor do atributo nomeDoUsuario impresso na chamada do método imprime(). Executando o código acima no php temos as seguintes respostas:

C:xampphtdocstest>php olamundo.php
Ola Mundo e ola Pedro Mendes
Ola Mundo e ola usuario visitante

Como pode ser visto, cada objeto tem seu atributo próprio, ainda que sejam objetos da mesma classe, são objetos diferentes. O atributo nomeDoUsuario das duas classes apontam para áreas diferentes de memória, pois são de objetos difentes.

Entendendo esse principio você já pode partir para um passo a frente, e entender a palavra-chave Static. Ela diz que o método ou atributo pertencem a classe e não ao objeto. Isso quer dizer que por mais que você tenha n objetos diferentes da mesma classe, todos partilham dos mesmos atributos ou métodos estáticos. Por exemplo, o atributo estático alterado em um objeto, terá seu valor propagado em todos os objetos da mesma classe. Vamos ao exemplo anterior usando agora um atributo estático:

Como você pode notar no exemplo anterior, já temos alguns conceitos novos. O primeiro deles é o self usando no echo da função imprime(). Ele é a forma correta de nos referenciarmos a própria classe estaticamente. Mas tarde, quando chegarmos nos modificadores de acesso, entenderemos que podemos nos relacionar estaticamente com nossas classes em meio a herança. Logo após no código, ao invés de usarmos -> usamos os dois “dois pontos” (o famoso Paamayim Nekudotayim) – que é outra regra para os atributos e métodos estáticos.

Outra característica interessante é que como os atributos ou métodos estáticos não estão ligados aos objetos e sim as classes, eles são usados diretamente na chamada da classe e não nos objetos. Na linha 18 do script anterior você verá isso. Por fim, instancio dois objetos da classe OlaMundo e imprimo o valor do atributo estático dos dois. Caso no meio do script o valor deste atributo estático fosse alterado, essa mudança automaticamente seria refletida nos dois objetos. A saída do script anterior seria algo parecido com:

C:xampphtdocstest>php olamundo.php
Ola Mundo e ola Pedro Mendes
Ola Mundo e ola Pedro Mendes

Pare entendermos o conceito prático dos atributos estáticos é fácil, o que é um pouco mais complexo é entendermos o conceito prático dos métodos estáticos. A melhor definição é a das cartilhas: “os métodos estáticos tem grande utilidade quando você não precisa trabalhar necessariamente em uma instância de uma classe, mas na classe em si”. Sendo mais hands on, você utiliza métodos estáticos quando não precisa se relacionar nenhum atributo ou método do próprio objeto – a não ser que sejam estes estáticos também. No ultimo exemplo do post, vamos criar um método estático que nos permita criar instâncias de uma classe automaticamente:

O uso de um método estático segue a mesma idéia do atributo quanto a sua sintaxe. Se você necessitar usar o método dentro da própria classe, terá que usar o self:: também.

A idéia básica dos métodos e atributos estáticos é essa. Leia e tente fazer algo mais útil que os meus exemplos acima. Qualquer dúvida, envie como comentário que respondo no blog.


I'm Pedro Mendes, a passionate developer and technology enthusiast. This blog covers programming and technology in the broadest sense possible. It's the place I collect my thoughts, work and findings to share with the public.

View Comments