Изучение PHP. Это родительский класс

_user == null) { $this->_user = new User(); } return $this->_user; } } class User { private $_name; public function __construct() { $this->_name = "Joseph Crawford Jr."; } public function GetName() { return $this->_name; } } $app = new App(); echo $app->User()->GetName(); ?>

Инкапсуляция - это механизм, который связывает вместе код и данные, которыми он управляет, и сохраняет как безопасные от внешних помех, так и неправильное использование. Обертка данных и методов в один блок (называемый классом) называется инкапсуляцией. Преимущество инкапсуляции заключается в том, что она выполняет задачу внутри, не заставляя вас беспокоиться.

Инкапсуляция - это способ хранения объекта или данных как свойства внутри другого объекта , так что внешний объект имеет полный контроль над тем, как можно получить доступ к внутренним данным или объектам.

Например

Class OuterClass { private var $innerobject; function increment() { return $this->innerobject->increment(); } }

У вас есть дополнительный слой вокруг объекта, который инкапсулирован, что позволяет внешнему объекту контролировать доступ к внутреннему объекту. Это, в сочетании с созданием внутреннего объекта/свойства private , позволяет скрывать информацию .

encapsulation: инкапсуляция представляет собой концепцию обертывания или связывания связанных элементов данных и методов в одном модуле, известном как инкапсуляция.

вот правильный пример инкапсуляции

name = $n; $this -> age = $a; } public function setAge($ag) { $this -> ag = $ag; } public function display() { echo "welcome " . $this -> name . "
"; return $this -> age - $this -> ag; } } $person = new person("Pankaj", 25); $person -> setAge(10); echo "You are " . $person -> display() . " years old"; ?>

Люди, похоже, смешивают детали ориентации объектов с инкапсуляцией, которая представляет собой гораздо более древнюю и более широкую концепцию. Инкапсулированная структура данных

  • можно передавать с помощью одной ссылки, например, increment (myDate) а не прирост (год, месяц, день).
  • имеет набор применимых операций, хранящихся в одном программном модуле (класс, модуль, файл и т.д.)
  • не позволяет клиенту видеть или манипулировать своими подкомпонентами ЗА ИСКЛЮЧЕНИЕМ, вызвав соответствующие операции.

Вы можете делать инкапсуляцию практически на любом языке, и вы получаете огромные преимущества в плане модуляции и ремонтопригодности.

Инкапсуляция - это механизм защиты для вашего класса и структуры данных. Это делает вашу жизнь намного проще. С помощью Encapsulation у вас есть элемент управления доступом и установки параметров и методов класса. У вас есть контроль, чтобы сказать, какая часть видима аутсайдерам и как можно установить параметры ваших объектов.

Доступ и настройка параметров класса

(Хороший путь)

gender; } public function setGender($gender) { if ("male" !== $gender and "female" !== $gender) { throw new \Exception("Set male or female for gender"); } $this->gender = $gender; } }

Теперь вы можете создать объект из своего класса User, и вы можете безопасно установить гендерные параметры. Если вы установите что-то неправильное для своего класса, тогда оно будет выбрасывать и исключать. Вы можете подумать, что это необязательно, но когда ваш код растет, вам хотелось бы увидеть значимое сообщение об исключении, а не неудобную логическую проблему в системе без исключения.

$user = new User(); $user->setGender("male"); // An exception will throw and you can not set "Y" to user gender $user->setGender("Y");

(Плохой путь)

Если вы не выполните роли Encapsulation, тогда ваш код будет примерно таким. Очень трудно поддерживать. Обратите внимание, что мы можем установить что-либо для пользовательского свойства gender.

gender = "male"; // No exception will throw and you can set "Y" to user gender however // eventually you will face some logical issue in your system that is // very hard to detect $user->gender = "Y";

Методы класса доступа

(Хороший путь)

doThis(...); ... $this->doThat(...); ... $this->doThisExtra(...); } private function doThis(...some Parameters...) { ... } private function doThat(...some Parameters...) { ... } private function doThisExtra(...some Parameters...) { ... } }

Мы все знаем, что мы не должны создавать функцию с 200 строк кода, вместо этого мы должны разбить ее на какую-то отдельную функцию, которая разбивает код и улучшает читабельность кода. Теперь с инкапсуляцией вы можете заставить эти функции быть закрытыми, это значит, что они недоступны посторонним, а позже, когда вы хотите изменить функцию, вы были бы счастливы, если увидите ключевое слово private.

