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, чтобы полностью освоить понятие видимости.