Насколько объектно-ориентированный PHP? [закрыто]

13

У меня была возможность провести интересную беседу с моими сотрудниками. Большинство из них являются сценариями Flash Action или разработчиками Java

Мы говорили о том, как хорошо PHP работает с ООП. Я сказал, что PHP может обрабатывать практически все ООП, начиная с PHP 5.2 или 5.3. Я ошибаюсь? Я не пытаюсь получить ответ да / нет, но я хотел бы услышать больше мнений от разработчиков.

user23583
источник
Я ответил на это здесь
Мартин Уикман
12
языки не плохи, программисты
@ Джаррод Роберсон: Языки врожденные, как так? Если это так, пожалуйста, обратитесь к исследованиям, подтверждающим это утверждение, так как я очень заинтересован в его чтении.
промахи
4
@ Jarrod, есть несколько законно плохих языков, особенно когда они в ранних версиях. На ум приходят ранние версии Actionscript, Javascript, Java и PHP.
Джордан
2
@JarrodRoberson, так что программисты, которые разработали PHP ...
dan_waterworth

Ответы:

34

PHP 5.3 на самом деле имеет довольно приличную поддержку ООП.

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

Хотя PHP в настоящее время в значительной степени подходит для ООП, проблема в том, что:

  1. подавляющее большинство кодовой базы (библиотеки, фреймворки, пользовательский код) не написано в PHP 5.3
  2. Подавляющее большинство API является процедурным. arrayпо-прежнему является наиболее важным и наиболее используемым типом, и это не объект.
  3. Подавляющее большинство программистов на PHP будет придерживаться процедурного стиля в обозримом будущем. PHP не продвигает ООП, в отличие от, например, Objective-C: Objective-C имеет C как полное подмножество и, таким образом, позволяет процедурное программирование в одной из своих самых чистых форм, но он явно одобряет использование OOP.

PHP не может просто избавиться от всего старого. Если был выпущен PHP 6, который выбрасывает большую часть его, он, вероятно, не будет использоваться. Это победило бы его цель.
И PHP не смог набрать достаточный темп для постепенного обесценивания вещей. Таким образом, потребуется некоторое время, пока он не приобретет необходимую ясность и последовательность, которую должен иметь хороший язык.

Лично мне очень не нравится PHP, просто из-за всего этого багажа, API и всего остального.
Однако такие платформы, как Flow3, Symfony, CakePHP и Codeigniter, обеспечивают прочную основу для ООП и других мощных парадигм. Из-за ограничений ActionScript и Java, при достаточных усилиях (уровень абстракции поверх недостатков PHP), PHP может быть на одном уровне или даже превзойти их.

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

back2dos
источник
4
Из любопытства, не могли бы вы объяснить, почему вы думаете, что Java - плохая ООП?
dkuntz2
2
Гм ... Я мог бы обновить ваш ответ, чтобы быть конкретным для Actionscript 3 . До этого Actionscript не разрабатывался как OO (основанный на ECMA), и даже Actionscript 2 был просто оболочкой для AS1.
Демиан Брехт
1
Мне также любопытно, почему вы думаете, что Java - плохой язык ООП
starcorn
2
@Demian Brecht: Дуглас Крокфорд кажется относительно убежденным, JavaScript (любой, таким образом, ECMA-скрипт) является OO: javascript.crockford.com/javascript.html
back2dos
2
Различие , который подводит , что до хорошо: РНР объектно-способным , а не объектно-ориентированным.
vartec
11

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

По моему (по общему признанию ограниченному) опыту, диалекты PHP 5.n этого не делают. Слишком легко выскользнуть из ООП и в значительной степени чисто процедурный код. (Обратите внимание, что я не думаю, что PHP является плохим языком по этой причине. Есть много причин, почему я считаю PHP плохим языком, но поддержка ООП не является одной из них.;))

