Назад к вопросам
Junior
96
questionbank

Какие существуют модификаторы видимости в PHP?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

  • public: Элемент доступен из любого места - изнутри класса, из наследующих классов и извне экземпляра класса.
  • protected: Элемент доступен изнутри класса и из всех наследующих классов. Извне экземпляра класса он недоступен.
  • private: Элемент доступен только изнутри того класса, в котором он объявлен. Из наследующих классов и извне экземпляра класса он недоступен.

Пример использования:

<?php
class MyClass {
    public $publicProperty = 'Public';
    protected $protectedProperty = 'Protected';
    private $privateProperty = 'Private';

    public function publicMethod() {
        echo $this->publicProperty . "\n";
        echo $this->protectedProperty . "\n";
        echo $this->privateProperty . "\n"; // Доступ внутри класса
    }

    protected function protectedMethod() {
        echo $this->publicProperty . "\n";
        echo $this->protectedProperty . "\n";
        // echo $this->privateProperty . "\n"; // Ошибка: private недоступен в protected методе извне того же класса
    }

    private function privateMethod() {
        echo $this->publicProperty . "\n";
        echo $this->protectedProperty . "\n";
        echo $this->privateProperty . "\n"; // Доступ внутри класса
    }
}

class ChildClass extends MyClass {
    public function testAccess() {
        echo $this->publicProperty . "\n"; // Доступ: public доступен в наследующем классе
        echo $this->protectedProperty . "\n"; // Доступ: protected доступен в наследующем классе
        // echo $this->privateProperty . "\n"; // Ошибка: private недоступен в наследующем классе

        $this->publicMethod();    // Доступ: public метод доступен
        $this->protectedMethod(); // Доступ: protected метод доступен
        // $this->privateMethod(); // Ошибка: private метод недоступен
    }
}

$obj = new MyClass();
echo $obj->publicProperty . "\n"; // Доступ: public доступен извне

// echo $obj->protectedProperty . "\n"; // Ошибка: protected недоступен извне
// echo $obj->privateProperty . "\n";   // Ошибка: private недоступен извне

$obj->publicMethod(); // Доступ: public метод доступен извне
// $obj->protectedMethod(); // Ошибка: protected метод недоступен извне
// $obj->privateMethod();  // Ошибка: private метод недоступен извне

$childObj = new ChildClass();
$childObj->testAccess();
?>