W3docs

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:

  • Propriedadespublic $name;
  • Métodospublic function greet() { ... }
  • Constantespublic const MAX = 10; (PHP 7.1+; constantes são implicitamente públicas se nenhum modificador for fornecido)
  • Parâmetros promovidos no construtorpublic 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() e public function honk() significam a mesma coisa.
  • Uma propriedade deve usar um dos modificadores (public, protected ou private) ou var. Historicamente var $x; era um alias para public $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: 50

Aqui, $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,4

Isso é 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:

ModificadorMesma classeSubclasseCódigo externo
publicsimsimsim
protectedsimsimnão
privatesimnãonã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 property

Apenas $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 propriedades public, 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 static para 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

  • public torna 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 public por padrão; propriedades devem declarar sua visibilidade explicitamente.
  • Reserve public para a API pretendida de uma classe e oculte detalhes de implementação atrás de private/protected para melhor encapsulamento.

Continue com private, protected e Herança PHP para completar seu entendimento sobre visibilidade.

Prática

Prática
Em PHP, o que o termo 'public' denota quando usado com propriedades e métodos de uma classe?
Em PHP, o que o termo 'public' denota quando usado com propriedades e métodos de uma classe?
Was this page helpful?