Полностью объектно-ориентированная структура в PHP

Я хочу создать 100% объектно-ориентированную инфраструктуру на PHP без процедурного программирования и где все является объектом. Подобно Java, но это будет сделано в PHP.

Любые указатели на то, какие функции должна иметь эта вещь, должны ли они использовать любые существующие шаблоны проектирования, такие как MVC? Как можно создать объекты для каждой таблицы в базе данных и как будет отображаться отображение шаблонов HTML и т. Д.?

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

Некоторые функции, которые я хотел бы иметь, это:

  • Очень простая генерация страниц CRUD
  • Основание на основе AJAX
  • Валидация формы на основе Ajax, если возможно, или очень простая форма проверки
  • Сортируемые таблицы
  • Возможность редактирования HTML-шаблонов с помощью PHP

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

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

Представление OOP таблиц / строк базы данных также возможно. Я использую DAO или ActiveRecord на ежедневной основе. Другим подходом к проблемам ORM является шлюз данных строк и шлюза данных . Вот пример реализации ArrayAccess использованием интерфейса ArrayAccess .

HTML-шаблоны также могут быть представлены как объекты. Я использую объекты View совместно с движком шаблонов Smarty. Я нахожу эту технику Чрезвычайно гибкой, быстрой и простой в использовании. Объект, представляющий представление, должен реализовывать метод __set чтобы каждое свойство распространялось в шаблон Smarty. Кроме того, __toString должен быть реализован для поддержки вложенности представлений. См. Пример:

 $s = new View(); $s->template = 'view/status-bar.tpl'; $s->username = "John Doe"; $page = new View(); $page->template = 'view/page.tpl'; $page->statusBar = $s; echo $page; 

Содержание view/status-bar.tpl :

 <div id="status-bar"> Hello {$username} </div> 

Содержание view/page.tpl :

 <html> <head>....</head> <body> <ul id="main-menu">.....</ul> {$statusBar} ... rest of the page ... </body> </html> 

Таким образом, вам нужно только echo $page а внутренний вид (строка состояния) будет автоматически преобразован в HTML. Посмотрите на полную реализацию здесь . Кстати, используя один из Intercepting Filters, вы можете обернуть возвращаемое представление нижним колонтитулом HTML и заголовком, поэтому вам не нужно беспокоиться о возврате полной страницы с вашего контроллера.

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

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

Другим удобным элементом является класс автоматического перевода для изменения данных в db, подходящих для пользовательского интерфейса. Например, если у вас есть поле INT (1) в db, представляющее логическое состояние, и используйте флажок в HTML, который приводит к пустой строке или "on" включен» в массиве _POST или _GET, вы не можете просто назначить один в другой. Служба переводов, которая изменяет данные, подходящие для View или для db, является чистым способом дезинфекции данных. Кроме того, сложность класса перевода не мешает вашему коду контроллера даже во время очень сложных преобразований (например, преобразование синтаксиса Wiki в HTML).

Также проблемы могут быть решены с использованием объектно-ориентированных методов. Мне нравится использовать функцию __ (double underscore) для получения локализованных сообщений. Функция вместо выполнения поиска и возвращающего сообщения дает мне объект Proxy и предрегистрационное сообщение для последующего поиска. Когда объект Proxy вставляется в View AND View, он преобразуется в HTML, а бэкенд i18n ищет все предварительно зарегистрированные сообщения. Таким образом выполняется только один запрос, который возвращает все запрошенные сообщения.

Проблемы управления доступом могут быть решены с использованием шаблона Business Delegate. Я описал это в другом ответе на Stackoverflow .

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

Приятного взлома!

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

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

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

Некоторые ответы на ваши вопросы:

  • Да, вероятно, он должен использовать MVC, поскольку парадигма контроллера модели отлично переводится в мир веб-приложений.
  • Для создания моделей из записей в таблицах в вашей базе данных изучите образцы ORM и Active Record. Существующие реализации исследований, которые я знаю, включают Doctrine, больше можно найти, выполнив поиск здесь.
  • Для чего-то связанного с AJAX я предлагаю использовать jQuery в качестве отправной точки, так как AJAX очень легко встает и работает.

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