ПРОСТО МОЕ правильное мнение
источник
12
Чувак, я мог бы об этом целую вечность, Луна. Вот фрагмент кода , который не может : $e = function_that_returns_an_array()[0];. Вот что вам нужно сделать , чтобы исправить это: $a = function_that_returns_an_array(); $e = $a[0];. Языки, синтаксис которых не позволяет вам напрямую использовать результат вызова функции, помечают меня галочкой. Кроме того , скажите мне , что следующее число в десятичной системе счисления: 0246875. (Подсказка: вы не сможете найти более тупой способ реализовать этот лексер!) PHP просто полон такой глупости.
ПРОСТО МОЕ правильное мнение
6
@Moon Вот некоторые чтения для вас: softwarebashing.org/blog/2009/09/php-the-ultimate-suck и tommorris.org/wiki/PHP%20Sucks Есть некоторые серьезные проблемы, но многие из них просто гниды сбор. Что я действительно ненавижу в PHP, так это культура, она просто не такая профессиональная или академическая, как альтернативы, а именно ruby ​​и python. Альтернативы лучше, и они привлекают лучших программистов. Например, у ruby ​​и python есть интерактивные оболочки, достойные функциональные возможности и чистый синтаксис. Их гораздо веселее использовать. Помимо доли рынка в общем веб-хостинге, зачем использовать php?
Кейо
8
«Есть только два вида языков: те, на которые жалуются люди, и те, которые никто не использует». Бьярне Страуструп. Размышление.
Сильвердраг
4
@ Просто, к счастью, они исправили проблему разыменования массива в 5.4 .
Чарльз
5
Страуструп просто взбешен, что C ++ - один из тех языков, о которых говорят люди.
ПРОСТО МОЕ правильное мнение
8

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

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

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

Возможно, некоторые языки лучше подходят для изучения объектно-ориентированного программирования, но я думаю, что это будет отличаться в зависимости от разработчика. Для меня это не щелкнуло, пока я не прочитал верблюжью книгу Ларри Уолла о том, как perl делает (делал?) ООП. Необходимость явного благословения ссылок как принадлежащих к классу действительно подтолкнула меня к пониманию того, чем в действительности является экземпляр объекта по сравнению с классом. Некоторые люди предпочитают Java-универсальный подход к обучению. Поскольку ООП - это скорее архитектурная задача, его легче освоить после того, как вы узнаете основные переменные, выражения, последовательность, выбор и итерацию, поэтому, на мой взгляд, любой язык, который не навязывает вам ООП сразу, имеет образовательное преимущество.

Когда моя жена познакомилась с уроками программирования на языке Java, она постоянно расстраивалась public static void mainи вкладывала все в уроки, которые у нее еще не было, но преподаватель сказал ей просто поверить, что она в этом нуждается. Я пытался объяснить это, но очень сложно объяснить кому-то, кто только что узнал о переменных, почему было бы полезно предотвратить доступ к ним других частей кода и как решить, как их разделить. Вы могли бы утверждать, что изучение процедурного программирования сначала прививает вредные привычки, но как насчет привычки копировать и вставлять код, который вы не понимаете?

Карл Билефельдт
источник
Кажется, что термины «объект», «язык», «ориентированный» и «программирование» не были согласованы и являются неоднозначными и относительными, поэтому невозможный черный или белый ответ невозможен. Но опять же «черный» и «белый» не согласованы, и их значение неуловимо, и т. Д. И т. Д. И т. Д.
Tulains Córdova
5

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

Я не могу вспомнить точную цитату, но она была от того, кто сравнивал необработанный PHP с использованием тогдашнего нового Ruby on Rails, и сделал что-то вроде этого: Rails облегчает написание хорошего кода и трудный написание плохого. PHP облегчает написание плохого кода и затрудняет написание хорошего кода. Строка о PHP в значительной степени подводит итог ООП; он вполне способен быть хорошим языком OO, но делает его немного сложнее.

Уэйн Молина
источник
4

PHP по категориям

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

