NOTÍCIA

OOP e PHP5

Introdução

O modelo de objeto das versões anteriores à 5 do PHP↳PHP44 conteúdosPadronizando seu código com PHP CS FixerDev (Back & Front) · mai 2019Docker de imagem. Para rodar projetos PHP em menos de 30 segundosDev (Back & Front) · jan 2026PHP 7.3: conheça as novidades desta versãoDev (Back & Front) · abr 2019Ver tudo em Dev (Back & Front) → não eram muito profissionais. Se tratavam de arrays “superpoderosos”. PHP5 trouxe uma nova maneira, completamente diferente (em relação ao PHP4), de trabalhar com classes e objetos.

Agora é possível desenvolver interfaces, classes abstratas, e seus membros podem ser privados, públicos, protegidos, constantes estáticos ou finais (antes classes eram apenas classes e todos seus membros eram públicos). Novos construtores, a apresentação de destruidores, overloading, derreferência, clonagem e autocarregamento também estão disponíveis entre mais algumas novidades.

O artigo vai ser grande pra tratar de tudo isso. Vou produzir algumas classes de exemplo e botar muita teoria pra dentro da cabeça de vocês. Então relaxem, e conheçam o novo modelo de objeto do PHP.

Membros Públicos, Privados e Protegidos

Antigamente, na época do PHP4 (risos), todo membro de uma classe era público. Isso era muito chato. Mas os desenvolvedores do PHP5 resolveram isso.

Os membros (variaveis e funções) podem ser, inicialmente, de 3 tipos:

. Privado: o acesso ao membro só pode ser feito dentro da classe.

. Protegido: acesso ao membro restrito à classe e a suas “filhas”.

. Público: acesso público. Como no PHP4

Acho que um exemplo pode ilustrar bem isso:

<?php
class Foo
{
protected $bar;
private $foobar; 

//construtor no estio PHP4, isso mudou em PHP5, mas chegaremos lá
public function Foo ()
{
$this->bar = "bar";
$this->foobar = "foobar";
}
}

class Bar extends Foo
{
public function Bar () { $this->bar = "foo"; }
public function getBar() { return $this->bar; }
public function getFoobar () { return $this->foobar; }
}

$oFoo = new Foo;
$oBar = new Bar;

//Não funciona porque o objeto não tem acesso à variável protected
//echo $oFoo->bar;

//Não funciona porque a "filha" não tem acesso a variáveis private
//echo $oBar->getFoobar();

//Isso funciona. Exibe "foo"
echo $oBar->getBar();
?>

Construindo e Destruindo

Os construtores mudaram. Antes o construtor da classe era uma função que levava o mesmo nome da classe. A coisa agora é mais interessante; existe uma função mágica que constrói a classe; e outra para destruir!

Exemplo:

<php
class File
{
	private $fp;

	public function __construct ($filename)
	{
		$method = file_exists ($filename) ? 'a' : 'w';
		$this->fp = fopen ($filename, $method);
	}

	public function addContent ($content)
	{
		fputs ($this->fp, $content);
	}

	public function __destruct ()
	{
		fclose ($this->fp);
	}
}

$myfile = new File ('arkivo.txt');
$myfile->addContent ("uma linha
");
$myfile->addContent ("duas linhas
");
unset ($myfile);
?>

O exemplo é uma classe que trabalha com um arquivo. Ao criar um novo objeto a classe chama a função __construct, e executa as instruções contidas nessa função. Analogamente, ao se destruir o objeto (usando a função unset() ou ao concluir a execução do script) a classe chama a função __destruct e executa suas instruções.

Abstração

Para entender abstração vou dar um exemplo da vida real, e depois vou exemplificar como a mesma coisa seria dita em PHP.

Seu eu pedisse para que cada um pensasse em um mamífero. Cada um pensa em seu mamífero predileto: gatos, cachorros, cavalos, humanos, … Para tentar unificar nosso pensamento, vamos restringir os mamíferos aos humanos. Pensem em um ser humano. Ainda não temos uma idéia bem definida, já que cada pessoa tem uma gama gigantesca de seres humanos para imaginar. Bom, então vou especificar um ser humano, e assim todos vão pensar na mesma coisa. Pensem no Elvis Presley.

Alguém pode achar que eu fugi do assunto mas eu não fugi. Pensem em por que não quando temos que pensar em um mamífero pensamos em um animal da “classe” dos mamíferos e não em um ser o qual sua designação final de mamífero. Por que a “classe” dos mamíferos é uma abstração para agrupar animais que tenham um conjunto de cracterísticas comuns, porém não são iguais.

O mesmo aconteceu quando todos pensamos em um ser humano; ser humano é uma “subclasse” dos mamíferos e não pode ser uma definição final, já que também ela é dividida em “subclasses”. Mas quando se define um ser humano específico, ele “instancia” as características comuns aos humanos (logo, também as dos mamíferos) e define um conjunto finito de características que podemos conhecer e dizer que não existem dois Elvis Presley, logo, todos pensamos no mesmo Elvis.

Agora em PHP5:

<?php
abstract class Mamifero
{
    private $habitat;
    private $no_patas;

    protected function setHabitat ($habitat)
    {
    	$this->habitat = $habitat;
    }

    protected function setNoPatas ($integer)
    {
    	$this->no_patas = $integer;
    }
}
?>

Como dito antes, a classe dos mamíferos é uma abstração, portanto, uma classe abstrata. Assim como os seres humanos, que são uma subclasse (ou uma classe filha) dos mamíferos. Isso pode parecer assim:

<?php
class Humano extends Mamifero
{
	public function __construct ()
	{
        	$this->setHabitat ('terrestre');
        	$this->setNoPatas (2);
	}

	public function fala ($texto)
	{
        	echo $texto;
	}
}
?>

Por fim, temos o objeto humano, ou melhor, o ser humano, ou melhor ainda … Elvis “the pelvis” (hehehe);

<?php
$elvis = new Humano;
$elvis->fala ('Love me tender ...');
?>

Interface

As interfaces são uma abordegem ao estilo Java para as herança múltipla fornecida pelo C++.

As interfaces são como um contrato que toda classe concreta deve obedecer. O desemvolvedor expõe suas intenções em uma biblioteca e cada classe concreta pode pode implementá-la como for mais conveniente para si.

<?php
interface Interador
{
	public function busca();
	public function quantos();
}

class Presidentes implements Interator
{
	private $presidentes;

	public function __construct ()
	{
                        $this->presidents = array (
           			'Fernando Collor','Itamar Franco',
           			'Fernando Henrique','Lula'
       			);
	}

        public function busca ()
        {
       		$presidente = each($this->presidentes);
       		if ( $presidente ) {
           		return $presidente['value'];
       		} else {
           		reset ( $this->presidentes );
           		return false;
       		}
   	}

        public function quantos ()
        {
        	return count ($this->presidentes);
        }
}

$p = new Presidentes;

while ($presidente = $presidentes->fetch()) {
	echo $presidente . '';
}
?>

 

Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram/Threads @portalimasters

Mais de Redação iMasters
Ver perfil →