public
A palavra-chave "public" em PHP declara membros de classe como públicos, acessíveis de qualquer lugar do código. Veja sintaxe, exemplos e boas práticas.
A palavra-chave public do PHP
public é um dos três modificadores de visibilidade (acesso) do PHP, ao lado de private e protected. Um membro de classe declarado public pode ser lido e escrito — ou, para métodos, chamado — de qualquer lugar: dentro da classe, a partir de uma subclasse e a partir de qualquer código que possua um objeto da classe.
Esta página abrange a sintaxe, onde public se aplica, como difere dos outros modificadores, as regras de visibilidade padrão e os problemas práticos de expor membros publicamente. Se classes são novidade para você, comece com Classes e Objetos PHP.
Sintaxe
Coloque a palavra-chave public antes de uma declaração de propriedade, método ou constante:
class MyClass {
public $myPublicProperty; // public property
public const VERSION = '1.0'; // public constant (PHP 7.1+)
public function myPublicMethod() {
// accessible from anywhere
}
}public pode modificar:
- Propriedades —
public $name; - Métodos —
public function greet() { ... } - Constantes —
public const MAX = 10;(PHP 7.1+; constantes são implicitamente públicas se nenhum modificador for fornecido) - Parâmetros promovidos no construtor —
public function __construct(public string $name) {}(PHP 8.0+)
Visibilidade padrão
A visibilidade é opcional em PHP. O padrão depende do tipo de membro:
- Um método sem modificador é implicitamente
public.function honk()epublic function honk()significam a mesma coisa. - Uma propriedade deve usar um dos modificadores (
public,protectedouprivate) ouvar. Historicamentevar $x;era um alias parapublic $x;e ainda é aceito, mas desaconselhado. - Uma constante de classe sem modificador é implicitamente
public.
Escrever public explicitamente é o estilo recomendado — torna a intenção óbvia para qualquer pessoa que leia o código.
Exemplos
Vamos ver alguns exemplos práticos de como a palavra-chave "public" pode ser utilizada:
Exemplos da palavra-chave public do PHP
<?php
// Example 1
class Car
{
public $model;
public $color;
public function __construct($model, $color)
{
$this->model = $model . PHP_EOL;
$this->color = $color;
}
public function honk()
{
return "Beep beep!" . PHP_EOL;
}
}
$myCar = new Car("Tesla", "red");
echo $myCar->model; // Output: Tesla
echo $myCar->honk(); // Output: Beep beep!
// Example 2
class Math
{
public static function add($a, $b)
{
return $a + $b;
}
public static function multiply($a, $b)
{
return $a * $b;
}
}
echo Math::add(5, 10); // Output: 15
echo Math::multiply(5, 10); // Output: 50Aqui, $model, honk() e os métodos estáticos de Math são todos public, portanto o código chamador os acessa diretamente por meio de -> (instâncias) ou :: (membros estáticos).
Promoção de construtor (PHP 8.0+)
Desde o PHP 8.0, você pode declarar e inicializar uma propriedade pública diretamente a partir de um parâmetro do construtor, eliminando o repetitivo código $this->x = $x;:
<?php
class Point
{
public function __construct(
public int $x = 0,
public int $y = 0
) {}
}
$p = new Point(3, 4);
echo "$p->x,$p->y" . PHP_EOL; // Output: 3,4Isso é equivalente a declarar public int $x; e atribuí-lo no corpo do construtor. Veja Construtor PHP para o quadro completo.
public vs. protected vs. private
O PHP possui três modificadores de visibilidade. A diferença está em onde um membro pode ser acessado:
| Modificador | Mesma classe | Subclasse | Código externo |
|---|---|---|---|
public | sim | sim | sim |
protected | sim | sim | não |
private | sim | não | não |
O script a seguir mostra os limites em ação:
<?php
class Base
{
public $open = 'public';
protected $family = 'protected';
private $secret = 'private';
public function reveal()
{
// Inside the class, all three are reachable.
return "$this->open / $this->family / $this->secret" . PHP_EOL;
}
}
$b = new Base();
echo $b->open . PHP_EOL; // Output: public (allowed from outside)
echo $b->reveal(); // Output: public / protected / private
// echo $b->family; // Fatal error: Cannot access protected property
// echo $b->secret; // Fatal error: Cannot access private propertyApenas $open é acessível diretamente de fora da classe. $family e $secret só podem ser lidos por meio do método público reveal().
Quando usar public
Use public para as partes de uma classe que formam sua API — os métodos e dados que você quer que outros códigos dependam. Mantenha todo o resto como private ou protected.
- Exponha comportamento, não estado bruto. Prefira métodos
public(getEmail(),withdraw($amount)) a propriedadespublic, para manter controle sobre a validação e poder alterar os internos depois sem quebrar o código que os utiliza. - Uma propriedade
publicé um contrato: uma vez que código externo depende dela, renomeá-la ou removê-la é uma mudança que quebra compatibilidade. - Use
public staticpara métodos utilitários/de fábrica que não precisam de uma instância (veja Métodos Estáticos PHP). - Métodos de interface são sempre efetivamente públicos — veja Interfaces PHP.
Resumo
publictorna um membro de classe acessível de qualquer lugar; é o mais permissivo dos três modificadores de visibilidade do PHP.- Métodos e constantes são
publicpor padrão; propriedades devem declarar sua visibilidade explicitamente. - Reserve
publicpara a API pretendida de uma classe e oculte detalhes de implementação atrás deprivate/protectedpara melhor encapsulamento.
Continue com private, protected e Herança PHP para completar seu entendimento sobre visibilidade.