Область видимости
Область видимости свойства или метода может быть определена путем использования следующих ключевых слов в объявлении: public, protected или private. Доступ к свойствам и методам класса, объявленным как public (общедоступный), разрешен отовсюду. Модификатор protected (защищенный) разрешает доступ наследуемым и родительским классам. Модификатор private (закрытый) ограничивает область видимости так, что только класс, где объявлен сам элемент, имеет к нему доступ.
Область видимости свойства
Свойства класса должны быть определены через модификаторы public, private, или protected. Если же свойство определено с помощью var, то оно будет доступно как public свойство.
Пример #1 Объявление свойства класса
/**
* Определение MyClass
*/
class MyClass
public $public = ‘Общий’ ;
protected $protected = ‘Защищенный’ ;
private $private = ‘Закрытый’ ;
?php
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
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 и Неопределен
Замечание: Метод объявления переменной через ключевое слово var, принятый в PHP 4, до сих пор поддерживается в целях совместимости (как синоним ключевого слова public). В версиях PHP 5 ниже 5.1.3 такое использование выводит предупреждение E_STRICT .
Область видимости метода
Методы класса должны быть определены через модификаторы public, private, или protected. Методы, где определение модификатора отсутствует, определяются как public.
Пример #2 Объявление метода
/**
* Определение MyClass
*/
class MyClass
// Объявление общедоступного конструктора
public function __construct ()?php
// Объявление общедоступного метода
public function MyPublic ()
// Объявление защищенного метода
protected function MyProtected ()
// Объявление закрытого метода
private function MyPrivate ()
// Это общедоступный метод
function Foo ()
$this -> MyPublic ();
$this -> MyProtected ();
$this -> MyPrivate ();
>
>
$myclass = new MyClass ;
$myclass -> MyPublic (); // Работает
$myclass -> MyProtected (); // Неисправимая ошибка
$myclass -> MyPrivate (); // Неисправимая ошибка
$myclass -> Foo (); // Работает общий, защищенный и закрытый
/**
* Определение MyClass2
*/
class MyClass2 extends MyClass
// Это общедоступный метод
function Foo2 ()
$this -> MyPublic ();
$this -> MyProtected ();
$this -> MyPrivate (); // Неисправимая ошибка
>
>
$myclass2 = new MyClass2 ;
$myclass2 -> MyPublic (); // Работает
$myclass2 -> Foo2 (); // Работает общий и защищенный, закрытый не работает
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
?>
Видимость из других объектов
Объекты одного типа имеют доступ к элементам с модификаторами private и protected друг друга, даже если не являются одним и тем же экземпляром. Это объясняется тем, что реализация видимости элементов известна внутри этих объектов.
Пример #3 Доступ к элементам с модификатором private из объектов одного типа
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" Доступ к закрытому методу.
Модификаторы доступа public и private в PHP
Ключевое слово public , которое мы пишем перед именами указывает на то, что данные свойства и методы доступны извне (вне кода класса). В противоположность ключевое слово private , которое указывает на то, что свойства и методы недоступны извне.
Зачем это надо? К примеру, у нас есть класс, реализующий некоторый функционал. Есть набор методов, но часть этих методов является вспомогательными.
Будет лучше, чтобы эти вспомогательные методы нельзя было использовать вне нашего класса. В этом случае мы легко сможем поредактировать код этих вспомогательных методов и будем уверенными в том, что их снаружи никто не использует и ничего страшного не случится.
Такой подход называется — все лишнее не должно быть доступно извне, в этом случае жизнь программиста станет проще.
То же самое касается и свойств. Некоторые свойства выполняют чисто вспомогательную функцию и не должны быть доступны вне класса, иначе мы их можем случайно поменять снаружи и сломать работу нашего кода.
Методы и свойства, которые мы хотим сделать недоступными извне, называются и объявляются с помощью ключевого слова private .
Давайте попробуем — объявим свойства $name и $age приватными и попытаемся обратиться к ним снаружи — мы сразу увидим ошибку:
$user = new User; // Выдаст ошибку, так как свойство name — private: $user->name = ‘john’; ?>?php>
Применим на практике
Давайте посмотрим на класс User , который мы сделали в предыдущем уроке:
= 18 and $age // Метод для изменения возраста юзера: public function setAge($age) < // Проверим возраст на корректность: if ($this->isAgeCorrect($age)) < $this->age = $age; > > // Метод для добавления к возрасту: public function addAge($years) < $newAge = $this->age + $years; // вычислим новый возраст // Проверим возраст на корректность: if ($this->isAgeCorrect($newAge)) < $this->age = $newAge; // обновим, если новый возраст прошел проверку > > > ?>?php>
Как мы знаем, метод isAgeCorrect является вспомогательным и мы не планируем использовать его снаружи класса. Логично сделать его приватным, чтобы другой программист, который будет потом работать над нашим проектом (или мы сами через некоторое время) случайно не использовал этот метод снаружи класса.
= 18 and $age // Метод для изменения возраста юзера: public function setAge($age) < // Проверим возраст на корректность: if ($this->isAgeCorrect($age)) < $this->age = $age; > > // Метод для добавления к возрасту: public function addAge($years) < $newAge = $this->age + $years; // вычислим новый возраст // Проверим возраст на корректность: if ($this->isAgeCorrect($newAge)) < $this->age = $newAge; // обновим, если новый возраст прошел проверку > > > ?>?php>
Обычно все приватные методы размещают в конце класса, давайте перенесем наш метод в самый низ:
isAgeCorrect($age)) < $this->age = $age; > > // Метод для добавления к возрасту: public function addAge($years) < $newAge = $this->age + $years; // вычислим новый возраст // Проверим возраст на корректность: if ($this->isAgeCorrect($newAge)) < $this->age = $newAge; // обновим, если новый возраст прошел проверку > > // Метод для проверки возраста: private function isAgeCorrect($age) < return $age >= 18 and $age > ?>?php>
Существует специальное правило: если вы делаете новый метод и не знаете, сделать его публичным или приватным, — делайте приватным. В дальнейшем, если он понадобится снаружи, — вы поменяете его на публичный.
Еще раз резюмируем: слова public и private не нужны для реализации логики программы, а нужны для того, чтобы уберечь программистов от ошибок.
Не подсматривая в мой код внесите такие же правки в класс User .
Попробуйте вызвать метод isAgeCorrect снаружи класса. Убедитесь, что это будет вызывать ошибку.
Сделайте класс Student со свойствами $name и $course (курс студента, от 1 -го до 5 -го).
В классе Student сделайте public метод transferToNextCourse , который будет переводить студента на следующий курс.
Выполните в методе transferToNextCourse проверку на то, что следующий курс не больше 5 .
Вынесите проверку курса в отдельный private метод isCourseCorrect .
Public php что это
С помощью специальных модификаторов можно задать область видимости для свойств и методов класса. В PHP есть три таких модификатора:
- public : к свойствам и методам, объявленным с данным модификатором, можно обращаться из внешнего кода и из любой части программы
- protected : свойства и методы с данным модификатором доступны из текущего класса, а также из классов-наследников
- private : свойства и методы с данным модификатором доступны только из текущего класса
Рассмотрим на примере. Например, у нас есть следующий класс:
class Person < private $privateA ="private"; public $publicA = "public"; protected $protectedA = "protected"; private function getPrivateMethod() < echo "private method
"; > protected function getProtectedMethod() < echo "protected method
"; > public function getPublicMethod() < echo "public method
"; > function test() < $this->getPrivateMethod(); $this->getProtectedMethod(); $this->getPublicMethod(); echo "$this->privateA
"; echo "$this->protectedA
"; echo "$this->publicA
"; > >
Класс определяет три свойства и три метода с разными модификаторами доступа. Из любого метода этого класса мы можем обратиться к любом методу и любому свойству. Если метод не имеет модификатора доступа, то по умолчанию его видимость аналогична модификатору public .
Теперь создадим класс, производный от класса Person:
class Employee extends Person < function test() < //echo $this->privateA; // нельзя, так как privateA - private в классе-родителе echo $this->protectedA; echo $this->publicA; //$this->getPrivateMethod(); // нельзя, так как private в классе-родителе $this->getProtectedMethod(); $this->getPublicMethod(); > >
Классу-наследнику доступны все свойства и методы с модификаторами public и protected , но недоступны методы и свойства с модификатором private .
Теперь рассмотрим использование класса Person во внешнем коде:
$person = new Person; // $person->getPrivateMethod(); // недоступно, так как private // $person->getProtectedMethod(); // недоступно, так как protected $person->getPublicMethod(); // echo $person->privateA; // недоступно, так как private // echo $person->protectedA; // недоступно, так как protected echo $person->publicA;
При использовании объектов данного класса нам доступны только публичные методы и свойства, а свойства и методы с модификаторами private и protected не доступны.
Доступ к методам и свойствам объекта
Стоит отметить, что в PHP в классе можно обращаться в переменным и методам с модификаторами private и protected объекта этого же класса:
class Account< private $sum = 0; function __construct($sum)< $this->sum = $sum; > function getSumFrom($otherAccount, $money) < $otherAccount ->sum -= $money; $this -> sum += $money; > function prinSum()< echo "На счете $this->sum у.е.
"; > > $acc1 = new Account(100); $acc2 = new Account(400); $acc1->getSumFrom($acc2, 200); $acc1->prinSum(); // На счете 300 у.е.
Класс Account представляет условный класс банковского счета. В приватной переменной $sum хранится сумма на счете.
В методе getSumFrom() в качестве параметра получаем объект этого же класса Account и сумму перевода. И поскольку объект представляет тот же класс Account, то мы можем обратиться к его свойствам и методам с модификаторами private и protected:
$otherAccount -> sum -= $money;
И таким образом, выполнить условный денежный перевод с счета на счет.
Что такое public?
Я тут начинаю изучать php с фреймворка yii2, почти полный ноль. Не могу найти нормальной инфы, сразу практикуюсь без теории)
Написал как-то подключение к API? но не пойму, что к чему
Подскажите, что значит public ?
Например public function actionBalance()
Я понимаю что это публичная функция, но что и для чего это вообще? Почему указывается именно public, почему не bublic?
- Вопрос задан более трёх лет назад
- 156 просмотров
2 комментария
Простой 2 комментария

Максим Федоров @Maksclub Куратор тега PHP
сразу практикуюсь без теории
Так и разберитесь с этим — попрактикуйтесь с разными значениями. поймите разницу, почитайте ошибки, которые плюет вам интерпретатор.
Спрашивая тут — вы обращаетесь к теории, просто ее донесет до вас не чтение теории своими глазами, а разъяснение теории другим человеком, но ТЕОРИИ!

Модератор @TosterModerator
5. Категорически запрещается размещать на страницах Сервиса:
5.2. Экспрессивную лексику