W3docs

Entendendo a Programação Orientada a Objetos (POO) em PHP

A POO é um paradigma de programação baseado em "objetos" que agrupam dados e comportamentos. Aprenda classes, objetos, encapsulamento e herança em PHP.

A Programação Orientada a Objetos (POO) é um paradigma de programação construído em torno do conceito de "objetos", que agrupam dados (propriedades) e comportamentos (métodos) que operam sobre esses dados. Em vez de dispersar variáveis e funções relacionadas pelo seu script, a POO permite agrupá-las em unidades autossuficientes que modelam as entidades com as quais sua aplicação trabalha — um User, um Order, um Product.

Este capítulo aborda os dois fundamentos da POO em PHP — classes e objetos — e em seguida percorre as três ideias que você utilizará com eles todos os dias: encapsulamento, herança e polimorfismo. Ao final, você será capaz de ler e escrever classes PHP com confiança e saberá qual recurso resolve qual problema.

O Que São Classes e Objetos na POO em PHP?

Uma classe é um modelo. Ela descreve quais dados um objeto contém e o que ele pode fazer, mas não é uma coisa em si — assim como uma planta arquitetônica não é uma casa. Um objeto é uma instância concreta construída a partir desse modelo, criada com a palavra-chave new. Você pode criar muitos objetos a partir de uma classe, cada um com seus próprios dados.

TermoO que éExemplo
ClasseO modelo (definição)class User { ... }
ObjetoUma instância ativa de uma classe$alice = new User(...)
PropriedadeUma variável que pertence a um objeto$this->email
MétodoUma função que pertence a uma classegetEmail()

Uma forma útil de lembrar: a classe é o cortador de biscoitos, os objetos são os biscoitos. Classes e objetos são os blocos de construção da POO em PHP.

Definindo Classes em PHP

As classes em PHP são definidas usando a palavra-chave class, seguida pelo nome da classe. As propriedades e os métodos de uma classe são definidos dentro da definição da classe, entre chaves ({}). Veja um exemplo de definição de classe em PHP:

Exemplo de definição de classe em PHP

class User {
    public $username;
    public $email;
    public function __construct($username, $email) {
        $this->username = $username;
        $this->email = $email;
    }
    public function getUsername() {
        return $this->username;
    }
    public function getEmail() {
        return $this->email;
    }
}

Neste exemplo, a classe User tem duas propriedades, $username e $email, e dois métodos, getUsername() e getEmail(). O método __construct é um método especial de construtor em PHP: ele é executado automaticamente no momento em que um objeto é criado, o que o torna o lugar natural para configurar o estado inicial de um objeto. Dentro de qualquer método, $this se refere ao objeto atual, portanto $this->username significa "a propriedade username deste objeto". Para saber mais sobre construtores e o método de limpeza correspondente, veja PHP Constructor e PHP Destructor.

Criando Objetos a Partir de Classes

Para criar um objeto a partir de uma classe, use a palavra-chave new, seguida pelo nome da classe. Veja um exemplo de como criar um objeto a partir da classe User:

PHP — criar um objeto a partir de uma classe usando a palavra-chave new

$user = new User("John Doe", "[email protected]");

Isso cria um novo objeto User e o armazena na variável $user. Você pode acessar as propriedades e os métodos do objeto usando o operador seta (->). Veja um exemplo de como acessar as propriedades e os métodos do objeto $user:

PHP — acessar as propriedades e os métodos do objeto usando o operador seta

echo $user->username; // Outputs: "John Doe"
echo $user->email; // Outputs: "[email protected]"
echo $user->getUsername(); // Outputs: "John Doe"
echo $user->getEmail(); // Outputs: "[email protected]"

Encapsulamento: Controlando o Acesso aos Dados

Nos exemplos acima, toda propriedade é declarada como public, o que significa que qualquer código pode lê-la ou alterá-la diretamente ($user->email = "..."). Isso é conveniente, mas arriscado — permite que o restante do programa coloque um objeto em um estado inválido. Encapsulamento é a prática de ocultar os detalhes internos de um objeto e expor uma interface controlada.

PHP fornece três modificadores de visibilidade para propriedades e métodos:

ModificadorAcessível deUse quando
publicEm qualquer lugarO membro faz parte da interface oficial do objeto.
protectedA classe e suas subclassesAs subclasses precisam dele, mas o código externo não deve acessar.
privateSomente a mesma classeO membro é um detalhe interno.

