Menu

Classes e objetos em PHP: propriedades, métodos e $this

Uma classe PHP é um molde declarado com class Name { }, e new Name() cria um objeto a partir dela. Veja propriedades, métodos, $this, public/private/protected, propriedades tipadas e readonly, __toString e por que atribuir um objeto não o copia.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Uma classe PHP é declarada com class Name { ... } e guarda propriedades (variáveis) e métodos (funções). new Name() cria um objeto a partir dela, e -> lê uma propriedade ou chama um método: $user->name, $user->greet().

A classe é o molde, o objeto é uma coisa construída a partir dele. Você pode criar quantos objetos precisar a partir de uma classe, e cada um tem os próprios valores de propriedades.

Propriedades e métodos

Uma propriedade é declarada com uma palavra-chave de visibilidade, um tipo opcional e um valor padrão opcional. Um método é uma função dentro da classe. Dentro de um método, $this é o objeto em que o método foi chamado, então $this->balance lê o saldo daquele objeto.

Cada objeto mantém o próprio $balance: depositar em $a não mexe em $b. Definir propriedades uma por uma depois do new fica cansativo; um construtor recebe os valores iniciais como argumentos.

public, private e protected

A visibilidade controla quem pode mexer numa propriedade ou chamar um método:

Palavra-chaveAcessível a partir de
publicqualquer lugar
protecteda própria classe e as classes que a estendem
privatesó a classe que a declara

Tornar uma propriedade private e expor métodos é como uma classe protege as próprias regras. Aqui o saldo só pode mudar por deposit() e withdraw(), que recusam valores inválidos:

Ler a propriedade privada de fora da classe não é um aviso, é um Error:

Propriedades tipadas e valores não inicializados

Uma propriedade tipada sem valor padrão começa não inicializada, o que é diferente de null. Lê-la antes de qualquer atribuição lança um Error. Dê a ela um padrão, atribua no construtor, ou torne-a nullable com ?Type e = null.

Os tipos são verificados na atribuição. No modo padrão (não estrito), $p->stock = '7' converte a string numérica em 7, enquanto $p->stock = 'many' lança um TypeError.

Propriedades readonly

Uma propriedade readonly (PHP 8.1) pode ser escrita uma vez, de dentro da classe, e nunca mais. É o jeito comum de criar objetos de valor, como quantias em dinheiro ou IDs. O PHP 8.2 adicionou readonly class, que torna todas as propriedades readonly.

Uma propriedade readonly precisa ter um tipo e não pode ter valor padrão. Se você precisa de uma cópia alterada, crie um novo objeto (new Order('B-2002')) em vez de editar o antigo.

Imprimir um objeto com __toString

echo $object só funciona quando a classe define __toString(). O método retorna a string que o PHP deve usar sempre que o objeto é tratado como texto: no echo, na concatenação de strings, em "{$object}".

Sem __toString, echo $object lança um Error ("Object of class Money could not be converted to string"). Para depurar, print_r() e var_dump() funcionam com qualquer objeto e também mostram as propriedades privadas; veja var_dump e print_r.

Atribuir um objeto não o copia

Esse é o erro que mais pega quem vem dos arrays. Atribuir um array o copia. Atribuir um objeto copia só o handle: as duas variáveis passam a apontar para o mesmo objeto.

clone faz uma cópia rasa: se uma propriedade guarda outro objeto, as duas cópias continuam compartilhando esse objeto interno. === só é verdadeiro para o mesmo objeto, enquanto == compara os valores das propriedades de dois objetos da mesma classe. Passar um objeto para uma função funciona como a atribuição, então uma função pode alterar o objeto que recebe.

Perguntas frequentes

Como crio um objeto a partir de uma classe no PHP?

Use new com o nome da classe: $user = new User();. Se a classe tem um construtor, passe os argumentos dele entre os parênteses, como em new User('Ada'). Depois você chama métodos e lê propriedades com o operador seta: $user->name, $user->greet().

O que significa $this no PHP?

$this é o objeto em que o método atual foi chamado. Dentro de $ada->greet(), $this é $ada, então $this->name lê o nome de Ada. Ele só existe dentro de métodos não estáticos.

Qual a diferença entre public, private e protected no PHP?

Membros public podem ser usados de qualquer lugar, membros private só de dentro da classe que os declara, e membros protected dessa classe e das classes filhas. Ler uma propriedade privada de fora lança um Error: Cannot access private property.

Objetos são passados por referência no PHP?

Uma variável guarda um handle para o objeto, não o objeto em si. $b = $a; copia o handle, então as duas variáveis apontam para o mesmo objeto e uma mudança feita por $b aparece em $a. Use $b = clone $a; para ter uma cópia independente.

O que é uma propriedade readonly no PHP?

Uma propriedade declarada public readonly string $id; (PHP 8.1+) pode ser definida uma vez, de dentro da classe, e nunca mais alterada. Escrever nela uma segunda vez lança um Error: Cannot modify readonly property.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR