Руководство по ООП на PHP

Оглавление (нажмите, чтобы открыть):

Руководство по ООП на PHP

Освойте бесплатно наиболее простой, быстрый и гибкий способ создавать адаптивные веб-сайты.

Дизайн лендинга

Создавайте дизайн любых сайтов — для себя и на заказ!

Популярное

  • Главная
  • ->
  • Материалы
  • ->
  • Объектно-ориентированный подход в PHP для начинающих. Часть 1

Reg.ru: домены и хостинг

Крупнейший регистратор и хостинг-провайдер в России.

Более 2 миллионов доменных имен на обслуживании.

Продвижение, почта для домена, решения для бизнеса.

Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Бесплатный Курс «Практика HTML5 и CSS3»

Освойте бесплатно пошаговый видеокурс

по основам адаптивной верстки

на HTML5 и CSS3 с полного нуля.

Фреймворк Bootstrap: быстрая адаптивная вёрстка

Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.

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

Верстайте на заказ и получайте деньги.

Что нужно знать для создания PHP-сайтов?

Ответ здесь. Только самое важное и полезное для начинающего веб-разработчика.

Узнайте, как создавать качественные сайты на PHP всего за 2 часа и 27 минут!

Создайте свой сайт за 3 часа и 30 минут.

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

Вам останется лишь наполнить его нужной информацией и изменить дизайн (по желанию).

Изучите основы HTML и CSS менее чем за 4 часа.

После просмотра данного видеокурса Вы перестанете с ужасом смотреть на HTML-код и будете понимать, как он работает.

Вы сможете создать свои первые HTML-страницы и придать им нужный вид с помощью CSS.

Бесплатный курс «Сайт на WordPress»

Хотите освоить CMS WordPress?

Получите уроки по дизайну и верстке сайта на WordPress.

Научитесь работать с темами и нарезать макет.

Бесплатный видеокурс по рисованию дизайна сайта, его верстке и установке на CMS WordPress!

Хотите изучить JavaScript, но не знаете, как подступиться?

После прохождения видеокурса Вы освоите базовые моменты работы с JavaScript.

Развеются мифы о сложности работы с этим языком, и Вы будете готовы изучать JavaScript на более серьезном уровне.

*Наведите курсор мыши для приостановки прокрутки.

Объектно-ориентированный подход в PHP для начинающих. Часть 1

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

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

Именно это позволяет писать более компактный и эффективный код.

Понимание Объектно-Ориентированного Программирования (ООП)

ООП — это стиль написания кода, который позволяет разработчикам группировать сходные задачи в классы. Это помогает коду соответствовать так называемому принципу DRY (Don’t Repeat Yourself — Не повторяйте сами себя) и быть легким с точки зрения модификации и доработки.

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

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

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

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

Понимание Объектов и Классов

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

Понимание отличия объектов от классов

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

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

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

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

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

Структура Класса

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

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

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

Создайте новый php-файл с произвольным именем и посмотрите, как это работает, воспользовавшись следующим блоком кода:

Обратитесь к созданному Вами файлу, и на экране должна появиться следующая строка:

Отлично. Ваш первый простейший скрипт а-ля «Hello, World» готов. Но пользы от него совершенно никакой, поэтому двигаемся дальше.

Объявление Свойств Класса

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

Для того, чтобы добавить свойство в класс MyClass, внесите следующий код в скрипт:

Ключевое слово public определяет так называемую «область видимости» свойства. Об этом мы поговорим позже в процессе изучение основ объектно-ориентированного программирования. Далее свойству дается имя, при этом используется стандартный синтаксис PHP и ему (свойству) присваивается значение (надо заметить, что свойствам в классе не обязательно иметь начальное значение).

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

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

Знак «->» является специальной конструкцией, которая позволяет получить доступ к свойствам или методам данного объекта.

Измените скрипт, чтобы получить значение свойства, таким образом:

Обновите страницу и Вы получите следующий результат:

Объявление Методов Класса

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

К примеру, для создания методов, которые будут задавать и получать значение свойства $prop1, нужно изменить код таким образом:

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

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

Получим значение свойства с помощью метода getProperty(), затем изменим его с помощью метода setProperty() и снова получим значение уже измененного свойства:

Обновите страницу в браузере и Вы увидите две строки:

«Мощь ООП становится очевидной при использовании нескольких экземпляров одного и того же класса.»

Обновите страницу и Вы увидите следующий результат:

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

По материалам net.tutsplus.com
Перевод — Дмитрий Науменко.

P.S. Хотите двигаться дальше в освоении PHP и ООП? Обратите внимание на премиум-уроки по различным аспектам сайтостроения, включая программирование на PHP, а также на бесплатный курс по созданию своей CMS-системы на PHP с нуля с использованием ООП:

Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!

Учебник ООП на PHP с упражнениями и примерами, а не просто конспект лекций. Где такой достать?

21.10.2012, 18:56

Хороший учебник с примерами по PHP
Посоветуйте где скачать хороший учебник с примерами плз.

