Объясните разницу между public, protected, private.php-12

Модификаторы доступа определяют видимость свойств и методов класса — они являются фундаментальной частью инкапсуляции в объектно-ориентированном программировании.

Основные модификаторы доступа

1. public — Публичный доступ

class User {
    public $name; // Доступно отовсюду

    public function getName() {
        return $this->name;
    }
}

$user = new User();
$user->name = 'Alex'; // Прямое присвоение
echo $user->getName(); // Доступ через метод
  • Доступ из: любого места
  • Когда использовать: для API класса, когда свойство/метод должен быть доступен извне

2. protected — Защищённый доступ

class User {
    protected $passwordHash;

    protected function validate() {
        // Логика валидации
    }
}

class Admin extends User {
    public function resetPassword() {
        $this->passwordHash = null; // Доступ из подкласса
        $this->validate(); // Доступ к protected методу
    }
}
  • Доступ из: самого класса и его подклассов
  • Когда использовать: для внутренней логики, которая должна быть доступна наследникам

3. private — Приватный доступ

class Database {
    private $connection;

    private function connect() {
        // Логика подключения
    }

    public function query() {
        $this->connect(); // Доступ только внутри класса
    }
}
  • Доступ из: только того класса, где объявлен
  • Когда использовать: для деталей реализации, которые не должны быть доступны даже подклассам

Сравнительная таблица

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

Практические примеры

Пример с наследованием

class Vehicle {
    public $model;       // Доступно всем
    protected $mileage;  // Только для наследников
    private $vin;        // Только для этого класса

    public function __construct($vin) {
        $this->vin = $vin;
    }
}

class Car extends Vehicle {
    public function showMileage() {
        return $this->mileage; // Доступно
    }

    public function showVin() {
        return $this->vin; // Ошибка! private доступ
    }
}

Правила хорошего тона

  1. Принцип минимальных привилегий: начинайте с private, расширяйте до protected/public только при необходимости
  2. Инкапсуляция: скрывайте внутреннюю реализацию (private/protected)
  3. Геттеры/сеттеры: для контролируемого доступа к свойствам
class Product {
    private $price;

    public function getPrice() {
        return $this->price;
    }

    public function setPrice($price) {
        if ($price > 0) {
            $this->price = $price;
        }
    }
}

Особенности в PHP

  1. Одинаковы для свойств и методов
  2. Применяются к константам класса (PHP 7.1+)
class Config {
    public const API_KEY = '123';
    private const DB_PASS = 'secret';
}
  1. Не влияют на объекты того же класса:
class Test {
    private $secret;

    public function steal(Test $other) {
        $this->secret = $other->secret; // Доступно!
    }
}

Резюмируем:

выбор модификатора доступа — это вопрос проектирования API вашего класса. Используйте:

  • public для открытого API
  • protected для функционала, доступного наследникам
  • private для внутренней реализации, которая не должна быть доступна извне