(Плохой путь)

Class User { public function doSomethingComplex() { // do everything here ... ... ... ... } }

Обтекание элементов данных и метода вместе в единую единицу (то есть класс) называется Инкапсуляция . Инкапсуляция похожа на капсулу. Это включает связанные операции и данные, связанные с объектом в этот объект. Инкапсуляция подобна вашей сумке, в которой вы можете хранить свою ручку, книгу и т.д. Это означает, что это свойство инкапсулирования членов и функций.

0) $mark = 10; else $mark = 0; } } } ?>

Я даю еще один пример реальной жизни (ежедневное использование), который является "ТВ-операцией". Многие люди управляют телевидением в повседневной жизни.

Он инкапсулирован оболочкой, и мы можем работать с пультом дистанционного управления и не нужно открывать телевизор и менять канал. Здесь все частное, кроме удаленного, чтобы каждый мог получить доступ, чтобы не работать и не изменять вещи в телевизоре.

Инкапсуляция : - перенос данных в один блок. также мы можем сказать, что скрываем информацию о необходимых деталях. Пример . У вас есть мобильный телефон. Там есть какой-то интерфейс, который помогает вам взаимодействовать с мобильным телефоном, и вы можете пользоваться услугами мобильного телефона. Но фактически работающий в сотовом телефоне скроется. u не знаю, как это работает внутри.

Просто я предпочитаю, что это видимость вашего свойства и метода класса. Например- - публичный - частный - защищенный

Давайте рассмотрим пример реальной жизни для инкапсуляции.

В последнее время идея объектно-ориентированного программирования (ООП), кардинально новая идеология написания программ, все более занимает умы программистов.

Объектно-ориентированные программы более просты и мобильны, их легче модифицировать и сопровождать, чем их "традиционных" собратьев. Кроме того, похоже, сама идея объектной ориентированности при грамотном ее использовании позволяет программе быть даже более защищенной от различного рода ошибок, чем это задумывал программист в момент работы над ней. Однако ничего не дается даром: сами
идеи ООП довольно трудны для восприятия "с нуля", поэтому до сих пор очень большое количество программ (различные системы Unix, Apache, Perl, да и сам PHP ) все еще пишутся на старом добром "объектно-неориентированном" Си.

PHP до недавнего времени обеспечивал лишь некоторую поддержку ООП. Однако, после выхода PHP5 поддержка ООП в PHP стала практически полной.

Стратегию ООП лучше всего описать как смещение приоритетов в процессе программирования от функциональности приложения к структурам данных. Это позволяет программисту моделировать в создаваемых приложениях реальные объекты и ситуации. Технология ООП обладает тремя главными преимуществами:

  • она проста для понимания: ООП позволяет мыслить категориями повседневных объектов;
  • повышенно надежна и проста для сопровождения - правильное проектирование обеспечивает простоту расширения и модификации объектно-ориентированных программ. Модульная структура позволяет вносить независимые изменения в разные части программы, сводя к минимуму риск ошибок программирования;
  • ускоряет цикл разработки - и здесь играет важную роль, поскольку различные компоненты объектно-ориентированных программ можно легко использовать в других программах, что уменьшает избыточность кода и снижает риск внесения ошибок при копировании.

Специфика ООП заметно повышает эффективность труда программистов и позволяет им создавать более мощные, масштабируемые и эффективные приложения.

Объектно-ориентированное программирование основано на:

  • Инкапсуляции;
  • Полиморфизме;
  • Наследовании.

Инкапсуляция

Инкапсуляция - это механизм, объединяющий данные и обрабатывающий их код как единое целое.

Многие преимущества ООП обусловлены одним из его фундаментальных принципов - инкапсуляцией. Инкапсуляцией называется включение различных мелких элементов в более крупный объект, в результате чего программист работает непосредственно с этим объектом. Это приводит к упрощению программы, поскольку из нее исключаются второстепенные детали.