Романов Е.Л. Информатика и программирование. Язык Си. (конспект лекций). НГТУ. ВОПРОСЫ БЕЗ ОТВЕТОВ!
Добрый день! Есть ли у кого ответы на «вопросы без ответов» которые даны в учебнике (Романов.

ооп класс лекций
Всем привет, возник вопрос, как реализовать набор дочерних тематических блоков(3 пункт в задании).

Электронный учебник с geogebra примерами
Всем добрый день! У меня есть электронный учебник с примерами,построенными в старой версии.

21.10.2012, 19:15 2 21.10.2012, 19:32 [ТС] 3 22.10.2012, 01:18 4
22.10.2012, 01:18
22.10.2012, 01:23 [ТС] 5
22.10.2012, 02:35 6

так в чем проблема? DrobyshevAlex написал вам в принципе не сложный пример который вы могли бы реализовать

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

22.10.2012, 09:28 7
22.10.2012, 09:36 8

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

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

Вот когда прочтёшь любую книгу по ООП, начнёшь хоть немного понимать что это такое, и будет получатся делать что то, тогда можно ещё что то почитать, другую книжку.

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

ООП в PHP: продвинутый курс

Изучаем объектно-ориентированное программирование

Что Вы получите в продвинутом курсе ООП в PHP

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

В ходе курса вы ознакомитесь с принципами ООП. Узнаете что такое классы и объекты. Далее мы изучим такие понятия как инкапсуляция, наследование и полиморфизм – это три кита, на которых стоит всё ООП.

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

Разумеется, что это за продвинутый курс, если в нём не будет уроков о работе с базой данных. Здесь вы узнаете, как правильно работать с MySQL, используя технологию ORM и паттерн ActiveRecord.

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

Отзывы учеников

Сертификат

Преимущества

Проверка домашек

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

Быстрая помощь

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

Честная цена

Не, ну Вы видели эти цены на курсы в десятки тысяч рублей?
У меня Вы пройдёте обучение по цене, сравнимой с покупкой книги.

Гарантия

Если Вас что-то не устроит — просто напишите мне любым удобным способом. И я верну Вам деньги в тот же день.

Об авторе курса

Привет! Меня зовут Артём Ивашкевич. Я работаю веб-разработчиком более трёх лет. Сейчас я работаю в компании Зарплата.ру — это крупный проект, над которым трудятся более 50 разработчиков, его ежемесячная посещаемость более 4 млн человек.

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

Привет! Меня зовут Артём Ивашкевич. Я работаю веб-разработчиком более двух с половиной лет. Сейчас я работаю в компании Зарплата.ру — это крупный проект, над которым трудятся более 50 разработчиков, его ежемесячная посещаемость более 4 млн человек.

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

Программа курса

Уровень 1. Основы ООП

  • 1. Классы и объекты в PHP как основа ООП
  • 2. Инкапсуляция в PHP
  • 3. Наследование в PHP
  • 4. Интерфейсы в PHP
  • 5. Трейты в PHP
  • 6. Полиморфизм в PHP
  • 7. Изучаем абстрактные классы в PHP
  • 8. Статические методы и свойства в PHP
  • 9. Объектно-ориентированный подход в PHP

Уровень 2. Архитектура приложения

  • 10. Неймспейсы и автозагрузка в PHP
  • 11. Архитектура MVC — Model, View, Controller
  • 12. Controller в MVC
  • 13. Фронт-контроллер и роутинг в PHP
  • 14. View в MVC
  • 15. Создаём базу данных для будущего блога
  • 16. Класс для работы с базой данных
  • 17. Делаем вывод статей на сайте из базы данных
  • 18. ORM — Object Relational Mapping
  • 19. Реализуем Active Record в PHP
  • 20. Паттерн Singleton в PHP
  • 21. PHP Reflection API
  • 22. Обновление с помощью Active Record
  • 23. Вставка с помощью Active Record
  • 24. Удаление в Active Record
  • 25. CRUD-операции
  • 26. M в MVC
  • 27. Работа с исключениями в PHP

Уровень 3. Пишем блог на PHP

  • 28. Пишем регистрацию на сайте на PHP
  • 29. Система активации пользователей по email на PHP
  • 30. Пишем систему авторизации на PHP
  • 31. Добавляем статьи в блог на PHP
  • 32. Редактируем статьи в блоге на PHP
  • 33. Задание для самостоятельной работы – доводим блог до ума
  • 34. Пишем свой фреймворк на PHP

Уровень 4. Заключение

Для чего нужен продвинутый курс ООП в PHP

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

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

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

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

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

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

Какие возможности получают ученики после курсов?

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

Продвинутый курс PHP предназначен для тех, кто имеет знания основного курса и стремится к повышению своего профессионализма в разработке до уровня junior PHP developer. Кроме того, обучение позволит приобрести необходимые навыки работы в команде.

Объектно ориентированное программирование для чайников php. Важные термины руководства по ООП на PHP. Понимание объекты и классы

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

Существует множество различных, простых примеров, в которых приводится принцип работы ООП. Сегодня я решил показать вам, как работает ООП (Объектно-ориентированное, или объектное, программирование) в реальной жизни; особенно данный пример пригодится начинающим программистам. Создав класс под MYSQL CRUD (CRUD -англ. create read update delete — «Создание чтение обновление удаление»), вы сможете легко создавать, читать, обновлять и удалять записи в любых ваших проектах, независимо от того, как спроектирована база данных.

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

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

Class Database < public function connect() < >public function disconnect() < >public function select() < >public function insert() < >public function delete() < >public function update() < >>

Функция connect()

Эта функция будет довольно простой, но прежде чем писать функцию, нам потребуется определить несколько переменных. Переменные должны быть доступны только в пределах класса, поэтому перед каждой переменной стоит ключевое слово private (закрытый). Все переменные (хост, имя пользователя, пароль, имя база данных) используются для соединения с базой данных MySQL. После этого мы сможем создать простой MySQL запрос к базе данных. Конечно, как программисты, мы должны ожидать от пользователей все что угодно, и исходя из этого, нам необходимо принять определенные меры предосторожности. Мы можем проверить: если пользователь уже подключен к базе данных, то, соответственно, ему не нужно повторно подключаться к БД. В противном случае, мы можем использовать учетные данные пользователя для подключения.

Private db_host = ‘’; private db_user = ‘’; private db_pass = ‘’; private db_name = ‘’; /* * Соединяемся с бд, разрешено только одно соединение */ public function connect() < if(!$this->con) < $myconn = @mysql_connect($this->db_host,$this->db_user,$this->db_pass); if($myconn) < $seldb = @mysql_select_db($this->db_name,$myconn); if($seldb) < $this->con = true; return true; > else < return false; >> else < return false; >> else < return true; >>

Как видите выше, мы используем базовые функции MySQL и делаем небольшую проверку на ошибки, чтобы все шло по плану. Если пользователь подключился к БД, мы возвращаем true , в ином случае возвращаем false. В качестве дополнительного бонуса устанавливаем переменную (con) в true, если соединение установлено.

Общедоступная (public) функция disconnect()

Функция проверяет переменную соединения на существование. Если соединение установлено (con есть), то закрываем соединение с БД MySQL и возвращаем true . Иначе делать ничего не нужно.

Public function disconnect() < if($this->con) < if(@mysql_close()) < $this->con = false; return true; > else < return false; >> >

Общедоступная (public) функция select()

Переходим к той части, где все немного усложняется. Мы начинаем работать с аргументами пользователя и возвращаем результаты запроса. У нас нет необходимости использовать результаты прямо сейчас, но нам необходимо создать переменную, в которой мы будем хранить пользовательские результаты по запросам из БД. Кроме того мы также создадим новую функцию, которая будет проверять существует ли данная таблица в БД. Эта функция будет создана отдельно, так как все наши CRUD операции потребуют такой проверки. Таким образом, это немного очистит наш код и в дальнейшем будет способствовать оптимизации кода. Ниже приведена функция для проверки таблиц (tableExists) и общедоступная переменная с результатами запросов.

Private $result = array(); /* * Проверяем наличие таблицы при выполнении запроса * */ private function tableExists($table) < $tablesInDb = @mysql_query("SHOW TABLES FROM ".$this->db_name.» LIKE «».$table.»»»); if($tablesInDb) < if(mysql_num_rows($tablesInDb)==1) < return true; >else < return false; >> >

Эта функция просто проверяет наличие нужной таблицы в БД. Если таблица существует, вернет true , иначе вернет false .

/* * Выборка информации из бд * Требуется: table (наименование таблицы) * Опционально: rows (требуемые колонки, разделитель запятая) * where (колонка = значение, передаем строкой) * order (сортировка, передаем строкой) */ public function select($table, $rows = «*», $where = null, $order = null) < $q = "SELECT ".$rows." FROM ".$table; if($where != null) $q .= " WHERE ".$where; if($order != null) $q .= " ORDER BY ".$order; if($this->tableExists($table)) < $query = @mysql_query($q); if($query) < $this->numResults = mysql_num_rows($query); for($i = 0; $i numResults; $i++) < $r = mysql_fetch_array($query); $key = array_keys($r); for($x = 0; $x 1) $this->result[$i][$key[$x]] = $r[$key[$x]]; else if(mysql_num_rows($query) result = null; else $this->result[$key[$x]] = $r[$key[$x]]; > > > return true; > else < return false; >> else return false; >

На первый взгляд выглядит устрашающе, но при этом здесь мы делаем целую кучу важных вещей. Функция принимает четыре аргумента, один из которых обязательный. Функция вернет результат при наличии единственного аргумента — имени таблицы. Однако вы можете расширить количество аргументов и добавить новые аргументы, которые вы сможете использовать при работе с БД; ведь корректное исполнение функции зависит от одного аргумента – имени таблицы. Код в пределах функции служит для компиляции всех аргументов в select запрос. Как только запрос будет составлен, понадобится проверка на наличие в БД нужной таблицы – для этого используется функция tableExists . Если таблица найдена, то функция будет продолжена и запрос будет отправлен. Иначе все застопорится.

В следующей секции приведен действительно магический код. Суть в следующем: собрать данные запрошенные из таблицы. Затем присваиваем наш результат переменной. Чтобы упростить результат для конечного пользователя вместо числовых ключей будем использовать имена столбцов. В случае если количество строк таблицы больше единицы, на выходе вы получите двумерный массив, в котором первый ключ — это число (инкремент), второй ключ — это название колонки. Если в таблице всего одна строка, будет возвращен одномерный массив, название ключей которого соответствует именам столбцов таблицы. Если строк в таблице не найдено, переменной result будет присвоено значение null . Как я сказал ранее, все выглядит немного запутанным, но стоит вам разбить код на отдельные секции все станет гораздо проще и понятнее.

Общедоступная (public) функция insert()

Эта функция немного проще, чем предыдущие. Она просто позволяет вставить информацию в БД. Таким образом, помимо имени таблицы нам потребуются дополнительные аргументы. Нам потребуется переменная, которая будет содержать соответствующие для вставки в таблицу значения. Затем мы просто отделим каждое значение запятой. Также мы проверяем при помощи функции tableExists наличие нужной таблицы и составляем insert запрос, манипулируя аргументами, переданными в функцию insert() . Затем отправляем наш запрос по нужному адресу.

/* * Вставляем значения в таблицу * Требуемые: table (наименование таблицы) * values (вставляемые значения, передается массив значений, например, * array(3,»Name 4″,»[email protected]»);) * Опционально: * rows (название столбцов, куда вставляем значения, передается строкой, * например, «title,meta,date» * */ public function insert($table,$values,$rows = null) < if($this->tableExists($table)) < $insert = "INSERT INTO ".$table; if($rows != null) < $insert .= " (".$rows.")"; >for($i = 0; $i tableExists($table)) < if($where == null) < $delete = "DELETE ".$table; >else < $delete = "DELETE FROM ".$table." WHERE ".$where; >$del = @mysql_query($delete); if($del) < return true; >else < return false; >> else < return false; >>

Наконец перейдем к нашей последней основной функции. Эта функция служит для обновления строки в БД новой информацией. Данная функция на первый взгляд сложна для понимания, однако, это не совсем так. Мы будем использовать все те же принципы, что и раньше. Например, аргументы будут использоваться для составления запроса update . Также мы проверим наличие таблицы при помощи метода tableExists . Если таблица существует, обновим надлежащую строку. Самая сложная часть, конечно, та, где мы занимаемся составлением запроса update . Поскольку оператор update имеет правило за раз обновлять все строки, нам необходимо учесть это и правильно отрегулировать этот момент. Итак, я решил условие where передавать как простой массив. Первый аргумент в этом массиве — имя столбца, следующий аргумент значений столбца. Таким образом, каждый четный номер (включай 0) соответствует имени колонки, а каждый нечетный номер содержит нечетное значение. Соответствующий код приведен ниже:

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

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

Использование

Итак, мы создали наш класс, но как его использовать? Тут все просто. Давайте начнем с создания простой БД, в которой протестируем наш класс. Я создал базу данных test и составил простой mysql оператор. Вы можете поместить его в любую БД.

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

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

connect(); $db->select(«mysqlcrud»); $res = $db->getResult(); print_r($res); ?>

Если все сделано корректно, вы увидите следующие:

Аналогичным образом мы можем запустить запрос на обновление и вывести результаты.

update(«mysqlcrud»,array(«name»=>»Changed!»),array(» >update(«mysqlcrud»,array(«name»=>»Changed2!»),array(» >getResult(); print_r($res); ?>

Теперь просто вставим запись:

insert(«mysqlcrud»,array(3,»Name 4″,»[email protected]»)); $res = $db->getResult(); print_r($res); ?>

11 марта 2010 в 11:37

ООП с примерами (часть 1)

  • Учебный процесс в IT

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

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

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

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

Класс

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

Класс – это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт).

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

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

В нашем случае, класс будет отображать сущность – автомобиль. Атрибутами класса будут являться двигатель, подвеска, кузов, четыре колеса и т.д. Методами класса будет «открыть дверь», «нажать на педаль газа», а также «закачать порцию бензина из бензобака в двигатель». Первые два метода доступны для выполнения другим классам (в частности, классу «Водитель»). Последний описывает взаимодействия внутри класса и не доступен пользователю.

В дальнейшем, несмотря на то, что слово «пользователь» ассоциируется с пасьянсом «Косынка» и «Microsoft Word», мы будем называть пользователями тех программистов, которые используют ваш класс, включая вас самих. Человека, который является автором класса, мы будем называть разработчиком.

Объект

Объект (экземпляр) – это отдельный представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом.

Говоря простым языком, объект имеет конкретные значения атрибутов и методы, работающие с этими значениями на основе правил, заданных в классе. В данном примере, если класс – это некоторый абстрактный автомобиль из «мира идей», то объект – это конкретный автомобиль, стоящий у вас под окнами.

Интерфейс

Интерфейс – это набор методов класса, доступных для использования другими классами.

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

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

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

16 апреля 2008 в 12:15

PHP — ООП или процедурный подход

PHP один из самых популярных скриптовых языков программирования. Почти 60% веб серверов используют PHP.Миллионы веб-сайтов и веб-приложений разрабатываются на PHP каждый месяц.

PHP изначально разрабатывался как простая замена языку Perl, и уже спустя пару лет он стал чрезвычайно мощным и популярным. Язык PHP, сам по себе очень похож на ANSI C.
Одна из причин почему PHP стал таким популярным это его короткий период обучения.

Изучение PHP абсолютно не тяжёлое занятие, особенно если вы хорошо знакомы с синтаксисом Java или C.

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

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

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

PHP позволяет нам писать приложения 2мя разными способами, первый — процедурный, а второй объектно ориентированный. Если вы до сих пор не поняли разницу между этими двумя подходами, давайте посмотрим на эти куски кода — один и тот же пример написанный разными подходами.

$user_input = $_POST[‘field‘];
$filtered_content = filter($user_input); //user input filtering
mysql_connect(«dbhost»,«dbuser»,«dbpassword»); //database
mysql_select_db(«dbname»);
$sql = «some query»;
$result = mysql_query($sql);
while ($data = mysql_fetch_assoc())
<
process ($data);
>
process_user_input($filtered_content);

А вот тот же кусок кода с использованием ООП:

$input_filter = new filter();
$input_filter->filter_user_input(); //filter the user inputs
$db = new dal(«mysql»); //data access layer
$db->connect($dbconfig);//we wre using mysql
$result = $db->execute($sql);
ReportGenerator::makereport($result); //process data
$model = new Postmodel($filter->get_filtered_content());
$model->insert();

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

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

Исходя из изложенного выше, можно вынести преимущества использования ООП:

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

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

* Повторное использование : Объект это логический объект у которого есть комплект свойств и методов и он может взаимодействовать с другими объектами.. Объект может быть абсолютно независимым или может зависеть от других объектов. Объект обычно создают для решения специфических поставленных проблем. Следовательно когда другие разработчики сталкиваются с похожими проблемами, они могут подключить ваш класс к своему проекту и использовать его не боясь что он нарушит процесс их разработки. Это позволяет избежать DRY, что расшифровывается как Don’t Repeat Yourself (не повторяйся). В процедурном или модульном программировании, повторное использование возможно только в совокупности.

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

* Расширяемость : Если вам необходимо расширять функциональность вашего проекта, вы можете достичь лучших результатов при помощи ООП. Одна из основных функциональностей ООП это расширяемость. Вы можете использовать рефакторинг объектов что бы добавить функциональность. Работая над этим, вы по прежнему можете сохранить
прежнюю совместимость объекта — следовательно вы можете прекрасно работать и с прежним кодом. Или же вы можете расширить объект и создать абсолютно новый, который будет содержать все необходимые свойства и методы родительского объекта от которого происходит новый, а потом уже добавить в него новые функции. Это называется “наследование” и это очень важная возможность ООП.

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

* Эффективность : Идея ООП в действительности была разработана для повышения эффективности и облегчения процесса разработки. Несколько шаблонов проектирования разработаны что бы создавать более эффективный и хороший код.
Более того в ООП вы можете вы можете размышлять над вашими решениями в более удобной форме чем в процедурном подходе. Поскольку вы разбиваете вашу проблему на несколько маленьких проблем и вы находите решение для каждой из них отдельно, большая проблема решается сама по себе.

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

От автора: современное профессиональное программирование просто немыслимо, без объектно-ориентированного программирования, которое не гласно стало своеобразным стандартом высокоуровневых языков программирования и, конечно же, 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();

public function __construct ($ name , $ orders ) <

$ this -> name = $ name ;

$ this -> orders = $ orders ;

public function getName () <

return $ this -> name ;

$ customer = new Customer («Ben» , array (» > 10 ) ) ;

echo $ customer -> getName () ;

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

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

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

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

$ customer2 = new Customer («Sem» , array (» > 15 ) ) ;

echo $ customer2 -> getName () ;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Три кита ООП

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

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

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

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

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

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

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

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

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

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

Содержание

User Contributed Notes 1 note

PHP 5 is very very flexible in accessing member variables and member functions. These access methods maybe look unusual and unnecessary at first glance; but they are very useful sometimes; specially when you work with SimpleXML classes and objects. I have posted a similar comment in SimpleXML function reference section, but this one is more comprehensive.

I use the following class as reference for all examples:

class Foo <
public $aMemberVar = ‘aMemberVar Member Variable’ ;
public $aFuncName = ‘aMemberFunc’ ;

function aMemberFunc () <
print ‘Inside `aMemberFunc()`’ ;
>
>

$foo = new Foo ;
?>

You can access member variables in an object using another variable as name:

= ‘aMemberVar’ ;
print $foo -> $element ; // prints «aMemberVar Member Variable»
?>

or use functions:

print $foo ->< getVarName ()>; // prints «aMemberVar Member Variable»
?>

Important Note: You must surround function name with < and >or PHP would think you are calling a member function of object «foo».

you can use a constant or literal as well:

( MY_CONSTANT , ‘aMemberVar’ );
print $foo ->< MY_CONSTANT >; // Prints «aMemberVar Member Variable»
print $foo ->< 'aMemberVar' >; // Prints «aMemberVar Member Variable»
?>

You can use members of other objects as well:

print $foo -> < $otherObj ->var >;
print $foo -> < $otherObj ->func ()>;
?>

You can use mathods above to access member functions as well:

print $foo ->< 'aMemberFunc' >(); // Prints «Inside `aMemberFunc()`»
print $foo -> < $foo ->aFuncName >(); // Prints «Inside `aMemberFunc()`»
?>

Php oop примеры. Основы объектно-ориентированного программирования на PHP

Мы рассмотрим такие понятия, как объектно-ориентированное программирование, классы 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. Простота в обслуживании и обновлении

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

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

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

PHP один из самых популярных скриптовых языков программирования. Почти 60% веб серверов используют PHP.Миллионы веб-сайтов и веб-приложений разрабатываются на PHP каждый месяц.

PHP изначально разрабатывался как простая замена языку Perl, и уже спустя пару лет он стал чрезвычайно мощным и популярным. Язык PHP, сам по себе очень похож на ANSI C.
Одна из причин почему PHP стал таким популярным это его короткий период обучения.

Изучение PHP абсолютно не тяжёлое занятие, особенно если вы хорошо знакомы с синтаксисом Java или C.

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

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

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

PHP позволяет нам писать приложения 2мя разными способами, первый — процедурный, а второй объектно ориентированный. Если вы до сих пор не поняли разницу между этими двумя подходами, давайте посмотрим на эти куски кода — один и тот же пример написанный разными подходами.

$user_input = $_POST[‘field‘];
$filtered_content = filter($user_input); //user input filtering
mysql_connect(«dbhost»,«dbuser»,«dbpassword»); //database
mysql_select_db(«dbname»);
$sql = «some query»;
$result = mysql_query($sql);
while ($data = mysql_fetch_assoc())
<
process ($data);
>
process_user_input($filtered_content);

А вот тот же кусок кода с использованием ООП:

$input_filter = new filter();
$input_filter->filter_user_input(); //filter the user inputs
$db = new dal(«mysql»); //data access layer
$db->connect($dbconfig);//we wre using mysql
$result = $db->execute($sql);
ReportGenerator::makereport($result); //process data
$model = new Postmodel($filter->get_filtered_content());
$model->insert();

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

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

Исходя из изложенного выше, можно вынести преимущества использования ООП:

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

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

* Повторное использование : Объект это логический объект у которого есть комплект свойств и методов и он может взаимодействовать с другими объектами.. Объект может быть абсолютно независимым или может зависеть от других объектов. Объект обычно создают для решения специфических поставленных проблем. Следовательно когда другие разработчики сталкиваются с похожими проблемами, они могут подключить ваш класс к своему проекту и использовать его не боясь что он нарушит процесс их разработки. Это позволяет избежать DRY, что расшифровывается как Don’t Repeat Yourself (не повторяйся). В процедурном или модульном программировании, повторное использование возможно только в совокупности.

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

* Расширяемость : Если вам необходимо расширять функциональность вашего проекта, вы можете достичь лучших результатов при помощи ООП. Одна из основных функциональностей ООП это расширяемость. Вы можете использовать рефакторинг объектов что бы добавить функциональность. Работая над этим, вы по прежнему можете сохранить
прежнюю совместимость объекта — следовательно вы можете прекрасно работать и с прежним кодом. Или же вы можете расширить объект и создать абсолютно новый, который будет содержать все необходимые свойства и методы родительского объекта от которого происходит новый, а потом уже добавить в него новые функции. Это называется “наследование” и это очень важная возможность ООП.

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

* Эффективность : Идея ООП в действительности была разработана для повышения эффективности и облегчения процесса разработки. Несколько шаблонов проектирования разработаны что бы создавать более эффективный и хороший код.
Более того в ООП вы можете вы можете размышлять над вашими решениями в более удобной форме чем в процедурном подходе. Поскольку вы разбиваете вашу проблему на несколько маленьких проблем и вы находите решение для каждой из них отдельно, большая проблема решается сама по себе.

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

В этом уроке вы ознакомитесь с основами объектно-ориентированного программирования в PHP. Вы узнаете о принципах ООП вообще и научитесь писать простенькие скрипты на PHP.

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

В этом уроке я начну вводить вас в курс дела и расскажу вам об основных понятиях ООП. Вы узнаете:

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

Вы готовы погрузиться в мир объектов PHP? Тогда вперед!

Что такое объектно-ориентированное программирование?

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

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

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

Зачем использовать ООП?

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

Однако, вот некоторые преимущества ООП для разработчиков:

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

Некоторые основные понятия

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

Классы

Класс — это каркас для объекта. Это кусок кода, который определяет:

  • Типы данных, которые будут содержать созданные объекты класса
  • Функции, которые будут содержать эти объекты.

Когда вы создаете приложение на ООП, вы обычно будете создавать несколько классов, которые будут представлять различные типы сущностей вашего приложения. Например, для создания форума вы можете создать классы Forum, Topic, Post и Member.

Объекты

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

Для сравнения с реальными сущностями:

  • Класс — это каркас для автомобиля: он определяет, как автомобиль будет выглядеть и действовать, но это все же абстрактная сущность
  • Объект — это настоящий автомобиль, созданный из каркаса: у него есть настоящие свойства (например, скорость) и поведение (например, ускорение или торможение).

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

Переменные класса

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

Методы

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

Как создать класс в PHP?

Теперь, когда вы уже знаете, что такое классы, методы, переменные класса и объекты, пришло время создать пару классов и объектов в коде PHP.

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

К примеру, если вы создаете класс Member для вашего форума, вы напишите так:

Это достаточно просто. Естественно, класс этот ничего не сделает, пока вы не добавите в него переменные и методы. Тем не менее, приведенный выше код создает валидный класс на PHP, который можно использовать.

Правило хорошего тона: каждый класс помещайте в отдельный файл с названием, совпадающим с именем класса. Например, поместите класс Member в файл Member.php и храните его в папке, допустим, classes.

Как создавать объекты в PHP?

Создать объект можно с помощью ключевого слова new:

Этот код создаст объект класса ClassName. Вам впоследствии понадобится использовать этот объект, поэтому его нужно хранить в переменной. Например, создадим объект класса Member и сохраним его в переменной $member:

$member = new Member();

Мы также можем создать еще один объект того же класса:

$member2 = new Member();

Несмотря на то что мы создали эти два объекта от одного и того же класса, переменные $member и $member2 не зависят друг от друга.

Создаем переменные класса

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

  • Открытые переменные класса (public): доступны — т.е. их можно прочитать и/или изменять — в любом месте скрипта, независимо от того, где находится этот код — внутри класса или за его пределами
  • Частные переменные класса (private): доступны только методам класса. Лучше всего делать переменные класса именно частными, чтобы отделить объекты от остальной части кода.
  • Защищенные переменные класса (protected): доступны методам собственного класса, а также методам наследуемых классов (мы поговорим о наследовании позже).

Чтобы создать переменную класса, напишите ключевое слово public, private или protected, а затем введите имя переменной:

Давайте добавим переменную класса public нашему классу Member для хранения имени пользователя:

Обратите внимание на то, что мы инициализировали нашу переменную класса, его значение — пустая строка, “”. Это значит, что при создании нового пользователя значение его имени по умолчанию будет равняться пустой строке. Так же, как и в случае с обычными переменными в PHP, переменные класса не обязательно инициализировать, но лучше все-таки не лениться. Если вы не инициализируете переменную класса, то по умолчанию ее значение равно null.

Доступ к переменным класса

Для получения доступа к переменной того или иного объекта используется оператор ->:

Давайте попробуем. Напишем скрипт, который объявляет класс Member и переменную класса, создает объект этого класса, а затем задает значение переменной класса и выводит его на экран:

username = «Fred»; echo $member->username; // Выведет «Fred» ?>

Запустите данный код, он выведет на экран строку “Fred”, значение переменной класса $member->username. Как видите, вы оперируете переменной объекта так же, как обычной переменной — вы можете задать ей значение и прочитать его.

Добавление методов в класс

Что скажете насчет создания методов? Как я ранее упоминал, методы — это обычные функции, являющиеся частью класса. Так что вы, возможно, не удивитесь тому, что и создаются они с помощью того же ключевого слова function. Единственное отличие от создания обычных функций заключается в том, что вы также можете добавить один из идентификаторов доступа (public, private, protected) в ее объявлении. В этом методы схожи с переменными класса:

Class ClassName < public function methodName() < // (код) >private function methodName() < // (код) >protected function methodName() < // (код) >>

На заметку: так же, как и в случае с переменными класса, методы public могут быть вызваны откуда угодно, методы private могут вызываться только в пределах класса, а методы protected — из самого класса и его наследника.

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

  • переменная класса private $loggedIn для идентификации пользователя, т.е. зашел он или нет,
  • метод login(), который будет осуществлять вход на форум, устанавливая значение переменной класса $loggedIn в true,
  • метод logout(), который будет осуществлять выход из форума, устанавливая значение переменной класса $loggedIn в false,
  • метод isLoggedIn(), который будет возвращать значение переменной класса $loggedIn.

loggedIn = true; > public function logout() < $this->loggedIn = false; > public function isLoggedIn() < return $this->loggedIn; > > ?>

Вы наверное заметили, что мы использовали новое ключевое слово $this. В контексте методов объекта специальная переменная $this ссылается на сам объект. Используя $this в методе объекта, метод может получить доступ к любой переменной класса и методу объекта.

Например, метод login() может получить доступ к переменной класса $loggedIn объекта через $this->loggedIn.

Кстати, наша переменная класса — частная (private), поэтому ее нельзя вызывать из любой части скрипта, а только из методов login(), logout() и isLoggedIn(). Это хороший подход, так как внутренняя часть объекта (например, то, как именно записывается, авторизовался ли пользователь или нет) находится отдельно от остального кода. По возможности старайтесь использовать именно переменные класса private, чтобы ваши объекты были автономными, мобильными и защищенными.

На заметку: переменная класса $username в нашем примере — public. Я это сделал только для того, чтобы продемонстрировать, как можно получать доступ к переменным класса объекта. В реальных проектах скорее нужно сделать эту переменную частной и создать специальные переменные класса public для задания значений имени пользователя, если это необходимо.

Использование методов

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

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

loggedIn = true; > public function logout() < $this->loggedIn = false; > public function isLoggedIn() < return $this->loggedIn; > > $member = new Member(); $member->username = «Fred»; echo $member->username . » is » . ($member->
«; $member->login(); echo $member->username . » is » . ($member->isLoggedIn() ? «logged in» : «logged out») . «
«; $member->logout(); echo $member->username . » is » . ($member->isLoggedIn() ? «logged in» : «logged out») . «
«; ?>

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

Fred is logged out Fred is logged in Fred is logged out

Вот, как он работает:

  1. После описания класса Member мы создали его объект и сохранили в переменной $member. Также мы дали переменной класса $username данного объекта значение “Fred”.
  2. Затем мы вызвали метод $member->isLoggedIn() для того, чтобы определить, залогинился ли пользователь или нет. Данный метод просто-напросто возвращает значение переменной класса $loggedIn. Так как значение по умолчанию этой переменной класса — false, значит результатом вызова $member->isLoggedIn() будет ложь, поэтому отобразится сообщение «Fred is logged out».
  3. Затем вызовем метод login(). Он установит в true значение переменной класса $loggedIn.
  4. Теперь, при вызове метода $member->isLoggedIn() вернется истина, и выведется сообщение «Fred is logged in».
  5. Вызовем метод logout(), который устанавливает в false значение свойства $loggedIn.
  6. В третий раз вызовем метод $member->isLoggedIn(). Сейчас он вернет false, потому что значение свойства $loggedIn опять установлено в ложь. Так, снова выведется сообщение «Fred is logged out».

На заметку: на случай, если вы в первые увидели такое: . — это тернарный оператор. Это упрощенная версия блоков if … else. Узнать о такого рода операторах можно .

Выводы

В этом уроке вы познакомились с основами ООП в PHP. Вы узнали о таких вещах, как:

  • что такое ООП и почему его полезно применять
  • понятия классов, объектов, переменных класса и методов
  • как создавать классы и объекты
  • как создавать и использовать переменные классов
  • понятия идентификаторов доступа public, private, protected
  • как создавать и применять методы классов

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

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

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

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

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

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

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

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

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

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

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

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

Три кита ООП

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

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

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

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

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

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

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

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

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

Объектно ориентированное программирование для чайников php. Важные термины руководства по ООП на PHP. Понимание объекты и классы

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

Существует множество различных, простых примеров, в которых приводится принцип работы ООП. Сегодня я решил показать вам, как работает ООП (Объектно-ориентированное, или объектное, программирование) в реальной жизни; особенно данный пример пригодится начинающим программистам. Создав класс под MYSQL CRUD (CRUD -англ. create read update delete — «Создание чтение обновление удаление»), вы сможете легко создавать, читать, обновлять и удалять записи в любых ваших проектах, независимо от того, как спроектирована база данных.

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

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

Class Database < public function connect() < >public function disconnect() < >public function select() < >public function insert() < >public function delete() < >public function update() < >>

Функция connect()

Эта функция будет довольно простой, но прежде чем писать функцию, нам потребуется определить несколько переменных. Переменные должны быть доступны только в пределах класса, поэтому перед каждой переменной стоит ключевое слово private (закрытый). Все переменные (хост, имя пользователя, пароль, имя база данных) используются для соединения с базой данных MySQL. После этого мы сможем создать простой MySQL запрос к базе данных. Конечно, как программисты, мы должны ожидать от пользователей все что угодно, и исходя из этого, нам необходимо принять определенные меры предосторожности. Мы можем проверить: если пользователь уже подключен к базе данных, то, соответственно, ему не нужно повторно подключаться к БД. В противном случае, мы можем использовать учетные данные пользователя для подключения.

Private db_host = ‘’; private db_user = ‘’; private db_pass = ‘’; private db_name = ‘’; /* * Соединяемся с бд, разрешено только одно соединение */ public function connect() < if(!$this->con) < $myconn = @mysql_connect($this->db_host,$this->db_user,$this->db_pass); if($myconn) < $seldb = @mysql_select_db($this->db_name,$myconn); if($seldb) < $this->con = true; return true; > else < return false; >> else < return false; >> else < return true; >>

Как видите выше, мы используем базовые функции MySQL и делаем небольшую проверку на ошибки, чтобы все шло по плану. Если пользователь подключился к БД, мы возвращаем true , в ином случае возвращаем false. В качестве дополнительного бонуса устанавливаем переменную (con) в true, если соединение установлено.

Общедоступная (public) функция disconnect()

Функция проверяет переменную соединения на существование. Если соединение установлено (con есть), то закрываем соединение с БД MySQL и возвращаем true . Иначе делать ничего не нужно.

Public function disconnect() < if($this->con) < if(@mysql_close()) < $this->con = false; return true; > else < return false; >> >

Общедоступная (public) функция select()

Переходим к той части, где все немного усложняется. Мы начинаем работать с аргументами пользователя и возвращаем результаты запроса. У нас нет необходимости использовать результаты прямо сейчас, но нам необходимо создать переменную, в которой мы будем хранить пользовательские результаты по запросам из БД. Кроме того мы также создадим новую функцию, которая будет проверять существует ли данная таблица в БД. Эта функция будет создана отдельно, так как все наши CRUD операции потребуют такой проверки. Таким образом, это немного очистит наш код и в дальнейшем будет способствовать оптимизации кода. Ниже приведена функция для проверки таблиц (tableExists) и общедоступная переменная с результатами запросов.

Private $result = array(); /* * Проверяем наличие таблицы при выполнении запроса * */ private function tableExists($table) < $tablesInDb = @mysql_query("SHOW TABLES FROM ".$this->db_name.» LIKE «».$table.»»»); if($tablesInDb) < if(mysql_num_rows($tablesInDb)==1) < return true; >else < return false; >> >

Эта функция просто проверяет наличие нужной таблицы в БД. Если таблица существует, вернет true , иначе вернет false .

/* * Выборка информации из бд * Требуется: table (наименование таблицы) * Опционально: rows (требуемые колонки, разделитель запятая) * where (колонка = значение, передаем строкой) * order (сортировка, передаем строкой) */ public function select($table, $rows = «*», $where = null, $order = null) < $q = "SELECT ".$rows." FROM ".$table; if($where != null) $q .= " WHERE ".$where; if($order != null) $q .= " ORDER BY ".$order; if($this->tableExists($table)) < $query = @mysql_query($q); if($query) < $this->numResults = mysql_num_rows($query); for($i = 0; $i numResults; $i++) < $r = mysql_fetch_array($query); $key = array_keys($r); for($x = 0; $x 1) $this->result[$i][$key[$x]] = $r[$key[$x]]; else if(mysql_num_rows($query) result = null; else $this->result[$key[$x]] = $r[$key[$x]]; > > > return true; > else < return false; >> else return false; >

На первый взгляд выглядит устрашающе, но при этом здесь мы делаем целую кучу важных вещей. Функция принимает четыре аргумента, один из которых обязательный. Функция вернет результат при наличии единственного аргумента — имени таблицы. Однако вы можете расширить количество аргументов и добавить новые аргументы, которые вы сможете использовать при работе с БД; ведь корректное исполнение функции зависит от одного аргумента – имени таблицы. Код в пределах функции служит для компиляции всех аргументов в select запрос. Как только запрос будет составлен, понадобится проверка на наличие в БД нужной таблицы – для этого используется функция tableExists . Если таблица найдена, то функция будет продолжена и запрос будет отправлен. Иначе все застопорится.

В следующей секции приведен действительно магический код. Суть в следующем: собрать данные запрошенные из таблицы. Затем присваиваем наш результат переменной. Чтобы упростить результат для конечного пользователя вместо числовых ключей будем использовать имена столбцов. В случае если количество строк таблицы больше единицы, на выходе вы получите двумерный массив, в котором первый ключ — это число (инкремент), второй ключ — это название колонки. Если в таблице всего одна строка, будет возвращен одномерный массив, название ключей которого соответствует именам столбцов таблицы. Если строк в таблице не найдено, переменной result будет присвоено значение null . Как я сказал ранее, все выглядит немного запутанным, но стоит вам разбить код на отдельные секции все станет гораздо проще и понятнее.

Общедоступная (public) функция insert()

Эта функция немного проще, чем предыдущие. Она просто позволяет вставить информацию в БД. Таким образом, помимо имени таблицы нам потребуются дополнительные аргументы. Нам потребуется переменная, которая будет содержать соответствующие для вставки в таблицу значения. Затем мы просто отделим каждое значение запятой. Также мы проверяем при помощи функции tableExists наличие нужной таблицы и составляем insert запрос, манипулируя аргументами, переданными в функцию insert() . Затем отправляем наш запрос по нужному адресу.

/* * Вставляем значения в таблицу * Требуемые: table (наименование таблицы) * values (вставляемые значения, передается массив значений, например, * array(3,»Name 4″,»[email protected]»);) * Опционально: * rows (название столбцов, куда вставляем значения, передается строкой, * например, «title,meta,date» * */ public function insert($table,$values,$rows = null) < if($this->tableExists($table)) < $insert = "INSERT INTO ".$table; if($rows != null) < $insert .= " (".$rows.")"; >for($i = 0; $i tableExists($table)) < if($where == null) < $delete = "DELETE ".$table; >else < $delete = "DELETE FROM ".$table." WHERE ".$where; >$del = @mysql_query($delete); if($del) < return true; >else < return false; >> else < return false; >>

Наконец перейдем к нашей последней основной функции. Эта функция служит для обновления строки в БД новой информацией. Данная функция на первый взгляд сложна для понимания, однако, это не совсем так. Мы будем использовать все те же принципы, что и раньше. Например, аргументы будут использоваться для составления запроса update . Также мы проверим наличие таблицы при помощи метода tableExists . Если таблица существует, обновим надлежащую строку. Самая сложная часть, конечно, та, где мы занимаемся составлением запроса update . Поскольку оператор update имеет правило за раз обновлять все строки, нам необходимо учесть это и правильно отрегулировать этот момент. Итак, я решил условие where передавать как простой массив. Первый аргумент в этом массиве — имя столбца, следующий аргумент значений столбца. Таким образом, каждый четный номер (включай 0) соответствует имени колонки, а каждый нечетный номер содержит нечетное значение. Соответствующий код приведен ниже:

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

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

Использование

Итак, мы создали наш класс, но как его использовать? Тут все просто. Давайте начнем с создания простой БД, в которой протестируем наш класс. Я создал базу данных test и составил простой mysql оператор. Вы можете поместить его в любую БД.

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

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

connect(); $db->select(«mysqlcrud»); $res = $db->getResult(); print_r($res); ?>

Если все сделано корректно, вы увидите следующие:

Аналогичным образом мы можем запустить запрос на обновление и вывести результаты.

update(«mysqlcrud»,array(«name»=>»Changed!»),array(» >update(«mysqlcrud»,array(«name»=>»Changed2!»),array(» >getResult(); print_r($res); ?>

Теперь просто вставим запись:

insert(«mysqlcrud»,array(3,»Name 4″,»[email protected]»)); $res = $db->getResult(); print_r($res); ?>

11 марта 2010 в 11:37

ООП с примерами (часть 1)

  • Учебный процесс в IT

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

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

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

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

Класс

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

Класс – это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт).

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

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

В нашем случае, класс будет отображать сущность – автомобиль. Атрибутами класса будут являться двигатель, подвеска, кузов, четыре колеса и т.д. Методами класса будет «открыть дверь», «нажать на педаль газа», а также «закачать порцию бензина из бензобака в двигатель». Первые два метода доступны для выполнения другим классам (в частности, классу «Водитель»). Последний описывает взаимодействия внутри класса и не доступен пользователю.

В дальнейшем, несмотря на то, что слово «пользователь» ассоциируется с пасьянсом «Косынка» и «Microsoft Word», мы будем называть пользователями тех программистов, которые используют ваш класс, включая вас самих. Человека, который является автором класса, мы будем называть разработчиком.

Объект

Объект (экземпляр) – это отдельный представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом.

Говоря простым языком, объект имеет конкретные значения атрибутов и методы, работающие с этими значениями на основе правил, заданных в классе. В данном примере, если класс – это некоторый абстрактный автомобиль из «мира идей», то объект – это конкретный автомобиль, стоящий у вас под окнами.

Интерфейс

Интерфейс – это набор методов класса, доступных для использования другими классами.

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

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

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

16 апреля 2008 в 12:15

PHP — ООП или процедурный подход

PHP один из самых популярных скриптовых языков программирования. Почти 60% веб серверов используют PHP.Миллионы веб-сайтов и веб-приложений разрабатываются на PHP каждый месяц.

PHP изначально разрабатывался как простая замена языку Perl, и уже спустя пару лет он стал чрезвычайно мощным и популярным. Язык PHP, сам по себе очень похож на ANSI C.
Одна из причин почему PHP стал таким популярным это его короткий период обучения.

Изучение PHP абсолютно не тяжёлое занятие, особенно если вы хорошо знакомы с синтаксисом Java или C.

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

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

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

PHP позволяет нам писать приложения 2мя разными способами, первый — процедурный, а второй объектно ориентированный. Если вы до сих пор не поняли разницу между этими двумя подходами, давайте посмотрим на эти куски кода — один и тот же пример написанный разными подходами.

$user_input = $_POST[‘field‘];
$filtered_content = filter($user_input); //user input filtering
mysql_connect(«dbhost»,«dbuser»,«dbpassword»); //database
mysql_select_db(«dbname»);
$sql = «some query»;
$result = mysql_query($sql);
while ($data = mysql_fetch_assoc())
<
process ($data);
>
process_user_input($filtered_content);

А вот тот же кусок кода с использованием ООП:

$input_filter = new filter();
$input_filter->filter_user_input(); //filter the user inputs
$db = new dal(«mysql»); //data access layer
$db->connect($dbconfig);//we wre using mysql
$result = $db->execute($sql);
ReportGenerator::makereport($result); //process data
$model = new Postmodel($filter->get_filtered_content());
$model->insert();

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

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

Исходя из изложенного выше, можно вынести преимущества использования ООП:

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

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

* Повторное использование : Объект это логический объект у которого есть комплект свойств и методов и он может взаимодействовать с другими объектами.. Объект может быть абсолютно независимым или может зависеть от других объектов. Объект обычно создают для решения специфических поставленных проблем. Следовательно когда другие разработчики сталкиваются с похожими проблемами, они могут подключить ваш класс к своему проекту и использовать его не боясь что он нарушит процесс их разработки. Это позволяет избежать DRY, что расшифровывается как Don’t Repeat Yourself (не повторяйся). В процедурном или модульном программировании, повторное использование возможно только в совокупности.

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

* Расширяемость : Если вам необходимо расширять функциональность вашего проекта, вы можете достичь лучших результатов при помощи ООП. Одна из основных функциональностей ООП это расширяемость. Вы можете использовать рефакторинг объектов что бы добавить функциональность. Работая над этим, вы по прежнему можете сохранить
прежнюю совместимость объекта — следовательно вы можете прекрасно работать и с прежним кодом. Или же вы можете расширить объект и создать абсолютно новый, который будет содержать все необходимые свойства и методы родительского объекта от которого происходит новый, а потом уже добавить в него новые функции. Это называется “наследование” и это очень важная возможность ООП.

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

* Эффективность : Идея ООП в действительности была разработана для повышения эффективности и облегчения процесса разработки. Несколько шаблонов проектирования разработаны что бы создавать более эффективный и хороший код.
Более того в ООП вы можете вы можете размышлять над вашими решениями в более удобной форме чем в процедурном подходе. Поскольку вы разбиваете вашу проблему на несколько маленьких проблем и вы находите решение для каждой из них отдельно, большая проблема решается сама по себе.

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

От автора: современное профессиональное программирование просто немыслимо, без объектно-ориентированного программирования, которое не гласно стало своеобразным стандартом высокоуровневых языков программирования и, конечно же, 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();

public function __construct ($ name , $ orders ) <

$ this -> name = $ name ;

$ this -> orders = $ orders ;

public function getName () <

return $ this -> name ;

$ customer = new Customer («Ben» , array (» > 10 ) ) ;

echo $ customer -> getName () ;

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

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

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

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

$ customer2 = new Customer («Sem» , array (» > 15 ) ) ;

echo $ customer2 -> getName () ;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Три кита ООП

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

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

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

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

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

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

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

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

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

5 книг по PHP

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

«PHP, на мой взгляд, не лучший, чтобы начинать изучать программирование. Он хороший и мощный для своих целей. Это не первый мой язык программирования, поэтому для его изучения не требовалось много усилий и книг. Я изучал PHP сперва сам, используя разнообразные сайты со справочными материалами, потом ходил на курсы, а потом опять с помощью сайтов. Использовал в основном уже мануал на php.net от создателей» — говорит Владимир Ващенко, Senior Developer в Sevmorgeo.

PHP, MySQL, JavaScript & HTML5 All-in-One For Dummies (Steve Suehring)

Для тех, кто выбрал PHP в качестве первого языка для изучения. Книга от известного издательства O’Reilly раскрывает суть ключевых веб-технологий. Здесь все, что нужно знать для начала о создании динамических веб-страниц, которые работают на MySQL. К сожалению, в примерах кода есть неточности, но неработающие примеры можно компенсировать просто погуглив.

Изучаем PHP и MySQL (Линн Бейли)

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

Learning PHP, MySQL, & JavaScript 4th Edition (Robin Nixon)
на русском 3е издание

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

Посложнее

PHP Advanced and Object-Oriented Programming: Visual QuickPro Guide (Larry Ullman)

Книга для понимания ООП в PHP. В отличии от многих «технарей» автор пишет доступно и настолько заботится о своих читателях, что лично отвечает на возникнувшие по ходу чтения вопросы на своем форуме.

PHP. Объекты, шаблоны и методики программирования (Мэт Зандстра)

Обязательна к прочтению тем, кто хочет стать профи. Книга подойдет для уровня Junior, будет полезна тем, кому надоело писать в процедурном стиле. В принципе, пригодится не только PHP программистам. Здесь очень доступно описываются подходы проектирования и разработки. Автор освещает ООП во всей его красе, а паттерны показываемые в книге позволяют «творить чудеса». Из плюшек — работа с git.

Бонус

Предметно-ориентированное проектирование (DDD) (Эрик Эванс)

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

Если вы новичок, как можно скорее беритесь за выполнение простенького проекта: сайт-визитка, небольшой интернет-магазин. По достижению «статуса» эксперта не забывайте следить за официальной документацией.

А тем, кто хочет разрабатывать на PHP профессионально, рекомендуем профессию «Программист PHP».

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

«PHP, на мой взгляд, не лучший, чтобы начинать изучать программирование. Он хороший и мощный для своих целей. Это не первый мой язык программирования, поэтому для его изучения не требовалось много усилий и книг. Я изучал PHP сперва сам, используя разнообразные сайты со справочными материалами, потом ходил на курсы, а потом опять с помощью сайтов. Использовал в основном уже мануал на php.net от создателей» — говорит Владимир Ващенко, Senior Developer в Sevmorgeo.

PHP, MySQL, JavaScript & HTML5 All-in-One For Dummies (Steve Suehring)

Для тех, кто выбрал PHP в качестве первого языка для изучения. Книга от известного издательства O’Reilly раскрывает суть ключевых веб-технологий. Здесь все, что нужно знать для начала о создании динамических веб-страниц, которые работают на MySQL. К сожалению, в примерах кода есть неточности, но неработающие примеры можно компенсировать просто погуглив.

Изучаем PHP и MySQL (Линн Бейли)

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

Learning PHP, MySQL, & JavaScript 4th Edition (Robin Nixon)
на русском 3е издание

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

Посложнее

PHP Advanced and Object-Oriented Programming: Visual QuickPro Guide (Larry Ullman)

Книга для понимания ООП в PHP. В отличии от многих «технарей» автор пишет доступно и настолько заботится о своих читателях, что лично отвечает на возникнувшие по ходу чтения вопросы на своем форуме.

PHP. Объекты, шаблоны и методики программирования (Мэт Зандстра)

Обязательна к прочтению тем, кто хочет стать профи. Книга подойдет для уровня Junior, будет полезна тем, кому надоело писать в процедурном стиле. В принципе, пригодится не только PHP программистам. Здесь очень доступно описываются подходы проектирования и разработки. Автор освещает ООП во всей его красе, а паттерны показываемые в книге позволяют «творить чудеса». Из плюшек — работа с git.

Бонус

Предметно-ориентированное проектирование (DDD) (Эрик Эванс)

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

Если вы новичок, как можно скорее беритесь за выполнение простенького проекта: сайт-визитка, небольшой интернет-магазин. По достижению «статуса» эксперта не забывайте следить за официальной документацией.

А тем, кто хочет разрабатывать на PHP профессионально, рекомендуем профессию «Программист PHP».

Объектно ориентированная программа на php. ООП в PHP: Введение. Важные термины руководства по ООП на PHP

PHP один из самых популярных скриптовых языков программирования. Почти 60% веб серверов используют PHP.Миллионы веб-сайтов и веб-приложений разрабатываются на PHP каждый месяц.

PHP изначально разрабатывался как простая замена языку Perl, и уже спустя пару лет он стал чрезвычайно мощным и популярным. Язык PHP, сам по себе очень похож на ANSI C.
Одна из причин почему PHP стал таким популярным это его короткий период обучения.

Изучение PHP абсолютно не тяжёлое занятие, особенно если вы хорошо знакомы с синтаксисом Java или C.

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

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

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

PHP позволяет нам писать приложения 2мя разными способами, первый — процедурный, а второй объектно ориентированный. Если вы до сих пор не поняли разницу между этими двумя подходами, давайте посмотрим на эти куски кода — один и тот же пример написанный разными подходами.

$user_input = $_POST[‘field‘];
$filtered_content = filter($user_input); //user input filtering
mysql_connect(«dbhost»,«dbuser»,«dbpassword»); //database
mysql_select_db(«dbname»);
$sql = «some query»;
$result = mysql_query($sql);
while ($data = mysql_fetch_assoc())
<
process ($data);
>
process_user_input($filtered_content);

А вот тот же кусок кода с использованием ООП:

$input_filter = new filter();
$input_filter->filter_user_input(); //filter the user inputs
$db = new dal(«mysql»); //data access layer
$db->connect($dbconfig);//we wre using mysql
$result = $db->execute($sql);
ReportGenerator::makereport($result); //process data
$model = new Postmodel($filter->get_filtered_content());
$model->insert();

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

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

Исходя из изложенного выше, можно вынести преимущества использования ООП:

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

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

* Повторное использование : Объект это логический объект у которого есть комплект свойств и методов и он может взаимодействовать с другими объектами.. Объект может быть абсолютно независимым или может зависеть от других объектов. Объект обычно создают для решения специфических поставленных проблем. Следовательно когда другие разработчики сталкиваются с похожими проблемами, они могут подключить ваш класс к своему проекту и использовать его не боясь что он нарушит процесс их разработки. Это позволяет избежать DRY, что расшифровывается как Don’t Repeat Yourself (не повторяйся). В процедурном или модульном программировании, повторное использование возможно только в совокупности.

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

* Расширяемость : Если вам необходимо расширять функциональность вашего проекта, вы можете достичь лучших результатов при помощи ООП. Одна из основных функциональностей ООП это расширяемость. Вы можете использовать рефакторинг объектов что бы добавить функциональность. Работая над этим, вы по прежнему можете сохранить
прежнюю совместимость объекта — следовательно вы можете прекрасно работать и с прежним кодом. Или же вы можете расширить объект и создать абсолютно новый, который будет содержать все необходимые свойства и методы родительского объекта от которого происходит новый, а потом уже добавить в него новые функции. Это называется “наследование” и это очень важная возможность ООП.

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

* Эффективность : Идея ООП в действительности была разработана для повышения эффективности и облегчения процесса разработки. Несколько шаблонов проектирования разработаны что бы создавать более эффективный и хороший код.
Более того в ООП вы можете вы можете размышлять над вашими решениями в более удобной форме чем в процедурном подходе. Поскольку вы разбиваете вашу проблему на несколько маленьких проблем и вы находите решение для каждой из них отдельно, большая проблема решается сама по себе.

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

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

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

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

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

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

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

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

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

/** * Именно в этом месте запускается программа */ public static vo +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 . Опишем класс отрезка, наследуемого от класса точки:

/** * Класс Отрезок */ + this.segmentLength; > >

Class LineSegment extends Point

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

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

/** * Класс Треугольник. */ + this.angleAB; > >

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

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

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

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

Import java.util.ArrayList; > 16 апреля 2008 в 12:15

PHP — ООП или процедурный подход

PHP один из самых популярных скриптовых языков программирования. Почти 60% веб серверов используют PHP.Миллионы веб-сайтов и веб-приложений разрабатываются на PHP каждый месяц.

PHP изначально разрабатывался как простая замена языку Perl, и уже спустя пару лет он стал чрезвычайно мощным и популярным. Язык PHP, сам по себе очень похож на ANSI C.
Одна из причин почему PHP стал таким популярным это его короткий период обучения.

Изучение PHP абсолютно не тяжёлое занятие, особенно если вы хорошо знакомы с синтаксисом Java или C.

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

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

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

PHP позволяет нам писать приложения 2мя разными способами, первый — процедурный, а второй объектно ориентированный. Если вы до сих пор не поняли разницу между этими двумя подходами, давайте посмотрим на эти куски кода — один и тот же пример написанный разными подходами.

$user_input = $_POST[‘field‘];
$filtered_content = filter($user_input); //user input filtering
mysql_connect(«dbhost»,«dbuser»,«dbpassword»); //database
mysql_select_db(«dbname»);
$sql = «some query»;
$result = mysql_query($sql);
while ($data = mysql_fetch_assoc())
<
process ($data);
>
process_user_input($filtered_content);

А вот тот же кусок кода с использованием ООП:

$input_filter = new filter();
$input_filter->filter_user_input(); //filter the user inputs
$db = new dal(«mysql»); //data access layer
$db->connect($dbconfig);//we wre using mysql
$result = $db->execute($sql);
ReportGenerator::makereport($result); //process data
$model = new Postmodel($filter->get_filtered_content());
$model->insert();

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

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

Исходя из изложенного выше, можно вынести преимущества использования ООП:

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

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

* Повторное использование : Объект это логический объект у которого есть комплект свойств и методов и он может взаимодействовать с другими объектами.. Объект может быть абсолютно независимым или может зависеть от других объектов. Объект обычно создают для решения специфических поставленных проблем. Следовательно когда другие разработчики сталкиваются с похожими проблемами, они могут подключить ваш класс к своему проекту и использовать его не боясь что он нарушит процесс их разработки. Это позволяет избежать DRY, что расшифровывается как Don’t Repeat Yourself (не повторяйся). В процедурном или модульном программировании, повторное использование возможно только в совокупности.

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

* Расширяемость : Если вам необходимо расширять функциональность вашего проекта, вы можете достичь лучших результатов при помощи ООП. Одна из основных функциональностей ООП это расширяемость. Вы можете использовать рефакторинг объектов что бы добавить функциональность. Работая над этим, вы по прежнему можете сохранить
прежнюю совместимость объекта — следовательно вы можете прекрасно работать и с прежним кодом. Или же вы можете расширить объект и создать абсолютно новый, который будет содержать все необходимые свойства и методы родительского объекта от которого происходит новый, а потом уже добавить в него новые функции. Это называется “наследование” и это очень важная возможность ООП.

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

* Эффективность : Идея ООП в действительности была разработана для повышения эффективности и облегчения процесса разработки. Несколько шаблонов проектирования разработаны что бы создавать более эффективный и хороший код.
Более того в ООП вы можете вы можете размышлять над вашими решениями в более удобной форме чем в процедурном подходе. Поскольку вы разбиваете вашу проблему на несколько маленьких проблем и вы находите решение для каждой из них отдельно, большая проблема решается сама по себе.

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

11 марта 2010 в 11:37

ООП с примерами (часть 1)

  • Учебный процесс в IT

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

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

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

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

Класс

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

Класс – это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт).

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

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

В нашем случае, класс будет отображать сущность – автомобиль. Атрибутами класса будут являться двигатель, подвеска, кузов, четыре колеса и т.д. Методами класса будет «открыть дверь», «нажать на педаль газа», а также «закачать порцию бензина из бензобака в двигатель». Первые два метода доступны для выполнения другим классам (в частности, классу «Водитель»). Последний описывает взаимодействия внутри класса и не доступен пользователю.

В дальнейшем, несмотря на то, что слово «пользователь» ассоциируется с пасьянсом «Косынка» и «Microsoft Word», мы будем называть пользователями тех программистов, которые используют ваш класс, включая вас самих. Человека, который является автором класса, мы будем называть разработчиком.

Объект

Объект (экземпляр) – это отдельный представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом.

Говоря простым языком, объект имеет конкретные значения атрибутов и методы, работающие с этими значениями на основе правил, заданных в классе. В данном примере, если класс – это некоторый абстрактный автомобиль из «мира идей», то объект – это конкретный автомобиль, стоящий у вас под окнами.

Интерфейс

Интерфейс – это набор методов класса, доступных для использования другими классами.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Три кита ООП

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

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

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

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

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

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

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

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

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

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

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

Принципы ООП PHP

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

Понятие класса и объекта в ООП

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

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

Методы и свойства объекта

Чтобы объявить класс, пишут ключевое слово class и дают ему осмысленное название. Внутри класса описываются свойства и методы объекта. У анкеты есть поля (имя, фамилия, пол, возраст и.т.д), которые являются свойствами объекта (переменные).

class anketaExample
<
// свойства и методы объекта
>

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

Что такое методы? В классическом понимании методы – это функции. Удалить, размножить, распечатать, переслать – все это методы объекта. Некий набор действий, которые можно проделывать с анкетой.

Любимый всеми авторами статей по ООП, пример объекта из реальной жизни – это кот. У кота есть свойства:

Ещё котам присущи методы:

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

Пример в PHP ООП

Вернемся к нашей анкете и создадим класс anketaExample и перечислим названия полей анкеты (name, age, email, phone). Это и есть свойства. Перед каждым свойством нужно указать модификатор области видимости. Мы хотим, чтобы свойства были глобальными, поэтому добавим ключевое слово public. Это значит, что мы можем работать с заданными свойствами и вне класса anketaExample.

Присвоим свойствам значения, чтобы они не были пустыми.

class anketaExample
<
public $name = Max;
public $age = 40;
public $email = max@gmail.com;
public $phone = 34533334;
>

Теперь создадим объект.

$user1 = new anketaExample();

На основе одного класса, объектов может создаваться много.

$user1 = new anketaExample();
$user2 = new anketaExample();

Для объекта $user2, переопределим значения у свойств.

$user2->name = ‘Jack’;
$user2->age = ’25’;
$user2->email = jack@gmail.com;
$user2->phone = 7543099;

Для вывода на странице данные анкеты первого пользователя (объект $user1), воспользуемся следующей конструкцией.

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

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

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

Внутри класса мы обращаемся к свойствам объекта через специальную конструкцию $this (этот), но не через сам объект $user1. Вот так неправильно и не имеет смысла:

Это важный и ключевой момент в понимании методов.

public function getAnketaInfo() <
Имя: <$this->name>
Возраст: <$this->age>
Email: <$this->email>
Телефон: <$this->phone>;
>

Данный код выводит данные нужного пользователя.

echo $user1->getAnketaInfo();
echo $user2->getAnketaInfo();

Весь код целиком:

// создание класса
class anketaExample
<
public $name = Max;
public $age = 40;
public $email = max@gmail.com;
public $phone = 34533334;

public function getAnketaInfo() <
Имя: <$this->name>
Возраст: <$this->age>
Email: <$this->email>
Телефон: <$this->phone>;
>
>

// создание объекта класса

$user1 = new anketaExample();
$user2 = new anketaExample();

// вывод данных пользователя

echo $user1->getAnketaInfo();
echo $user2->getAnketaInfo();

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (https://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: https://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: https://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 0 ):

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    Мастер Йода рекомендует:  Отказ в обслуживании в Microsoft Windows TCPIP
    Добавить комментарий