Я написал свою собственную (почти полностью OO-структуру некоторое время назад), так что вот мой совет:

  • Если раньше вы работали с другими фреймами, подумайте о том, что вам понравилось / не понравилось, и убедитесь, что ваш дает вам именно то, что вы хотите.
  • Я лично люблю шаблон MVC, я бы не мечтал сделать проект без него. Если вам нравится MVC, сделайте это, если вы не беспокоитесь.
  • Если вы хотите использовать JavaScript / AJAX, используйте библиотеку JavaScript. Кодирование всего вашего собственного JavaScript с нуля дает вам немного о DOM и JavaScript в целом, но в конечном итоге это пустая трата времени, сосредоточиться на том, чтобы сделать ваше приложение / фреймворк лучше.
  • Если вы не хотите использовать другую оптовую инфраструктуру, посмотрите, есть ли другие компоненты с открытым исходным кодом, которые вам нравятся и которые вы захотите использовать, например, Propel , Smarty , ADOdb или PEAR . Написание собственных фреймворков не обязательно означает писать все с нуля.
  • Используйте шаблоны проектирования, где они имеют смысл (например, одиночные списки для доступа к базе данных), но не одержимы ими. В конечном счете сделайте все, что вы думаете, создаете самый аккуратный код.
  • Наконец, я многому научился, вникая в философию Ruby on Rails , вы никогда не сможете использовать RoR (я этого не сделал), но некоторые из концепций (особенно Convention over Configuration) действительно резонировали со мной и действительно повлияли на мое мышление.

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

В этом смысле, как и любой другой программный проект, в этом смысле это выглядит так:

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

  • ПОЧЕМУ это сделать? Каковы основные преимущества, которые вы надеетесь реализовать? Если ответ «скорость», вы можете сделать одно, если это «простота кодирования», вы можете сделать другое, если это «опыт обучения», вы можете сделать

  • какие основные проблемы вы пытаетесь решить? И что самое главное? Безопасность? Легкое создание пользовательского интерфейса? Масштабируемость?

Ответ на «какие функции он должен иметь» действительно зависит от ответов на такие вопросы, как выше.

Вот мои предложения:

  1. Прекратите то, что вы делаете.
  2. Это уже сделано до смерти.
  3. Нажмите эту Zend Framework или CakePHP или, возможно, даже эту платформу переустановки .

Теперь мои причины:

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

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

… «О, я собираюсь создать свою собственную фреймворк, создать свое собственное все», и все будет круче, чем то, что вы могли бы просто выйти и получить …

из StackOverflow Podcast # 3 .

Таким образом, сэкономить время и работать над чем-то, что решает проблему для людей, таких как веб-приложение, которое позволяет людям автоматически обновлять Twitter, когда ящик для мусора кошки нуждается в очистке. Выполняется проблема «Объектно-ориентированная PHP-платформа». Независимо от того, какая структура вы соскользнете вместе, никогда не будет такой надежной или полезной или многофункциональной, как любая свободная, полностью поддерживаемая инфраструктура, доступная СЕГОДНЯ .

Это не значит, что у вас не может быть опыта обучения, но почему это происходит в темноте, создавая структуру, которая превратится в бесполезную блоб кода, оставив вас без каких-либо показов для вашего времени? Разработка веб-приложения, что-то для людей, чтобы использовать и наслаждаться, я думаю, вы найдете опыт невероятно полезным и ОБРАЗОВАТЕЛЬНЫМ .

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

Тем не менее, я написал уровень доступа к данным до того, как почти полностью отвлекся от любого SQL. Код приложения может запрашивать соответствующий объект, а слой абстракции сделал много магии для извлечения данных только тогда, когда это было необходимо, не нужно было повторно извлекать, сохранять только тогда, когда оно было изменено, и поддерживало размещение некоторых объектов в разных базах данных. Он также поддерживал реплицированные базы данных и уважал задержку репликации и имел интеллектуальный объект коллекции. Он также был очень расширяемым: ядро ​​было параметром, и я мог добавить целый новый объект с примерно 15 строками кода – и получил всю магию бесплатно.

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

