Классы и объекты в PHP: область видимости переменных. Часть 2
X
Заказать сайт
Заказать сайт

Классы и объекты в PHP: область видимости переменных. Часть 2

В сегодняшнем уроке мы рассмотрим область видимости свойств и методов классов. Начиная с версии PHP 5 в классах появилось 3 ключевых слова: public, protected и private, которые можно ставить перед данными в классе.

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

class Books {
public $name = "PHP: Все обо всем и не только";
protected $avtor = 'blogprogram.ru';
private $articul = '12';
public function print_book() { return $this->name.' | '.$this->avtor.' | '.$this->articul; }
protected function print_book_two() { return 'Работаю только внутри класса Books и всех его наследуемых классах!'; }
function print_book_three($name) { return 'Ваше имя: '.$name.' | Название книги: '.$this->name; }

}

В нем мы видим 3 свойства, каждый со своим типом видимости, а также метод print_book().

  • public - открытые переменные класса. Класс, внутри которых они находятся, как и его экземпляры (объекты) могут их прочитать и изменять.
  • protected - защищенные переменные класса. Доступны только классу, внутри которых они находятся и наследуемым подклассам. Экземпляры класса уже не могут их изменять и читать.
  • private - частные переменные класса. Тоже самое, что и protected, только наследуемые подклассы уже не имеют к ним доступ.

Таким образом если мы создадим экземпляр класса:

$kniga = new Books();

и сделаем вывод его свойств вот так:

echo $kniga->name;   //Все Ок
echo $kniga->avtor;    //Выдаст ошибку Fatal error: Cannot access protected property Books::$avtor in
echo $kniga->articul; //Выдаст ошибку Fatal error: Cannot access private property Books::$articul in

Т.е. сработает только вывод public переменной ($kniga->name), в остальных случаях сработает ошибка доступа.

Теперь давайте выведем на печать методы класса:

echo 'Сегодня в номере: "'.$kniga->print_book(); //Все Ок
echo 'Сегодня в номере: "'.$kniga->print_book_two(); //Выдаст ошибку Fatal error: Call to protected method Books::print_book_two() from context

Здесь ситуация такая же, как и со свойствами. Так как методу print_book() мы поставили модификатор public, он вывелся без ошибки, а метод print_book_two() имеет protected, соответственно доступ к нему есть только внутри класса Books.

Область видимости используют для ограничения доступа к  объектам, например, чтобы скрипт не смог переписать данные класса, для подключения к БД или папки родительского каталога скрипта. Разграничение доступа к свойствам и методам классов - правильный подход там, где это нужно.

Еще немного о методах классов

1. Метод по умолчанию имеют модификатор public, если явно не прописан другой

2. Данные передающиеся в методы имеют необязательный характер. Т.е. если они есть в методе, а объект при вызове их не передает, то ошибки не будет. Выдаст предупреждение типа: Missing argument 1 for. Но лучше так не делать. Обычные функции требуют передачи всех данных.

3. Переменные переданные внутри метода доступны только ему, даже если их имена совпадают со свойствами вне этого метода.

Для демонстрации пункта 3, выведем на печать последний метод:

echo $kniga->print_book_three('Сергей');

Выдаст: Ваше имя: Сергей | Название книги: PHP: Все обо всем и не только. Обратите внимание что переменная в методе и свойстве имеют одинаковое написание: $name, но выводятся они по разному в зависимости от того, где находится.

В следующем уроке вы узнаете о конструкторе в классах и константах.

 

| | Классы и объекты в PHP: область видимости переменных. Часть 2 | В сегодняшнем уроке мы рассмотрим область видимости свойств и методов классов. Начиная с версии PHP 5 в классах появилось 3 ключевых слова: public, pr | https://blogprogram.ru/wp-content/uploads/2017/05/689-131x131.jpg

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>