Инкапсуляцию можно сравнить с работой автомобиля с точки зрения типичного водителя. Многие водители не разбираются в подробностях внутреннего устройства машины, но при этом управляют ею именно так, как было задумано. Пусть они не знают, как устроен двигатель, тормоз или рулевое управление, - существует специальный интерфейс, который автоматизирует и упрощает эти сложные операции. Сказанное также относится к инкапсуляции и ООП - многие подробности "внутреннего устройства" скрываются от пользователя, что позволяет ему сосредоточиться на решении конкретных задач. В ООП эта возможность обеспечивается классами , объектами и различными средствами выражения иерархических связей между ними.

Полиморфизм

Полиморфизм позволяет использовать одни и те же имена для похожих, но технически разных задач. Главным в полиморфизме является то, что он позволяет манипулировать объектами путем создания стандартных интерфейсов для схожих действий. Полиморфизм значительно облегчает написание сложных программ.

Наследование

Наследование позволяет одному объекту приобретать свойства другого объекта, не путайте с копированием объектов. При копировании создается точная копия объекта, а при наследовании точная копия дополняется уникальными свойствами, которые характерны только для производного объекта.

1

Я часто задаю этот вопрос себе снова и снова. каково использование инкапсуляции данных в PHP. хотя я понимаю, что это использование и полезность скрытия данных или разработки реализации приложения из Public. Я согласен с этим, я мог бы достичь большой безопасности, не позволяя другим разработчикам видеть, как я реализовал другие методы. теперь в случае PHP у меня все еще есть некоторые вопросы без ответа.

а) Как инкапсуляция данных в PHP поможет мне, потому что, как PHP не предоставлять какую-либо систему шифрования (я знаю существует несколько, но я имею в виде в общем), которая будет шифровать мой исходные код от чтения другими, кто-либо может всегда вернуться посмотреть мой источник и изменить соответствующим образом нарушая правила. теперь это закладывает всю цель инкапсуляции данных не так ли?

Теперь может быть другая ситуация, с которой мне, возможно, придется обращаться, используя PHP, позвольте мне принять во внимание два сценария, в которых у меня есть две сделки в зависимости от ситуации.

СИТУАЦИЯ A:

Клиенты A хочет, чтобы разработать Web приложение, которое будет храниться локально в своем настольном компьютере и доступ оттуда. в контексте в этой ситуации я ничего не могу сделать до, чтобы никто не касался источника. Инкапсуляция данных не имеет значения здесь я вижу. не так ли?

Ситуация B:

Мне нужно разработать веб-приложение, который будет размещен в сервере и доступе оттуда, и у меня есть определено несколько класса, который ограничен герметизация, но я хочу, чтобы другие разработчиков расширили класс на, используя Public API. я действительно делаю не имею никакой идеи о том, как я могу позволить кому-либо (разработчикам) продлить использование моего класса в этой ситуации? я действительно не уверен, как публичные вещи API work ?? Я буду признателен, если бы кто-то мог пролить свет на логику за внедрение PUBLIC API. и это это, где Data Encapsulation приходит в изображение? это единственная ситуация, где мне будет нужно инкапсуляция, которая будет реализована в моем приложении?

  • 2 ответа
  • Сортировка:

    Активность

2

Вы не используете Encapsulation, потому что это не позволяет людям касаться вашего кода, а потому, что вы хотите создать ограниченный, но выделенный публичный API для ваших объектов для обмена сообщениями. Это ключевой элемент в парадигме ООП. Цель заключается не в безопасности, а в поддерживаемых и гибких приложениях. Если люди хотят изменить свой код, позвольте им. Они взрослые.

0

Да, я могу их разрешить, но что, если я реализую сайт электронной коммерции, который обрабатывает различные типы платежных систем. я все еще прошу других разработчиков прийти изменить мой исходный код? и главный вопрос заключается в том, могут ли люди получить доступ к моему исходному коду, который размещен на удаленном сервере, и может ли он их изменить, даже если у файла есть 777 разрешений? - Ibrahim Azhar Armar 14 июн. 11 2011-06-14 11:38:12

0

@Ibrahim Разрешения для файлов не имеют ничего общего с концепцией инкапсуляции. 777 доступен для всего мира. Пожар вашего SysAdmin, если он/она установил какие-либо разрешения на это. Но он полностью не связан с инкапсуляцией или разработкой программного обеспечения. -

