простое объяснение PHP ООП против процедурного?

106

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

ООП против процедурных

  1. Чему я должен научиться?
  2. В чем разница в коде? каковы эффекты?
  3. Как PHP-фреймворк может помочь в ООП-подходе? (Я бы хотел изучить CodeIgniter)
  4. Нужна ли процедурная структура?

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

Спасибо!

Pennf0lio
источник
1
лицо, когда это не одна очень длинная ссылка
Феликс Ганьон-Гренье
см. также: blog.higher-order.com/blog/2009/04/27/…
dreftymac
см. также: twitter.com/…
dreftymac

Ответы:

280

Предыстория: вы попросили «простое объяснение», которое предполагает:

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

Краткий ответ без жаргона:

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

Длинный ответ без жаргона:

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

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

Вот краткий обзор того, что вы узнаете по мере накопления опыта:

  • Вы можете написать исходный код PHP, который выполняет полезные задачи
  • Вы можете сгруппировать полезные задачи в «куски» кода.
  • Вы можете думать о «фрагментах» кода независимо от отдельных файлов, в которых они сохраняются.
  • Иногда эти «фрагменты» кода будут вести себя по-разному в зависимости от параметров, которые вы передаете.
  • Фрагменты кода, принимающие параметры, называются «функциями».
  • Функции можно разделить на части , и это можно сделать разными способами:
    • Например: у вас может быть только один большой файл PHP со всеми функциями, которые вы когда-либо писали за всю свою жизнь, перечисленные в алфавитном порядке по имени функции.
    • Например: у вас может быть несколько файлов PHP с функциями, которые сгруппированы вместе по тематике [например, функции для выполнения основных операций со строками, функции для обработки массивов, функции для ввода / вывода файлов и т. Д.]
  • ООП - это особый способ «разбивки» функций в «класс».
  • Класс - это просто еще один уровень "фрагментации" кода вместе, чтобы вы могли рассматривать его как единое целое.
  • Класс можно рассматривать как «фрагмент» методов и свойств.

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

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

Смотрите также

Dreftymac
источник
1
@dreftymac: вы могли бы дать мне отзыв о том, что можно улучшить в моих дополнениях, вместо того, чтобы неловко удалить это за моей спиной. В самом деле. Я приветствую конструктивную критику и приглашаю вас поступить так же.
Флавий
1
@Flavius ​​ОК. Благодарность за усилия и за то, что нашли время, чтобы сделать дополнения. Поразмыслив над этим, кажется разумным, что добавление, которое вы сделали, заслуживает отдельного ответа.
dreftymac
2
Одно дополнение: класс также полезен для фрагментирования данных функций, поэтому вам не нужно передавать их в параметрах.
chiborg
1
+1 специально для вашего определения «Framework». Я слышал, как многие люди пытаются объяснить, что такое фреймворк, и я думаю, что ваш легче всего понять.
TecBrat 02 окт.13,
1
приятель ... это лучшее объяснение, которое я читал о oop против процедурного, и я МНОГО прочитал! отличная работа, действительно эффективная, простая и прямая. Вы правы, люди всегда используют примеры из реального мира, и это непростой способ что-либо понять, это чушь!
thechrishaddad
25

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

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

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

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

Вим тен Бринк
источник
3
Я считаю, что некоторый ООП-код более запутан ... например, попробуйте заглянуть в недра prestashop.
AndrewC
Отличный момент о Pretashop. Magento сам по себе крутой зверь, но мы решили остаться с ним, потому что альтернативы, такие как Pretashop или WooComm, еще хуже.
PKHunter
7

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

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

Йоонас Пулакка
источник
6

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

Rawdreeg
источник
6

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

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

В процедурном коде используются функции, переменные.

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

Удачи.

Эдвард Манда
источник