Подтвердить что ты не робот

Классы. Какой смысл?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

Здесь отредактированный пример из 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.";
?>

v.s:

<?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;
?>

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Я прочитал несколько книг по OO-PHP, моим любимым PHP в действии.

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

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

Ответ 6

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

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

Все, что я могу сказать, это одна из тех вещей, которые вам нужно погрузиться, чтобы увидеть РЕАЛЬНЫЕ преимущества этого.

Ответ 7

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

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

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

Ответ 9

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

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

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

Ответ 10

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

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

Ответ 11

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

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

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

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

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

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

Ответ 12

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

Ответ 13

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

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

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

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

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