Эти концепции встречаются, когда вы публикуете закрытую исходную библиотеку. Вы хотите убедиться, что он имеет открытый публичный API, предоставляемый в качестве интерфейса, и вы хотите убедиться, что он зашифрован, поэтому никто не может копировать его внутренности.

Объектно-ориентированные программы более просты и мобильны, их легче модифицировать и сопровождать, чем их «традиционных» собратьев. Кроме того, похоже, сама идея объектной ориентированности при грамотном ее использовании позволяет программе быть даже более защищенной от различного рода ошибок, чем это задумывал программист в момент работы над ней. Однако ничего не дается даром: сами
идеи ООП довольно трудны для восприятия «с нуля», поэтому до сих пор очень большое количество программ (различные системы Unix, Apache, Perl, да и сам PHP) все еще пишутся на старом добром «объектно-неориентированном» Си.

PHP до недавнего времени обеспечивал лишь некоторую поддержку ООП. Однако, после выхода PHP5 поддержка ООП в PHP стала практически полной.

Стратегию ООП лучше всего описать как смещение приоритетов в процессе программирования от функциональности приложения к структурам данных. Это позволяет программисту моделировать в создаваемых приложениях реальные объекты и ситуации. Технология ООП обладает тремя главными преимуществами:

* она проста для понимания: ООП позволяет мыслить категориями повседневных объектов;
* повышенно надежна и проста для сопровождения - правильное проектирование обеспечивает простоту расширения и модификации объектно-ориентированных программ. Модульная структура позволяет вносить независимые изменения в разные части программы, сводя к минимуму риск ошибок программирования;
* ускоряет цикл разработки - модульность и здесь играет важную роль, поскольку различные компоненты объектно-ориентированных программ можно легко использовать в других программах, что уменьшает избыточность кода и снижает риск внесения ошибок при копировании.

Специфика ООП заметно повышает эффективность труда программистов и позволяет им создавать более мощные, масштабируемые и эффективные приложения.

Объектно-ориентированное программирование основано на:

* Инкапсуляции;
* Полиморфизме;
* Наследовании.

Инкапсуляция

Инкапсуляция — это механизм, объединяющий данные и обрабатывающий их код как единое целое.

Многие преимущества ООП обусловлены одним из его фундаментальных принципов - инкапсуляцией. Инкапсуляцией называется включение различных мелких элементов в более крупный объект, в результате чего программист работает непосредственно с этим объектом. Это приводит к упрощению программы, поскольку из нее исключаются второстепенные детали.

Инкапсуляцию можно сравнить с работой автомобиля с точки зрения типичного водителя. Многие водители не разбираются в подробностях внутреннего устройства машины, но при этом управляют ею именно так, как было задумано. Пусть они не знают, как устроен двигатель, тормоз или рулевое управление, - существует специальный интерфейс, который автоматизирует и упрощает эти сложные операции. Сказанное также относится к инкапсуляции и ООП - многие подробности «внутреннего устройства» скрываются от пользователя, что позволяет ему сосредоточиться на решении конкретных задач. В ООП эта возможность обеспечивается классами, объектами и различными средствами выражения иерархических связей между ними.

Полиморфизм

Полиморфизм позволяет использовать одни и те же имена для похожих, но технически разных задач. Главным в полиморфизме является то, что он позволяет манипулировать объектами путем создания стандартных интерфейсов для схожих действий. Полиморфизм значительно облегчает написание сложных программ.

Наследование

Наследование позволяет одному объекту приобретать свойства другого объекта, не путайте с копированием объектов. При копировании создается точная копия объекта, а при наследовании точная копия дополняется уникальными свойствами, которые характерны только для производного объекта.

Классы и объекты в PHP

Класс — это базовое понятие в объектно-ориентированном программировании (ООП). Если сказать проще, то класс — это своеобразный тип переменной.

Экземпляр класса — это объект. Объект — это совокупность данных (свойств) и функций (методов) для их обработки. Данные и методы называются членами класса. Вообще, объектом является все то, что поддерживает инкапсуляцию.

Внутри объекта данные и код (члены класса) могут быть либо открыты, либо нет. Открытые данные и члены класса являются доступными для других частей программы, которые не являются частью объекта. А вот закрытые данные и члены класса доступны только внутри этого объекта.

Описание классов в PHP начинаются служебным словом class:

class Имя_класса { // описание членов класса - данных и методов для их обработки }

Для объявления объекта необходимо использовать оператор new:

Объект = new Имя_класса;

Данные описываются с помощью служебного слова var. Метод описывается так же, как и обыкновенная функция. Методу также можно передавать параметры.

Пример класса на PHP:

John"; } } // Создаем объект класса Coor: $object = new Coor; ?>

Доступ к класам и объектам в PHP

Мы рассмотрели, каким образом описываются классы и создаются объекты. Теперь нам необходимо получить доступ к членам класса, для этого в PHP предназначен оператор ->. Приведем пример:

John"; } } // Создаем объект класса Coor: $object = new Coor; // Получаем доступ к членам класса: $object->name = "Alex"; echo $object->name; // Выводит "Alex" // А теперь получим доступ к методу класса (фактически, к функции внутри класса): $object->Getname(); // Выводит "John" заглавными буквами?>

Чтобы получить доступ к членам класса внутри класса, необходимо использовать указатель $this, которы всегда относится к текущему объекту. Модифицированный метод Getname():

function Getname() { echo $this->name; } Таким же образом, можно написать метод Setname(): function Setname($name) { $this->name = $name; }

Теперь для изменения имени можно использовать метод Setname():

$object->Setname("Peter"); $object->Getname();

А вот и полный листинг кода:

name; } function Setname($name) { $this->name = $name; } } // Создаем объект класса Coor: $object = new Coor; // Теперь для изменения имени используем метод Setname(): $object->Setname("Nick"); // А для доступа, как и прежде, Getname(): $object->Getname(); // Сценарий выводит "Nick" ?>

Указатель $this можно также использовать для доступа к методам, а не только для доступа к данным:

function Setname($name) { $this->name = $name; $this->Getname(); }

Инициализация объектов

Иногда возникает необходимость выполнить инициализацию объекта — присвоить его свойствам первоначальные значения. Предположим, имя класса Coor и он содержит два свойства:имя человека и город его проживания. Можно написать метод (функцию), который будет выполнять инициализацию объекта, например Init():

name = $name; $this->city = "London"; } } // Создаем объект класса Coor: $object = new Coor; // Для инициализации объекта сразу вызываем метод: $object->Init(); ?>

Главное не забыть вызвать функцию сразу после создания объекта, либо вызвать какой-нибудь метод между созданием (оператор new) объекта и его инициализацией (вызовом Init).

Для того, чтобы PHP знал, что определенный метод нужно вызывать автоматически при создании объекта, ему нужно дать имя такое же, как и у класса (Coor):

function Coor ($name) $this->name = $name; $this->city = "London"; }

Метод, инициализирующий объект, называется конструктором. Однако, PHP не имеет деструкторов, поскольку ресурсы освобождаюся автоматически при завершении работы скриптов.

Наследование и полиморфизм классов в PHP

Наследование классов в PHP

Наследование — это не просто создание точной копии класса, а расширение уже существующего класса, чтобы потомок мог выполнять какие-нибудь новые, характерные только ему функции. Рассмотрим конкретный пример на PHP:

Это родительская функция

Это родительский класс

"; } } class Child extends Parent { function child_funct() { echo "

Это дочерняя функция

"; } function test () { echo "

Это дочерний класс

"; } } $object = new Parent; $object = new Child; $object->parent_funct(); // Выводит "Это родительская функция" $object->child_funct(); // Выводит "Это дочерняя функция" $object->test(); // Выводит "Это дочерний класс" ?>

Ключевое слово extends (см. пример) говорит о том, что дочерний класс Child наследует все методы и свойства класса Parent. Родительский класс обычно называют базовым классом или суперклассом, а дочерний класс Child — производным или подклассом.

Полиморфизм классов в PHP

Полиморфизм — это свойства базового класса использовать функции производных классов. Практический пример, показывающий свойство класса — полиморфизм.

В этом уроке мы узнаем о первом из трёх китов ООП - инкапсуляции . Инкапсуляция (лат. in capsula; от capsula «коробочка») - размещение в оболочке, изоляция, закрытие чего-либо с целью исключения влияния на окружающее. О том, как это используется в объектно-ориентированном программировании, вы узнаете по ходу этого урока.

Свойства объектов

