Что такое инкапсуляция данных в случае PHP? Это дочерний класс

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

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

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

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

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

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

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

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

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

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

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

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

Полиморфизм

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

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

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

PHP, ООП, Инкапсуляция, Наследование, Полиморфизм

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

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

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

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

Приведем другой пример. Принципы инкапсуляции как скрытия внутренней реализации заложены в любой функции PHP. Возможно, вам уже известна функция strpos() для работы со строками из стандартной библиотеки PHP. Эта функция ищет в строке заданную последовательность символов и возвращает ее позицию в виде числа. Если задуматься над реализацией этой функции, то можно предположить, что нам потребуется в цикле просматривать каждый символ от начала строки на совпадение с начальным символом искомой последовательности и в случае такового сравнивать следующие два символа и т. д. Но нам как программистам нет необходимости задумываться над этим и вникать в тонкости реализации данной функции. Нам достаточно знать параметры , которые она принимает, и формат возвращаемого значения . Функция strpos() инкапсулирует в себе решение задачи поиска подстроки, предлагая нам лишь внешний интерфейс для ее использования.

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

В языке PHP концепция инкапсуляции реализована в виде специальных модификаторов доступа к полям и методам классов. Об этом мы поговорим далее.

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

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

Давайте приведем пример наследования из реальной жизни. В качестве класса можно взять геометрическую фигуру. При этом мы не уточняем, какой конкретно фигура должна быть. Какие свойства фигуры можно выделить? Предположим, она обладает цветом. Тогда в классе, описывающем фигуру, должно быть соответствующее поле строкового типа, задающее цвет фигуры. Также любая геометрическая фигура обладает площадью. Пусть площадь будет вторым свойством нашего класса.

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

Это значит, что в классах Квадрат и Треугольник нам не придется повторно задавать поля цвета и площади. Достаточно указать, что упомянутые классы наследуются от класса Фигура.

Теперь давайте рассмотрим еще один пример, более приближенный к реалиям веб-программистов. Сейчас в Интернете огромную популярность завоевали различные блоги. Фактически блог - это просто набор статей. И ключевой сущностью при разработке блога является именно статья.

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

Чтобы реализовать эту ситуацию в PHP, нам потребуется определить два класса: класс для обычной статьи-заметки и класс для новостной статьи. При этом пусть новостная статья расширяет возможности обычной статьи, т. е. наследуется от нее. Для наследования классов в PHP используется ключевое слово extends .

Class { ... // содержимое класса } class { ... // содержимое класса }

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

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


Иногда у нас может появиться необходимость переопределить один из методов родительского класса. Давайте еще раз приведем реализацию класса Article :

Class Article { ... // поля класса // Функция для вывода статьи function view() { echo "

$this->title

$this->content

"; } }

Предположим, что вывод новостной статьи должен отличаться от представления обычной статьи, и мы должны дополнительно выводить время публикации новости. При этом в классе Article уже существует метод view() , отвечающий за вывод статьи. Можно поступить двумя способами. В первом случае можно придумать новый метод в классе NewsArticle , например, с именем viewNews() специально для вывода новости. Однако правильнее использовать одинаковые методы для выполнения схожих действий в наследуемых классах. Поэтому будет лучше, если метод для вывода новости в классе NewsArticle будет называться так же, как и в родительском классе - view() . Для реализации такой логики в PHP существует возможность переопределять родительские методы, т. е. задавать в дочерних классах методыс названиями, совпадающими в родительских классах. Реализация этих методов в родительских классах в таком случае становится неактуальной для класса-потомка. Давайте приведем пример класса NewsArticle с переопределенным методом view() :

Class NewsArticle extends Article { $datetime; // дата публикации новости // Функция для вывода статьи function view() { echo "

$this->title

". strftime("%d.%m.%y", $this->datetime). " Новость

$this->content

"; } }

В приведенном коде используется функция strftime() , которая позволяет выводить даты в удобном виде. Для лучшего понимания кода ознакомьтесь со спецификацией этой функции в справочнике. Для нас же сейчас важно, чтобы вы обратили внимание на то, что класс NewsArticle , как и Article , определяет метод view() . Соответственно, все объекты этого класса будут использовать метод view() , объявленный в классе NewsArticle , а не в Article .

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

Полиморфизм

Полиморфизм - взаимозаменяемость объектов с одинаковым интерфейсом.

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

Давайте рассмотрим следующий пример, который дает представление о сути полиморфизма :

Class A { function Test() { echo "Это класс A
"; } function Call() { $this->Test(); } } class B extends A { function Test() { echo "Это класс B
"; } } $a = new A(); $b = new B(); $a->Call(); // выводит: "Это класс A" $b->Test(); // выводит: "Это класс B" $b->

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

$a->Call(); // выводит: "Это класс A"

В этой строке происходит вызов метода Call() у объекта класса А . Как и определено в функции Call() класса A , происходит вызов метода Test() . Отрабатывает метод Test() у объекта класса A , и на экран выводится текст "Это класс А ".

$b->Test(); // выводит: "Это класс B"

В данной строке происходит вызов метода Test() у объекта класса B . Метод Test() класса B выводит на экран текст "Это класс В ".

$b->Call(); // выводит: "Это класс B"

Наконец, в последней строке происходит вызов класса Call() у объекта класса В . Но в реализации класса B мы не увидим такого метода, а это значит, что он наследуется от класса A , т. к. класс B - это потомок класса A . Что же мы видим в реализации метода Call() класса A ? Следующий код:

$this->Test();

Метод Call() вызывает метод Test() того объекта, в котором находится. Это значит, что отработает метод Test() объекта класса B . Именно этим объясняется результат, выведенный на экране.

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

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

_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 не знаю, как это работает внутри.

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

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

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

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



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: