private
A palavra-chave "private" em PHP declara um membro de classe como privado, acessível apenas dentro da própria classe. Saiba como e quando utilizá-la.
A palavra-chave private do PHP
private é um modificador de visibilidade (também chamado de modificador de acesso). Quando você marca uma propriedade ou método como private, ele pode ser lido e chamado apenas de dentro da mesma classe — nunca de fora do objeto e nunca de uma classe filha que a estenda.
Visibilidade é o núcleo do conceito de encapsulamento: permite que uma classe oculte seus dados internos e lógica auxiliar por trás de uma interface pública controlada, de modo que o mundo externo dependa apenas do que você escolhe expor. O PHP possui três níveis de visibilidade:
| Modificador | Mesma classe | Classe filha | Fora da classe |
|---|---|---|---|
public | sim | sim | sim |
protected | sim | sim | não |
private | sim | não | não |
Esta página abrange a sintaxe de private, por que e quando utilizá-lo, e as armadilhas que costumam pegar as pessoas de surpresa — herança, a regra de "mesma classe, objeto diferente", e o comportamento de erros. Para uma visão mais ampla, consulte Modificadores de Acesso do PHP e Classes e Objetos do PHP.
Sintaxe
Prefixe a declaração da propriedade ou método com a palavra-chave private:
class MyClass {
private $myPrivateVariable;
private function myPrivateFunction() {
// Only code inside MyClass can call this.
}
}Um membro private é totalmente utilizável dentro da classe — outros métodos de MyClass podem ler $this->myPrivateVariable e chamar $this->myPrivateFunction() — mas qualquer acesso externo lança um Error.
Exemplos
Vejamos alguns exemplos práticos de como a palavra-chave "private" pode ser utilizada:
Exemplos de private em PHP
<?php
// Example 1
class Person
{
private $name;
public function __construct($name)
{
$this->name = $name;
}
private function getName()
{
return $this->name;
}
public function greet()
{
$name = $this->getName();
echo "Hello, $name!" . PHP_EOL;
}
}
$person = new Person("John");
$person->greet(); // Output: Hello, John!
// Example 2
class BankAccount
{
private $balance = 0;
public function deposit($amount)
{
$this->balance += $amount;
}
public function withdraw($amount)
{
if ($amount > $this->balance) {
echo "Insufficient funds!" . PHP_EOL;
} else {
$this->balance -= $amount;
echo "Withdrawal successful!" . PHP_EOL;
}
}
}
$account = new BankAccount();
$account->deposit(100);
$account->withdraw(50); // Output: Withdrawal successful!
$account->withdraw(100); // Output: Insufficient funds!Em ambos os exemplos, $name, getName() e $balance fazem parte da maquinaria interna da classe. O mundo externo só interage com greet(), deposit() e withdraw() — os pontos de entrada seguros e validados. Isso é o encapsulamento em ação: o saldo de BankAccount nunca pode ser negativo porque nada fora da classe pode gravá-lo diretamente.
O que acontece quando você quebra a regra
Acessar um membro privado de fora da classe é um Error fatal, não um null silencioso:
<?php
class Person
{
private $name = "John";
}
$p = new Person();
echo $p->name;
// PHP Fatal error: Uncaught Error: Cannot access private property Person::$nameIsso é intencional — o erro aparece imediatamente em vez de deixar o código depender silenciosamente de detalhes internos.
Private é por classe, não por objeto
Uma surpresa comum: membros privados são visíveis entre duas instâncias da mesma classe. A fronteira do "private" é a classe, portanto um objeto pode ler os membros privados de outro objeto desde que ambos sejam do mesmo tipo:
<?php
class Money
{
private $cents;
public function __construct($cents)
{
$this->cents = $cents;
}
// Reads $other->cents directly — allowed, same class.
public function add(Money $other)
{
return new Money($this->cents + $other->cents);
}
public function format()
{
return number_format($this->cents / 100, 2);
}
}
$total = (new Money(150))->add(new Money(350));
echo $total->format(); // Output: 5.00Private e herança
Ao contrário de protected, um membro private não é herdado por subclasses. Uma classe filha não pode ver os membros privados do pai e, se declarar um membro com o mesmo nome, obtém sua própria cópia separada:
<?php
class Base
{
private $value = "base";
public function show()
{
echo $this->value . PHP_EOL;
}
}
class Child extends Base
{
private $value = "child";
}
(new Child())->show(); // Output: baseshow() foi definido em Base, então ele enxerga o $value privado de Base — o $value do filho é uma propriedade completamente separada. Se você quiser que as subclasses compartilhem e substituam um membro, use protected. Consulte Herança no PHP para mais informações.
Quando usar private
- Estado interno que deve permanecer válido — como o saldo de
BankAccountacima. Exponha mutadores (deposit,withdraw) que aplicam as regras. - Métodos auxiliares que são detalhes de implementação, para que você possa renomeá-los ou reescrevê-los mais tarde sem quebrar quem os chama.
- Comece com o nível mais restritivo. Inicie com
private; amplie paraprotectedoupublicapenas quando houver uma necessidade real. É muito mais fácil afrouxar a visibilidade do que restringi-la depois que outro código já depende dela.
Benefícios
- Encapsulamento — agrupe dados com os métodos que operam sobre eles e evite que o resto do programa acesse diretamente. Consulte Classes e Objetos do PHP.
- Ocultação de informações — quem chama os métodos depende da sua API pública, não dos seus detalhes internos, então você pode mudar o funcionamento da classe sem quebrá-los.
- Invariantes — como as gravações passam pelos seus métodos, você pode garantir que o objeto esteja sempre em um estado válido.
Resumo
A palavra-chave private restringe um membro de classe à classe que o declara — não às suas subclasses e não ao mundo externo. É a ferramenta padrão para encapsulamento: oculte dados internos e auxiliares, exponha uma pequena API pública validada e mantenha seus objetos em um estado consistente. Use protected quando as subclasses precisarem de acesso, e public apenas para a interface pretendida.