Тарифы Услуги Сим-карты

PHP — ООП или процедурный подход. Что такое ООП на примерах. Для чайников

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

Написать про ООП в php несколько статей меня заставило то, что я не нашёл удовлетворивших меня статей по этой теме. Есть сухие и скучные официальные мануалы или статьи, где излагаются, по сути, те же мануалы только с более подробными примерами, так же в сети очень много устаревшей информации по этой теме.

Зачем нужно ООП?

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

Иллюстрация из книги «Чистый код» — Роберт Мартин

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

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

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

Основные понятия

ООП – это методология (способ, подход) программирования согласно которой программный продукт представляется в виде взаимодействующих объектов. Я не согласен с тем, что ООП всегда подразумевает использование классов – js, например объектно-ориентированный язык, но в нём нет классов. Однако в применении к php ООП всегда подразумевает использование классов.

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

Три кита ООП


ООП основано на трёх принципах, которые часто называют тремя китами ООП, это:

  • инкапсуляция
  • полиморфизм
  • наследование

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

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

Наследование – это процесс приобретения одним типом объектов (классом) некоторых свойств другого типа объектов.

Очень часто бывает, что описание одного типа объектов то есть класс, полностью попадает под описание другого типа объектов. Например, класс, описывающий админа, может описать и пользователя, за исключением того, что у пользователя нет прав доступа. В этом случае имеет смысл сделать класс, описывающий админов, потомком класса, описывающего пользователей. При этом в классе, который описывает админов, не придётся описывать данные и поведение, которые уже описаны в классе «пользователь», нам необходимо только описать данные, которые будут отвечать за предоставления прав доступа. В этом случае класс «пользователь» будет предком класса «админ», который может иметь своего потомка, а тот своего и т.д. Цепочка наследования может быть сколь угодно длинной. Кроме того у одного предка может быть несколько потомков, каждый из которых полностью приобретёт свойства своего предка и добавит в них что-то своё, иначе наследование бессмысленно.

Полиморфизм – это использование одного и того же имени метода для решения нескольких похожих задач.

Естественно использовать для одного и того же действия с различными типами объектов одной цепочки наследования одно и то же имя метода. Реализация этого метода может различаться в каждом классе и вызывая метод мы не будем знать как он что-то делает, но будем знать что он делает исходя из его имени. Вернёмся к нашему примеру с пользователем и админом. И админ, и пользователь могут залогиниться и естественно для этого действия выбрать одно имя метода, например logIn. Его конкретная реализация в этих классах может различаться, например, при авторизации мы записываем для админы его права доступа в сессию, а для пользователя нет. При написании кода, который обрабатывает данные прилетевшие от формы кода после создания экземпляра класса нам будет не важно кто логинится простой пользователь или администратор – для экземпляра любого из этих двух классов мы вызовем метод с одним названием.

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

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

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

Код объектно-ориентированного подхода достаточно прост в понимании и чтении и отлично подходит для реализации масштабных и очень непростых проектов.

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

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

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

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

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

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

class Customer { public $name; protected $orders; public function __construct($name, $orders) { $this->name = $name; $this->orders = $orders; } public function getName() { return $this->name; } } $customer = new Customer("Ben", array("id" => 10)); echo $customer->getName();

