Какие модификаторы видимости знаешь в PHP?

Ответ

В PHP существуют три основных модификатора видимости для свойств и методов класса:

  1. public — доступен отовсюду: извне класса, в классах-наследниках и внутри самого класса.
  2. protected — доступен только внутри класса, где объявлен, и в его классах-наследниках.
  3. private — доступен исключительно внутри класса, где объявлен.

Начиная с PHP 7.1, модификаторы видимости можно применять и к константам класса (по умолчанию — public).

Пример, демонстрирующий область видимости:

class Example {
    public $public = 'public';
    protected $protected = 'protected';
    private $private = 'private';

    public function show() {
        // Внутри класса доступны все свойства
        echo $this->public;    // OK
        echo $this->protected; // OK
        echo $this->private;   // OK
    }
}

class Child extends Example {
    public function showChild() {
        echo $this->public;    // OK — public
        echo $this->protected; // OK — protected доступен наследнику
        // echo $this->private; // Fatal Error — private недоступен
    }
}

$obj = new Example();
echo $obj->public;    // OK — доступ извне
// echo $obj->protected; // Fatal Error
// echo $obj->private;   // Fatal Error

Ответ 18+ 🔞

А, ну вот, опять эти модификаторы видимости, ебать мои старые костыли! Смотри, тут всё просто, как три копейки, но если не понять — потом такой пиздец начнётся, что хуй с горы.

В общем, в PHP есть три главных стража доступа к твоим свойствам и методам в классе. Представь, что у тебя есть квартира (это твой класс). Так вот:

  1. public — это как входная дверь нараспашку. Кто угодно может зайти: и ты изнутри, и твои дети-наследники, и вообще любой левый чувак с улицы. Всё, что объявил public, — всем видно, всем доступно. Прямо как холодильник на общей кухне — бери что хочешь.

  2. protected — это уже комната, куда пускают только семью. Ты изнутри класса можешь туда, твои прямые наследники (классы-дети) — тоже. А вот какой-нибудь внешний код, который просто создал объект, — уже нет, ему туда низя. Как личная спальня — только для своих.

  3. private — это сейф или личный дневник под подушкой. Только ты, и всё. Даже твои дети-наследники уже не имеют к этому доступа. Только внутри того самого класса, где это объявили. Если объявил private в родителе — ребёнок уже нихуя не увидит.

И да, с PHP 7.1 эту хуйню можно вешать и на константы класса, а то раньше они все по умолчанию public были, терпения ноль ебать.

Смотри на примере, а то одни слова — нихуя не понятно.

class Example {
    public $public = 'public';
    protected $protected = 'protected';
    private $private = 'private';

    public function show() {
        // Внутри класса доступны все свойства
        echo $this->public;    // OK
        echo $this->protected; // OK
        echo $this->private;   // OK
    }
}

class Child extends Example {
    public function showChild() {
        echo $this->public;    // OK — public
        echo $this->protected; // OK — protected доступен наследнику
        // echo $this->private; // Fatal Error — private недоступен
    }
}

$obj = new Example();
echo $obj->public;    // OK — доступ извне
// echo $obj->protected; // Fatal Error
// echo $obj->private;   // Fatal Error

Видишь? Внутри родного класса (show) — можно всё, хоть private смотри. В классе-ребёнке (showChild) — public и protected работают, а на private система тебе выдаст фатальную ошибку, типа «пошёл на хуй, это не твоё». А снаружи, когда создал объект $obj, — только public и можно потрогать. Попробуешь достучаться до protected или private — получишь ту же самую фатальную ошибку, ядрёна вошь.

Короче, если хочешь, чтобы что-то было полностью инкапсулировано и никто, даже наследники, не лез — private. Если хочешь дать доступ семье (наследникам) — protected. А если похуй и пусть все используют — public. Главное — не делай всё public просто так, а то получится типичный распиздяйский код, где всё на свете можно сломать извне.