W3docs

public

Ключевое слово public в PHP делает член класса доступным из любого места кода. Синтаксис, отличия от private и protected, примеры.

Ключевое слово public в PHP

public — один из трёх модификаторов видимости (доступа) в PHP, наряду с private и protected. Член класса, объявленный public, может быть прочитан и изменён — а для методов, вызван — из любого места: внутри класса, из подкласса и из любого кода, который имеет объект этого класса.

На этой странице рассматриваются синтаксис, где применяется public, чем он отличается от других модификаторов, правила видимости по умолчанию и практические нюансы открытого доступа к членам класса. Если классы для вас новы, начните с PHP Классы и Объекты.

Синтаксис

Поместите ключевое слово public перед объявлением свойства, метода или константы:

class MyClass {
  public $myPublicProperty;          // public property
  public const VERSION = '1.0';      // public constant (PHP 7.1+)

  public function myPublicMethod() {
    // accessible from anywhere
  }
}

public может модифицировать:

  • Свойстваpublic $name;
  • Методыpublic function greet() { ... }
  • Константыpublic const MAX = 10; (PHP 7.1+; константы неявно публичны, если модификатор не указан)
  • Параметры, продвигаемые конструкторомpublic function __construct(public string $name) {} (PHP 8.0+)

Видимость по умолчанию

Видимость в PHP необязательна. Значение по умолчанию зависит от типа члена:

  • Метод без модификатора неявно является public. function honk() и public function honk() означают одно и то же.
  • Свойство должно использовать один из модификаторов (public, protected или private) либо var. Исторически var $x; было псевдонимом public $x; и по-прежнему принимается, но не рекомендуется.
  • Константа класса без модификатора неявно является public.

Явное написание public является рекомендуемым стилем — это делает намерение очевидным для любого, кто читает код.

Примеры

Рассмотрим несколько практических примеров использования ключевого слова «public»:

Примеры ключевого слова public в 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

Здесь $model, honk() и статические методы Math — все являются public, поэтому вызывающий код обращается к ним напрямую через -> (экземпляры) или :: (статические члены).

Продвижение конструктора (PHP 8.0+)

Начиная с PHP 8.0 можно объявлять и инициализировать публичное свойство прямо из параметра конструктора, убирая повторяющийся шаблонный код $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

Это эквивалентно объявлению public int $x; и присвоению в теле конструктора. Смотрите PHP Constructor для полной картины.

public vs. protected vs. private

В PHP есть три модификатора видимости. Разница состоит в том, откуда может быть доступен член:

МодификаторТот же классПодклассВнешний код
publicдадада
protectedдаданет
privateданетнет

Следующий скрипт демонстрирует границы в действии:

<?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

Только $open доступен напрямую извне класса. $family и $secret можно прочитать только через публичный метод reveal().

Когда использовать public

Используйте public для той части класса, которая формирует его API — методов и данных, на которые должен полагаться другой код. Всё остальное делайте private или protected.

  • Открывайте поведение, а не сырое состояние. Предпочитайте public-методы (getEmail(), withdraw($amount)) публичным свойствам, чтобы сохранить контроль над валидацией и иметь возможность изменять внутреннюю реализацию без нарушения вызывающего кода.
  • public-свойство — это контракт: как только внешний код начинает от него зависеть, переименование или удаление становится несовместимым изменением.
  • Используйте public static для утилитарных/фабричных методов, которым не нужен экземпляр (смотрите PHP Static Methods).
  • Методы интерфейса всегда являются фактически публичными — смотрите PHP Interfaces.

Итоги

  • public делает член класса доступным из любого места; это наиболее разрешительный из трёх модификаторов видимости PHP.
  • Методы и константы являются public по умолчанию; свойства должны явно указывать свою видимость.
  • Резервируйте public для предназначенного API класса и скрывайте детали реализации за private/protected для лучшей инкапсуляции.

Продолжите с private, protected и PHP Inheritance, чтобы полностью освоить понятие видимости.

Практика

Практика
Что означает термин 'public' в PHP при использовании со свойствами и методами класса?
Что означает термин 'public' в PHP при использовании со свойствами и методами класса?
Was this page helpful?