class Customer {

public $ name ;

protected $ orders ;

public function __construct ($ name , $ orders ) {

$ this -> name = $ name ;

$ this -> orders = $ orders ;

public function getName () {

return $ this -> name ;

$ customer = new Customer ("Ben" , array ("id" = > 10 ) ) ;

echo $ customer -> getName () ;

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

В примере выше, помимо создания объекта, осуществляется вызов метода getName() и вывод на экран значения, возвращаемого им. Конечно, в результате работы скрипта мы увидим вывод имени пользователя — “Ben”, потому как, именно оно передается в качестве первого аргумента методу конструктору, где и записывается в свойство класса под именем name. Соответственно вышеуказанный метод возвращает в качестве результата своей работы значение данного свойства.

При этом ни кто Вам не запрещает сформировать еще один подобный объект из ранее описанного класса:

$customer2 = new Customer("Sem", array("id" => 15)); echo $customer2->getName();

$ customer2 = new Customer ("Sem" , array ("id" = > 15 ) ) ;

echo $ customer2 -> getName () ;

В этом случае на экране мы увидим имя уже совсем другого пользователя – “Sem”. Таким образом мы, по сути создали совсем другой объект из одного и того же шаблона – класса. При этом у данного объекта, совсем другие начальные данные, которые все так же формируются методом конструктором, а значит и его поведение, определяемое методами, так же будет другим.

Обратите внимание, что свойства класса и его методы, могут использоваться только с конкретным объектом — как раз это и видно на примере, и без него, они абсолютно бесполезны, в плане работы за пределами класса, потому как внутри класса, конечно же, они могут использоваться в коде его методов. Причем доступ к вышеуказанным элементам объекта, осуществляется через специальный набор знаков “->”(стрелочку) , перед которой необходимо указать интересующий объект,или же указатель объекта – ключевое слово $this. Указатель объекта $this, используется в коде методов, непосредственно внутри класса для обращения к его свойствам или же методам.

И опять же мы с Вами видим, что основа разработки ООП на PHP — это работа с объектами, причем прелесть заключается в том, что мы один раз описываем класс, а значит, формируем некий набор данных и необходимый функционал. А далее создаем объекты, каждый из которых в зависимости от начальных данных, по сути, будет абсолютно уникальным.

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

Собственно, вот мы с Вами кратко и рассмотрели основы объектно-ориентированного программирования в PHP. Конечно, данный вид программирования требует большего внимания, нежели одна статья, если Вы хотите действительно хорошо разобраться в нем и использовать его в своих наработках. Более подробно данная тема рассмотрена в премиум курсе .

Всего Вам доброго у удачного кодирования!!!

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

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

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

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

Все это и многое другое вы узнаете из уроков предлагаемого курса по ООП в PHP.

Все уроки курса:

Описание курса: В данном курсе мы рассмотрим теоретические аспекты ООП, а также научимся применять полученные знания на практике. Курс состоит из 17 уроков, в которых мы шаг за шагом изучим основы ООП, которых должно быть достаточно для написания приложений в объектном стиле.

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

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

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


Об объектах и классах

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

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

Одним из самых распространенных объектно-ориентированных языков программирования является язык java. Там без использования объектов просто не обойтись. Вот как будет выглядеть код класса, описывающего треугольник на этом языке:

/** * Класс Треугольник. */ class Triangle { /** * Специальный метод, называемый конструктор класса. * Принимает на вход три параметра: * длина стороны А, длина стороны Б, * угол между этими сторонами(в градусах) */ Triangle(double sideA, double sideB, double angleAB) { this.sideA = sideA; this.sideB = sideB; this.angleAB = angleAB; } double sideA; //Поле класса, хранит значение стороны А в описываемом треугольнике double sideB; //Поле класса, хранит значение стороны Б в описываемом треугольнике double angleAB; //Поле класса, хранит угла(в градусах) между двумя сторонами в описываемом треугольнике /** * Метод класса, который рассчитывает площадь треугольника */ double getSquare() { double square = this.sideA * this.sideB * Math.sin(this.angleAB * Math.PI / 180); return square; } /** * Метод класса, который рассчитывает периметр треугольника */ double getPerimeter() { double sideC = Math.sqrt(Math.pow(this.sideA, 2) + Math.pow(this.sideB, 2) - 2 * this.sideA * this.sideB * Math.cos(this.angleAB * Math.PI / 180)); double perimeter = this.sideA + this.sideB + sideC; return perimeter; } }

Если мы внутрь класса добавим следующий код:

/** * Именно в этом месте запускается программа */ public static void main(String args) { //Значения 5, 17, 35 попадают в конструктор класса Triangle Triangle triangle1 = new Triangle(5, 17, 35); System.out.println("Площадь треугольника1: "+triangle1.getSquare()); System.out.println("Периметр треугольника1: "+triangle1.getPerimeter()); //Значения 6, 8, 60 попадают в конструктор класса Triangle Triangle triangle2 = new Triangle(6, 8, 60); System.out.println("Площадь треугольника1: "+triangle2.getSquare()); System.out.println("Периметр треугольника1: "+triangle2.getPerimeter()); }

то программу уже можно будет запускать на выполнение. Это особенность языка java. Если в классе есть такой метод

Public static void main(String args)

то этот класс можно выполнять. Разберем код подробнее. Начнем со строки

Triangle triangle1 = new Triangle(5, 17, 35);

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

System.out.println("Площадь треугольника1: "+triangle1.getSquare()); System.out.println("Периметр треугольника1: "+triangle1.getPerimeter());

выводят рассчитанные площадь треугольника и его периметр в консоль.

Аналогично все происходит и для второго экземпляра класса Triangle .

Понимание сути классов и конструирования конкретных объектов - это уверенный первый шаг к пониманию методологии ООП.

Еще раз, самое важное:

ООП - это способ организации кода программы;

Класс - это пользовательская структура данных, которая воедино объединяет данные и функции для работы с ними(поля класса и методы класса);

Объект - это конкретный экземпляр класса, полям которого заданы конкретные значения.


Три волшебных слова

ООП включает три ключевых подхода: наследование, инкапсуляцию и полиморфизм. Для начала, приведу определения из wikipedia :

Инкапсуляция - свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. Некоторые языки (например, С++) отождествляют инкапсуляцию с сокрытием, но большинство (Smalltalk, Eiffel, OCaml) различают эти понятия.

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

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

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


Итак, точка - это самая малая геометрическая фигура, которая является основой всех прочих построений (фигур). Поэтому именно точка выбрана в качестве базового родительского класса. Напишем класс точки на java:

/** * Класс точки. Базовый класс */ class Point { /** * Пустой конструктор */ Point() {} /** * Метод класса, который рассчитывает площадь фигуры */ double getSquare() { return 0; } /** * Метод класса, который рассчитывает периметр фигуры */ double getPerimeter() { return 0; } /** * Метод класса, возвращающий описание фигуры */ String getDescription() { return "Точка"; } }

У получившегося класса Point пустой конструктор, поскольку в данном примере мы работаем без конкретных координат, а оперируем только параметрами значениями сторон. Так как у точки нет никаких сторон, то и передавать ей никаких параметров не надо. Также заметим, что класс имеет методы Point::getSquare() и Point::getPerimeter() для расчета площади и периметра, оба возвращают 0. Для точки оно и логично.


Поскольку у нас точка является основой всех прочих фигур, то и классы этих прочих фигур мы наследуем от класса Point . Опишем класс отрезка, наследуемого от класса точки:

/** * Класс Отрезок */ class LineSegment extends Point { LineSegment(double segmentLength) { this.segmentLength = segmentLength; } double segmentLength; // Длина отрезка /** * Переопределенный метод класса, который рассчитывает площадь отрезка */ double getSquare() { return 0; } /** * Переопределенный метод класса, который рассчитывает периметр отрезка */ double getPerimeter() { return this.segmentLength; } String getDescription() { return "Отрезок длиной: " + this.segmentLength; } }

Class LineSegment extends Point

означает, что класс LineSegment наследуется от класса Point . Методы LineSegment::getSquare() и LineSegment::getPerimeter() переопределяют соответствующие методы базового класса. Площадь отрезка всегда равняется нулю, а площадь периметра равняется длине этого отрезка.

Теперь, подобно классу отрезка, опишем класс треугольника(который также наследуется от класса точки):

/** * Класс Треугольник. */ class Triangle extends Point { /** * Конструктор класса. Принимает на вход три параметра: * длина стороны А, длина стороны Б, * угол между этими сторонами(в градусах) */ Triangle(double sideA, double sideB, double angleAB) { this.sideA = sideA; this.sideB = sideB; this.angleAB = angleAB; } double sideA; //Поле класса, хранит значение стороны А в описываемом треугольнике double sideB; //Поле класса, хранит значение стороны Б в описываемом треугольнике double angleAB; //Поле класса, хранит угла(в градусах) между двумя сторонами в описываемом треугольнике /** * Метод класса, который рассчитывает площадь треугольника */ double getSquare() { double square = (this.sideA * this.sideB * Math.sin(this.angleAB * Math.PI / 180))/2; return square; } /** * Метод класса, который рассчитывает периметр треугольника */ double getPerimeter() { double sideC = Math.sqrt(Math.pow(this.sideA, 2) + Math.pow(this.sideB, 2) - 2 * this.sideA * this.sideB * Math.cos(this.angleAB * Math.PI / 180)); double perimeter = this.sideA + this.sideB + sideC; return perimeter; } String getDescription() { return "Треугольник со сторонами: " + this.sideA + ", " + this.sideB + " и углом между ними: " + this.angleAB; } }

Тут нет ничего нового. Также, методы Triangle::getSquare() и Triangle::getPerimeter() переопределяют соответствующие методы базового класса.
Ну а теперь, собственно, тот самый код, который показывает волшебство полиморифзма и раскрывает мощь ООП:

Class Main { /** * Именно в этом месте запускается программа */ public static void main(String args) { //ArrayList - Это специальная структура данных в java, // позволяющая хранить объекты определенного типа в массиве. ArrayList figures = new ArrayList(); //добавляем три разных объекта в массив figures figures.add(new Point()); figures.add(new LineSegment(133)); figures.add(new Triangle(10, 17, 55)); for (int i = 0; i

Мы создали массив объектов класса Point , а поскольку классы LineSegment и Triangle наследуются от класса Point , то и их мы можем помещать в этот массив. Получается, каждую фигуру, которая есть в массиве figures мы можем рассматривать как объект класса Point . В этом и заключается полиморфизм: неизвестно, к какому именно классу принадлежат находящиеся в массиве figures объекты, но поскольку все объекты внутри этого массива принадлежат одному базовому классу Point , то все методы, которые применимы к классу Point также и применимы к его классам-наследникам.


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


Полный код примера:

Import java.util.ArrayList; class Main { /** * Именно в этом месте запускается программа */ public static void main(String args) { //ArrayList - Это специальная структура данных в java, // позволяющая хранить объекты определенного типа в массиве. ArrayList figures = new ArrayList(); //добавляем три разных объекта в массив figures figures.add(new Point()); figures.add(new LineSegment(133)); figures.add(new Triangle(10, 17, 55)); for (int i = 0; i

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

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

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

Самой трудной для понимания концепцией являются основы ООП , так как они отличаются от обычного программирования на PHP. Но как только вы поймете основные принципы, сама модель станет для вас простой и понятной.

Что такое ООП на PHP?

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

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

Автомобиль является объектом. Он имеет атрибуты цвета, размера, веса и функцию перемещения. Любой объект без функционала будет бесполезным. В ООП программист использует объекты; каждый объект имеет некоторые атрибуты и функции. В целом программирование сводится к построению модулей с помощью объектов.

Простое определение объектно-ориентированного программирования:

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

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

Основы ООП в PHP помогают разработать более простой в обслуживании и управлении код. Чем более чистым и читаемым является код, тем больше шансов многократно использовать его. В результате к системе могут быть применены шаблоны проектирования. В ООП модули создаются и используются в соответствии с требованиями. С помощью объектно-ориентированного программирования на PHP мы можем создавать приложения для сайтов, которые имеют модульную структуру.

Важные термины руководства по ООП на PHP:

Ниже приводится общее определение некоторых важных терминов, которые часто используются в объектно-ориентированном PHP .

Класс

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

Объект

Объект также известен как экземпляр. Когда устанавливается экземпляр класса, создается объект. Если класс — это образец, то объект — это конечное изделие, созданное с помощью образца. После того, как класс был определен, из него может быть создано множество объектов.

Переменная-член

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

Функция-член

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

Конструктор

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

Деструктор

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

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

В PHP 5 ООП наследование – это процесс, при котором класс (подкласс ) получает все атрибуты и функции другого класса (суперкласса).

Суперкласс

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

Подкласс

Дочерний или производный класс, подкласс наследуется от суперкласса.

Полиморфизм

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

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

Одна из важнейших концепций объектно-ориентированного программирования. Данные и функции, которые работают с этими данными, связываются между собой и не видны другим функциям.

Абстракция

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

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

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

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

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

До этого объект был кучей дерева, кирпича, цемента и т.д., из которых в соответствии с информацией из плана был построен дом или объект:

Класс в PHP ООП — это план или шаблон, по которому устанавливается экземпляр класса, создается объект. После того, как был создан класс, мы можем создать столько объектов, сколько захотим. На рисунке, приведенном выше, из одного класса (плана ) были созданы пять объектов (домов ). Объект всегда будет соответствовать инструкциям, приведенным в классе, используемом для его создания.

Преимущества ООП на PHP:

  1. Улучшение архитектуры и более чистый код

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

  1. Повторное использование

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

  1. Простота в обслуживании и обновлении

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

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

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

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

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