Другими словами, объектно-ориентированная структура в PHP не только возможна, но и может быть очень эффективной. Это все было в PHP 4, BTW, и я столкнулся с тем, что было возможно с объектами PHP 4 пару раз. 🙂

Я никогда не добирался до центральной отправки, которая называла объекты, но я был недалеко. Тем не менее, я работал с несколькими фреймворками, которые делают это, и макет файла может быстро стать волосатым. По этой причине я пошел бы на систему отправки, которая была бы такой сложной, какой она должна быть, и не более того. Простое действие / представление (это почти MVC в любом случае) должно дать вам нечто большее, чем достаточно.

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

Функции, которые я реализовал сам:

  • Архитектура MVC
  • Объект аутентификации
  • Класс доступа к базе данных
  • Конфигурация перезаписи URL
  • Класс разбиения на страницы
  • Класс электронной почты
  • шифрование

Функции, на которые я смотрел и думал, забудьте об этом! Я построю поверх кого-то elses:

  • Класс кэширования
  • Класс проверки формы
  • Класс FTP
  • Классы способности плагина

Конечно, возможно создание структуры, которая превосходит опции с открытым исходным кодом, но почему вы беспокоитесь?

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

У меня есть идеальная ссылка для вас, мой друг: http://nettuts.com/tutorials/php/creating-a-php5-framework-part-1/ . Это потрясающий учебник, на который я смотрел, и его не слишком подавляющее. Плюс посмотрите вокруг раздела PHP этого сайта, я увидел статью о CRUD. Что касается AJAX, посмотрите в другом месте, но вы должны начать где-то, и этот учебник является удивительным.

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

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

Обычно мы работаем с Zend Framework, и это в основном потрясающе, но попытка модульного тестирования / тестового диска ZF-кода не намного отстает от мазохизма.

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

Я куплю вам два пива, если вы окажетесь в AJAX. Существует огромная пропасть между фреймворком OO PHP и инфраструктурой JavaScript.

Пожалуйста, не связывайтесь с существующей структурой

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

Я ни в коем случае не говорю, что могу писать лучше, чем «большие мальчики», но я (как и большинство из вас, я думаю) мог указать, почему некоторые вещи, которые они делают, плохи, даже если они просто не являются конечными пользователями / не-разработчик …

Интересно, как работают ваши рамки, через 6 лет?
Вы все еще работаете над этим? Ты остановился?


Если вы пишете свою собственную структуру

Это, вероятно, немного поздно для вас, но для кого-либо, написания вашей собственной фреймворк – это фантастическая вещь для обучения .

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

В прошлом году я хотел изучить OOP / классы и более продвинутый PHP.
И писать мои собственные рамки было лучшим, что я сделал (я на самом деле все еще делаю), так как я узнал гораздо больше, чем я ожидал.

По пути я узнал (чтобы назвать несколько):

  • ООП / классифицирует множество передовых методов, которые приходят с ним, такие как инъекция зависимостей, СРП
  • Шаблоны проектирования, которые помогут вам написать код и структурировать вашу систему таким образом, чтобы сделать многое логичным и легким. Пример см. В Wiki – SOLID
  • Пространства имен
  • Обработка ошибок PHP и все функции, которые обеспечивают
  • Более надежное (и лучшее) понимание MVC , и как его применять соответствующим образом (поскольку нет четкого способа его использования, просто руководств и лучших практик).
  • Автозагрузка (классов для ООП)
  • Улучшенный стиль написания кода и более структурированный макет, а также лучшие навыки комментирования
  • Соглашения об именах (забавно создавать свои собственные, даже если они основаны на распространенных практиках).

И многие другие базовые вещи PHP, которые вы всегда случайно обнаруживаете от чтения чего-то.

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


Зачем писать рамки, чтобы узнать все об этом