Скомпилированные языки

В отличие от PHP, Java - это скомпилированный язык, который был должным образом спроектирован. Существуют JSR, определяющие язык, многие корпоративные среды и концепции, такие как EJB, JMS, ESB, Spring, Struts, Hibernate и другие.

Корпоративное ПО

С точки зрения корпоративных систем Java EE - это решение, которое подходит для этой цели (Enterprise Edition), тогда как PHP используется в компаниях, которые пытаются сократить расходы, нанимая дешевую рабочую силу с меньшей квалификацией.

Было приложено немало усилий, чтобы перетащить PHP в сегмент Enterprise, используя различные фреймворки. В частности, Zend Framework 2 . Фундаментальная проблема здесь не в объектно-ориентированной PHP, а в отсутствии дизайна, отсутствии строгой типизации, нестандартных решениях стандартных проблем (вроде взломов для всего) и полном отсутствии какой-либо предписанной архитектуры.

Разработка программного обеспечения (обсуждается архитектура)

С PHP, бремя архитектуры программного обеспечения по-прежнему полностью ложится на разработчиков, которые выполняют очень плохую работу, то есть часто вообще не имеют никакой архитектуры, просто случайным образом кодируют и исправляют. Безопасность и транзакции отсутствуют и должны быть включены разработчиками. В Java одно решение аннотировано EJB. Также учтите тот факт, что в PHP ничего не происходит, если вы пропускаете перехват исключений или допускаете различные ошибки. Это до времени выполнения. С Java вы получите предупреждение и ошибки прямо во время разработки. Это называется надежностью, но с PHP вы можете только продолжать мечтать.

Многопоточность

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

Поддержка и Стандарты

Также рассмотрите развертывание, веб-сервисы и другие стандарты. В то время как в Java есть такие крупные компании, как Oracle, IBM, RedHat, Apache и многие другие, в PHP есть только Zend.

Вывод

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

Связанные мысли

Основная задача последнего Zend Framework 2 заключается в том, что он пытается быть похожим на Java EE, но полностью не может предоставить хотя бы удаленно сопоставимый набор доступных пакетов, функций, инструментов, средств автоматизации, проверки ошибок, архитектуры, дизайна и все.

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

Также ходят слухи, что PHP означает «довольно ужасное программирование» . Я могу подтвердить это.

Майкл Боргвардт
источник
3

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

Srisa
источник
2

PHP поддерживает черты! (начиная с 5.4) . Любой язык, который может обрабатывать горизонтальное повторное использование изначально, является достаточно хорошим ОО-языком в моей книге.

dukeofgaming
источник
1

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

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

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

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

Помимо описанных выше поведенческих различий, есть много синтаксических различий, например, у JS есть нотация Object Literal, которая может очень запутать программистов на C #. Однако C # также имеет синтаксис литерала объекта, подобного синтаксису, даже если это скомпилированный язык, и такой синтаксис используется редко, поскольку это не традиционный стиль кода OO.

Теперь есть еще один момент, который определяет, является ли язык хорошим ОО: эволюционировал ли он из C ++. Поскольку Java, C # развиты из C ++ и следуют схожему поведению и синтаксису, большое сообщество воспринимает такое поведение и синтаксис как единственную вещь ОО и думает, что любой язык, который не запрещает такое сходство, просто не является ОО.

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

И PHP очень хорошо ОО. Просто не смотря и не чувствуя себя как Java, C ++, C # не делает его плохим языком OO. Ну, я изучил C ++, затем Java, а затем C #.

Итак, до сих пор моя голова была очень хорошо OO. Затем я выучил JS из очень хорошей книги "Wrox Pro", и она просто превзошла меня. Я просто наслаждался поведением и синтаксической отчетливостью JS. Тогда я понимаю, что литерал Object, подобный синтаксису, был в C #. И сейчас, изучая PHP, я чувствую, что он приносит много вещей из обоих миров.

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

Maha
источник