Ao tornar uma propriedade private e expor métodos para lê-la ou alterá-la, você mantém a validação em um único lugar:

<?php

class BankAccount
{
    private $balance = 0;

    public function deposit($amount)
    {
        if ($amount <= 0) {
            throw new InvalidArgumentException("Deposit must be positive.");
        }
        $this->balance += $amount;
    }

    public function getBalance()
    {
        return $this->balance;
    }
}

$account = new BankAccount();
$account->deposit(100);
$account->deposit(50);
echo $account->getBalance(); // Outputs: 150

Como $balance é private, nenhum código externo pode defini-lo com um número negativo diretamente — toda alteração deve passar por deposit(), onde a regra está definida. Para uma análise mais aprofundada das três palavras-chave, leia PHP Access Modifiers.

Herança na POO em PHP

Herança é um recurso da POO que permite que classes herdem propriedades e métodos de classes pai. Isso permite que desenvolvedores criem novas classes baseadas em classes existentes, sem precisar reescrever todo o código. Em PHP, a herança é definida usando a palavra-chave extends. Veja um exemplo de herança em PHP:

Exemplo PHP de herança — um recurso da POO que permite que classes herdem

class Admin extends User {
    public $permissions;
    public function __construct($username, $email, $permissions) {
        parent::__construct($username, $email);
        $this->permissions = $permissions;
    }
    public function getPermissions() {
       return $this->permissions;
   }
}

Neste exemplo, a classe Admin estende a classe User e herda suas propriedades e métodos. A classe Admin também possui sua própria propriedade, $permissions, e seu método, getPermissions(). A palavra-chave parent:: é usada para chamar o método __construct da classe pai, permitindo que a classe Admin reutilize a lógica da classe User em vez de duplicá-la. Uma classe pode estender apenas um pai em PHP. Para o panorama completo, consulte PHP Inheritance.

Polimorfismo na POO em PHP

Polimorfismo é um recurso da POO que permite que objetos de classes diferentes sejam tratados como objetos da mesma classe. Isso permite que desenvolvedores escrevam código genérico que possa trabalhar com objetos de classes diferentes, desde que eles tenham os mesmos métodos. Em PHP, o polimorfismo é alcançado definindo métodos comuns em classes pai e implementando-os nas classes filho. Veja um exemplo de polimorfismo em PHP:

Exemplo de polimorfismo em PHP

<?php

class User
{
    public $username;
    public $email;

    public function __construct($username, $email)
    {
        $this->username = $username;
        $this->email = $email;
    }
    public function getUsername()
    {
        return $this->username;
    }
    public function getEmail()
    {
        return $this->email;
    }

    public function showInfo()
    {
        echo "Username: " . $this->username . "\n";
        echo "Email: " . $this->email . "\n";
    }
}

class Admin extends User
{
    public $permissions;
    public function __construct($username, $email, $permissions)
    {
        parent::__construct($username, $email);
        $this->permissions = $permissions;
    }
    public function getPermissions()
    {
        return $this->permissions;
    }

    public function showInfo()
    {
        parent::showInfo();
        echo "Permissions: " . $this->permissions . "\n";
    }
}

$user = new User("John Doe", "[email protected]");
$admin = new Admin("Jane Doe", "[email protected]", ["read", "write", "delete"]);

$users = [$user, $admin];

foreach ($users as $user) {
    $user->showInfo();
}

Neste exemplo, a classe User e a classe Admin têm ambas um método showInfo(). Quando o método showInfo() é chamado em um objeto, a implementação correta do método é invocada, com base no tipo do objeto. Isso permite que o laço foreach trate os objetos $user e $admin como objetos do mesmo tipo, mesmo que sejam instâncias de classes diferentes.

Conclusão

A Programação Orientada a Objetos (POO) é um paradigma poderoso amplamente utilizado em PHP para construir aplicações web escaláveis e de fácil manutenção. Classes e objetos são os blocos de construção; encapsulamento, herança e polimorfismo são os recursos que permitem escrever código eficiente e reutilizável. Domine esses conceitos e o restante do modelo de objetos do PHP se tornará natural.

Próximos passos:

Prática

Prática
Em PHP, quais são as características e funcionalidades de Objetos e Classes?
Em PHP, quais são as características e funcionalidades de Objetos e Classes?
Was this page helpful?