Когда вы начинаете, вы изучаете основы – A (переменные), затем B (как написать основную функцию) и т. Д.
Но это не займет много времени, когда вы пытаетесь изучить более продвинутые вещи, чтобы учиться и использовать D и E, вам также нужно учиться и понимать F, G, H и J, а также знать тех, кого вы должны знайте K, L и M, и чтобы знать части L и M, вам сначала нужно понять N и O …

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

Но со временем, с практикой и, безусловно, преданностью, все будет в порядке, и вы оглянетесь на код, даже на коллекцию файлов / классов, и подумайте: «Я написал это …»?

Написание структуры очень помогло с этим «минным полем», потому что:

  • У меня были конкретные задачи, которые привели к необходимости изучения и реализации других вещей, но конкретных вещей. Это позволило мне сосредоточиться на чем-то меньшем, и даже когда что-то отделяется от других вещей, вы можете направить его обратно туда, где вы начали, потому что работаете над чем-то конкретным. Вы можете сделать это с любым обучением, но если у вас нет какой-либо цели или конкретной задачи, на которую вы сосредоточены, вы можете легко отвлечься и потеряться в эфире вещей, чтобы учиться.
  • У меня было что-то практическое для работы. Часто чтение учебников о классе животных, а также о том, как классы кошки и собаки расширяют животное и т. Д., Может сбивать с толку. Когда у вас есть реальная жизненная задача в ваших собственных рамках, например, как мне управлять XYZ, вы можете узнать, как работают классы, потому что у вас есть пробная версия и ошибка, а также твердое требование, которое вы понимаете, потому что вы создали это требование! Это не просто теоретическое чтение, которое обычно ничего не значит.
  • Я мог бы опустил его, когда мой разум был взорван, хотя, поскольку это были мои рамки (мой монстр Франкенштейна в начале: P), я хотел надавить, потому что это было интересно, и личная цель – изучить и отсортировать следующий этап, решить проблему, с которой я застрял, и т. д.

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


Подождите, я не должен изобретать колесо, хотя

Ну, во-первых, вы не можете изобретать колесо, это невозможно, поскольку вы просто сделаете колесо.

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

Но утверждение бессмысленно по отношению к написанию собственных фреймворков!

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

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

Но проект обучения, который вы не используете в Интернете, идеален – или используйте его, в конце концов, когда вы достаточно продвинуты, чтобы знать, что это безопасно!

При всем том, что вы должны написать свои собственные рамки IF:

  • Вам это не нужно в ближайшее время! Это занимает много времени, так как есть много аспектов для рассмотрения, изучения и пробной версии, а ошибка приводит к рефакторингу (сначала много!)
  • Вы готовы читать, кодировать, тестировать, изменять, читать, кодировать и читать еще несколько. В Интернете есть много хороших советов по продвинутому PHP, большинство из которых – это умение сначала, как чтение всех шаблонов дизайна. Но в конечном итоге они имеют смысл и в конечном итоге помогают решить проблемы, с которыми вы сталкиваетесь, и как делать что-то в рамках вашей структуры.
  • Желая включить время и продолжать пытаться улучшиться, и направляйтесь к лучшей практике, особенно с безопасностью. Проблемы с частотой не должны быть проблемой с небольшой структурой, и, кроме того, если у вас есть достаточно приличная система, вы можете обычно реорганизовывать и улучшать скорость. обычно, если у вас есть важные проблемы с скоростью, это означает, что вы выбрали интенсивные операции, которые обычно можно решить, делая это по-другому.

,

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

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

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

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

Вы хотите создать точно то же самое, над чем я работал в течение нескольких лет, и результатом является Agile Toolkit.

Очень простая генерация страниц CRUD

 $page->add('CRUD')->setModel('User'); 

Основание на основе AJAX

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

 $b=$page->add('Button')->setLabel(rand(1,50)); $b->js('click')->reload(); 

Валидация формы на основе Ajax, если возможно, или очень простая форма проверки

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

Сортируемые таблицы

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

Возможность редактирования HTML-шаблонов с помощью PHP

Это кажется неуместным и неправильным. Шаблоны лучше в VCS.