Вернёмся к нашей прошлой теме. Те, кто видел котиков, знают, что некоторые признаки у котиков отличаются: цвет, вес, громкость мяуканья и т.д. Такие признаки есть у всех объектов, в том числе и в наших. И в ООП они называются свойствами объектов . Давайте приведем примеры таких свойств для котиков:

  • цвет;

Давайте теперь создадим более похожий на реального котика класс:

курса ООП в PHP .

Всё это: $name, $color, $weight - свойства будущих объектов этого класса. Перед именем свойства всегда ставится модификатор доступа . В нашем случае - это public. Это слово говорит о том, что данное свойство будет доступно всем, кто работает с объектами данного класса. Есть и другие модификаторы доступа, но о них чуть ниже.

И снова сам по себе этот код сейчас ничего не выведет. Это опять - просто шаблон.

Итак, мы сделали некоторый шаблон, который вполне себе описывает котиков. Давайте теперь создадим новый объект этого класса.

Код доступен только после покупки курса ООП в PHP .

Так мы создали объект с типом Cat и вывели его с помощью var_dump().

Код доступен только после покупки курса ООП в PHP .

Как видим, в переменной лежит объект (object), и у него есть три свойства, и у всех значения - null. Давайте это исправим. Дадим нашему котику имя, покрасим и наполним его чем-нибудь, чтобы он сколько-нибудь весил. Делается это так:

Код доступен только после покупки курса ООП в PHP .

Оператор -> (стрелочка, состоящая из двух знаков - "тире" и "больше") используется для доступа к свойствам объекта. В данном коде мы обратились к каждому свойству отдельно и присвоили им значения. Если теперь мы выведем $cat1 с помощью var_dump(), то получим следующее:

Код доступен только после покупки курса ООП в PHP .

Как видим, это уже не ерунда какая-то, а белый Снежок, который весит три с половиной кило.

Теперь мы можем обратиться к свойству этого кота и узнать его имя.

Код доступен только после покупки курса ООП в PHP .

И получим в результате "Снежок".

Можем создать несколько котов и задать им разные свойства:

Код доступен только после покупки курса ООП в PHP .

Результат получится вполне ожидаемый:

Код доступен только после покупки курса ООП в PHP .

Два разных объекта со своими значениями свойств.

Это довольно похоже на работу с массивами, как будто записываем значение по ключу.

То, что внутри объектов есть свойства - это уже проявление инкапсуляции. У объекта есть свойства, он их внутри себя содержит - вот и "капсула".

Методы объектов

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

Методы объявляются следующим образом:

Код доступен только после покупки курса ООП в PHP .

public - модификатор доступа к методу, говорящий о том, что его могут вызвать все, кто пользуется объектом, sayHello - имя метода, а далее идут аргументы (в нашем случае их нет), а далее - тело метода, в котором мы просто выводим строку "Мяу!";

Как мы видим, в целом методы объектов не сильно отличаются от обычных функций. При их описании мы только добавляем модификатор доступа.

Вызвать метод мы можем у созданного объекта. Давайте создадим нового кота и попросим его с нами поздороваться. Для вызова метода объекта используется такой же оператор как и для доступа к свойствам объекта ->

Код доступен только после покупки курса ООП в PHP .

Этот код выведет строку "Мяу!". Вот так вот, с нами поздоровался виртуальный кот!

Переменная $this

Да только методы - это не такие уж и простые функции. Внутри методов доступна специальная переменная $this, и в ней хранится... наш текущий созданный объект. БДЫЩЬ! Мозг взорвался:)

На деле всё не так уж и сложно. Мы можем с помощью этой переменной обращаться к другим методам и свойствам данного объекта. Например, давайте научим кота здороваться по-человечески. Пусть он будет называть своё имя. Для этого нам нужно переписать метод sayHello() следующим образом:

Код доступен только после покупки курса ООП в PHP .

И теперь, когда мы создадим новый объект кота, и попросим его с нами поздороваться, то $this->name вернёт значение свойства name у текущего объекта.

Код доступен только после покупки курса ООП в PHP .

Данный код выведет следующее:

Код доступен только после покупки курса ООП в PHP .

Вот так всё просто. Надеюсь, этот наглядный пример помог вам понять, что $this - это просто текущий объект, и что $this есть только у созданного объекта.

И методы, и переменная $this - тоже инкапсуляция ! Но и на этом ещё не всё :)

