Классы. В чем смысл?

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

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

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

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

Другие методы объектно-ориентированного программирования могут включать такие функции, как

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

Из статьи. Top-15-best-practices-for-writing-super-readable-code :

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

Из http://java.sun.com/docs/books/tutorial/java/concepts/class.html :

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

Наконец, короткое видео youtube о различиях между процедурной и объектно-ориентированной парадигмой программирования …

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

Вот отредактированный пример из php.net

 <?php $item_name = 'Widget 22'; $item_price = 4.90; $item_qty = 2; $item_total = ($item_price * $item_qty); echo "You ordered $item_qty $item_name @ \$$item_price for a total of: \$$item_total."; ?> 

против:

 <?php class Item { protected $name, $price, $qty, $total; function __construct($name, $price) { $this->name = $name; $this->price = $price; } function calculate($qty) { $this->total = number_format(($this->price * $qty), 2); } public function __toString() { return "You ordered ($this->qty) '$this->name'" . ($this->qty == 1 ? "" : "s") . " at \$$this->price, for a total of: \$$this->total."; } } $widget22 = new Item("Widget 22", 4.90); $widget22->calculate(2); echo $widget22; ?> 

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

Большим преимуществом ООП является повторное использование кода. Пример. Предположим, вы создали общий класс «Socket», который взаимодействует с сервером на очень низком уровне. Затем я могу прийти и решить, что хочу написать класс FTP, который позволяет пользователю загружать файлы при подключении к FTP-серверу. Я могу «подклассировать» ваш класс Socket и расширить его функциональность для поддержки FTP, не переписывая ваш код.

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

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

Более подробную информацию о классах можно найти в Википедии .

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

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

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

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

Я думал точно так же.

Я прочитал несколько книг по OO-PHP, моим фаворитом является PHP In Action .

Хотя, когда я читал книги, я думал: «Эй, это очень полезная и интересная информация». Мне еще предстоит использовать значительное количество OO-PHP.

Простые потребности, такие как получение информации с сервера, и JSON-обратно, действительно не нужны ООП. Я уверен, что это «Лучшая практика», но для многих людей это не практично. Несколько классов, таких как подключение к базе данных и аналогичная обработка данных, могут быть хранителями в реальном времени, но PHP иногда проще и быстрее использовать только частично OO.

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

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

Все, что я могу сказать, это одна из тех вещей, которые вам нужно погрузиться, чтобы увидеть НАСТОЯЩИЕ преимущества этого.

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

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

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

Вот несколько хороших объяснений преимуществ ООП.

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

Лучший пример, который я могу придумать, – это подключение к базе данных.

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

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

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

У всех вышеуказанных плакатов действительно хорошие очки. Я бы очень рекомендовал следующие книги:

Управлять сложностью.

Редактировать: Возможно, я больше разбираюсь в разработке.

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

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

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

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

В PHP классы могут, по крайней мере, сэкономить вам кучу include . __autoload() загрузка функции __autoload() очень удобна. Кроме того, вы можете быть уверены, что имена функций в разных вариантах не будут конфликтовать.

Чтобы выйти за рамки этого, вы можете начать думать о создании API вокруг класса. Функции, которые нужны только для других функций внутри класса, могут быть выделены private . И, в конце концов, вы должны иметь возможность игнорировать фактический код в своих классах и просто думать о них как о вызовах API.

Если я вызову Do::stuff($a, $b) я получаю этот ответ.

И это все, что вам нужно знать. Вы можете забыть, как это работает «под капотом» внутри класса.

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