Область видимості

Області видимості властивостей, методів або (починаючи з PHP 7.1.0) констант можуть визначатись через ключові слова public, protected чи private. Доступ до членів класу, оголошених як public (загальнодоступні), дозволено всюди. Члени класу, оголошені як protected (захищені), доступні лише всередині самого класу, а також через класи-нащадки та батьківські класи. Члени класу, оголошені як private (закриті) можуть бути доступні лише через клас, де вони визначені.

Видимість властивості

Властивості класу можуть оголошуватись як public, private чи protected. Властивість, оголошена без ключового слова видимості, вважається загальнодоступною.

Приклад #1 Оголошення властивості

<?php
/**
* Визначення MyClass
*/
class MyClass
{
public
$public = 'Загальнодоступна';
protected
$protected = 'Захищена';
private
$private = 'Закрита';

function
printHello()
{
echo
$this->public;
echo
$this->protected;
echo
$this->private;
}
}

$obj = new MyClass();
echo
$obj->public; // Працює
echo $obj->protected; // Фатальна помилка
echo $obj->private; // Фатальна помилка
$obj->printHello(); // Виводить Загальнодоступна, Захищена та Закрита


/**
* Визначення MyClass2
*/
class MyClass2 extends MyClass
{
// Ми можемо перевизначити public- та protected-властивості, але не private
public $public = 'Public2';
protected
$protected = 'Захищена2';

function
printHello()
{
echo
$this->public;
echo
$this->protected;
echo
$this->private;
}
}

$obj2 = new MyClass2();
echo
$obj2->public; // Працює
echo $obj2->protected; // Фатальна помилка
echo $obj2->private; // Невизначено
$obj2->printHello(); // Виводить Загальнодоступна2, Захищена2, Закрита

?>

Видимість метода

Методи класу можуть бути визначені як public, private чи protected. Метод, оголошений без ключового слова видимості, вважається загальнодоступним.

Приклад #2 Оголошення метода

<?php
/**
* Визначення MyClass
*/
class MyClass
{
// Оголошення загальнодоступного (публічного) конструктора
public function __construct() { }

// Оголошення публічного метода
public function MyPublic() { }

// Оголошення захищеного метода
protected function MyProtected() { }

// Оголошення закритого метода
private function MyPrivate() { }

// Таке оголошення метода буде оброблятись як public метод
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}

$myclass = new MyClass;
$myclass->MyPublic(); // Працює
$myclass->MyProtected(); // Фатальна помилка
$myclass->MyPrivate(); // Фатальна помилка
$myclass->Foo(); // Працюють Public, Protected та Private методи


/**
* Визначення MyClass2
*/
class MyClass2 extends MyClass
{
// Таке оголошення метода буде оброблятись як public метод
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // Фатальна помилка
}
}

$myclass2 = new MyClass2;
$myclass2->MyPublic(); // Працює
$myclass2->Foo2(); // Працюють методи Public та Protected, але не Private

class Bar
{
public function
test() {
$this->testPrivate();
$this->testPublic();
}

public function
testPublic() {
echo
"Bar::testPublic\n";
}

private function
testPrivate() {
echo
"Bar::testPrivate\n";
}
}

class
Foo extends Bar
{
public function
testPublic() {
echo
"Foo::testPublic\n";
}

private function
testPrivate() {
echo
"Foo::testPrivate\n";
}
}

$myFoo = new Foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>

Видимість констант

Починаючи з PHP 7.1.0, константи класу можуть оголошуватись як public, private чи protected. Константа, оголошена без ключового слова видимості, вважається загальнодоступною.

Приклад #3 Оголошення констант, починаючи з PHP 7.1.0

<?php
/**
* Define MyClass
*/
class MyClass
{
// Оголошення загальнодоступної константи
public const MY_PUBLIC = 'public';

// Оголошення захищеної константи
protected const MY_PROTECTED = 'protected';

// Оголошення закритої константи
private const MY_PRIVATE = 'private';

public function
foo()
{
echo
self::MY_PUBLIC;
echo
self::MY_PROTECTED;
echo
self::MY_PRIVATE;
}
}

$myclass = new MyClass();
MyClass::MY_PUBLIC; // Працює
MyClass::MY_PROTECTED; // Фатальна помилка
MyClass::MY_PRIVATE; // Фатальна помилка
$myclass->foo(); // Працюють Public, Protected та Private


/**
* Визначення MyClass2
*/
class MyClass2 extends MyClass
{
// Це публічний метод
function foo2()
{
echo
self::MY_PUBLIC;
echo
self::MY_PROTECTED;
echo
self::MY_PRIVATE; // Фатальна помилка
}
}

$myclass2 = new MyClass2;
echo
MyClass2::MY_PUBLIC; // Працює
$myclass2->foo2(); // Працюють константи Public та Protected, але не Private
?>

Видимість з інших об'єктів

Однотипні об'єкти мають доступ до методів та властивостей один одного, що оголошені як private або protected, навіть якщо ці об'єкти не є одним і тим же примірником. Це пояснюється тим, що впровадження механізму видимості відбувається відносно класів цих об'єктів, а не відносно самих об'єктів.

Приклад #4 Доступ до закритих членів класу, що мають однаковий тип об'єкта

<?php
class Test
{
private
$foo;

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

private function
bar()
{
echo
'Доступ до закритого метода.';
}

public function
baz(Test $other)
{
// Ми можемо змінити закриту властивість:
$other->foo = 'hello';
var_dump($other->foo);

// Ми також можемо викликати закритий метод:
$other->bar();
}
}

$test = new Test('test');

$test->baz(new Test('other'));
?>

Поданий вище приклад виведе:

string(5) "hello"
Доступ до закритого метода.