Модификаторы доступа

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

Однако, есть и другие модификаторы доступа, и в этом уроке мы с вами изучим ещё один модификатор - private . Он позволяет сделать свойства и методы объекта приватными, после этого они будут доступны только внутри этого объекта.

Например, давайте изменим модификатор для свойства name:

Код доступен только после покупки курса ООП в PHP .

Давайте теперь попытаемся изменить это свойство у объекта:

Код доступен только после покупки курса ООП в PHP .

Мы получим ошибку:

Однако, мы можем написать публичный метод, который позволит задать данное свойство с помощью него. Назовём его setName(). Он будет брать переданную в него строку и устанавливать это значение в свойство name.

Код доступен только после покупки курса ООП в PHP .

Теперь давайте зададим имя коту с помощью этого метода:

Код доступен только после покупки курса ООП в PHP .

Теперь всё успешно отработало, и кот даже сказал своё имя с помощью метода sayHello(). Однако если бы мы попытались просто вывести его имя вот так:

Код доступен только после покупки курса ООП в PHP .

то мы бы снова получили ошибку доступа.

Как вы могли заметить с помощью метода setName мы позволяем задать в свойство name только строку. Ни число, ни массив, ни что-то ещё, а именно - строку. Это хороший подход - это позволяет использовать различного рода валидации. Ведь внутри метода вы можете выполнить какие-то проверки, прежде чем положить значение в свойство. Это позволяет избежать ситуаций, когда в свойства можно засунуть любую ерунду. Такие методы как setName(), задающие значения свойствам объекта называются сеттерами .

Чтобы получить напрямую значение приватного свойства у объекта можно написать другой публичный метод, который будет просто возвращать значение этого свойства. Напишем метод getName().

Код доступен только после покупки курса ООП в PHP .

Теперь мы можем просто получить имя кота извне:

Код доступен только после покупки курса ООП в PHP .

Такие методы, в свою очередь, именуются геттерами .

Модификаторы доступа - это ещё одно проявление инкапсуляции.

Конструктор

А теперь давайте возьмём и сломаем одного кота:)

Для этого мы не будем давать ему имя, и вызовем метод getName().

Код доступен только после покупки курса ООП в PHP .

Что произойдёт? Правильно - ошибка!

Ведь мы описали, что getName() всегда должна отдавать строку. А в нашем объекте возвращается null.

Можно ли как-то гарантировать, что в свойстве name всегда будет строка? Можно. Для этого существует конструктор - это метод, который вызывается при создании объекта этого класса. В принципе, это такой же метод, как и все другие, он может иметь различные аргументы. Но он обязательно вызывается автоматически при создании объекта класса, в котором он описан.

Метод-конструктор должен называться __construct. Именно так и никак иначе.

Давайте создадим конструктор для нашего кота, который будет иметь обязательный аргумент $name с типом строка.

Код доступен только после покупки курса ООП в PHP .

Конструктор принято объявлять в начале класса, после объявления свойств, но перед другими методами.

Теперь чтобы создать кота с именем Снежок мы должны передать аргумент при создании нового объекта:

Код доступен только после покупки курса ООП в PHP .

И вот что сейчас произошло: аргумент, переданный в круглые скобки, был передан в метод __construct(). Там это значение установилось в свойство объекта name.

Если мы сейчас попробуем узнать имя этого кота, то мы его получим.

Код доступен только после покупки курса ООП в PHP .

А давайте теперь мы попробуем по-старинке создать кота без имени, не передавая аргументов при создании объекта.

Код доступен только после покупки курса ООП в PHP .

Мы получим ошибку.

Здесь написано, что в конструкторе ожидается 1 обязательный аргумент, а мы не передали ни одного.

Таким образом, мы получили класс котов, объекты которого нельзя создать без имени. И именно так и должно быть в мире - у всех котиков должны быть имена. Согласитесь, такой мир был бы гораздо лучше чем тот, в котором мы живём. Ну так вот в программировании, мы способны построить такие миры, какие сами пожелаем. И это круто:)

Подводя итог, можно сказать что инкапсуляция - это возможность объектов содержать в себе свойства и методы. Так мы делаем их зависимыми друг от друга внутри этой "капсулы".

Это был первый кит ООП - инкапсуляция. До встречи на следующем уроке, а пока за домашку.