Я хочу создать 100% объектно-ориентированную инфраструктуру на PHP без процедурного программирования и где все является объектом. Подобно Java, но это будет сделано в PHP.
Любые указатели на то, какие функции должна иметь эта вещь, должны ли они использовать любые существующие шаблоны проектирования, такие как MVC? Как можно создать объекты для каждой таблицы в базе данных и как будет отображаться отображение шаблонов HTML и т. Д.?
Пожалуйста, не связывайтесь с существующей структурой, потому что я хочу сделать это самостоятельно, главным образом в качестве учебного упражнения. Вам будет отказано в привязке к существующей инфраструктуре в качестве вашего ответа и о том, что «это делает то, что вы хотите».
Некоторые функции, которые я хотел бы иметь, это:
Я рассмотрел множество проблем в вашем списке, поэтому позвольте мне рассказать о том, как я справляюсь с этим. Я также являюсь наркоманом ООП и нахожу методы объектов чрезвычайно гибкими и мощными, но элегантными (если все сделано правильно).
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 и т. Д. Все популярны по какой-то причине.
Создание рамок полезно, но вам нужен четкий план и понимание поставленной задачи, в рамках которой происходит исследование.
Некоторые ответы на ваши вопросы:
Создание собственной структуры – это хороший способ получить оценку некоторых вещей, которые могут происходить под капотом других фреймворков. Если вы такой перфекционист, как я, это дает вам хороший повод для агонизации каждой мелочи (например, должен ли этот объект называться X или Y, следует ли использовать для этого статический метод или метод экземпляра).
Я написал свою собственную (почти полностью OO-структуру некоторое время назад), так что вот мой совет:
В конечном счете, если ваши потребности не являются особыми, большинство людей будут более продуктивными, если они примут существующую структуру. Но заново изобретать колесо учить вас больше о колесах.
В этом смысле, как и любой другой программный проект, в этом смысле это выглядит так:
Вы должны четко определить свои требования, включая мотивацию и приоритеты:
ПОЧЕМУ это сделать? Каковы основные преимущества, которые вы надеетесь реализовать? Если ответ «скорость», вы можете сделать одно, если это «простота кодирования», вы можете сделать другое, если это «опыт обучения», вы можете сделать
какие основные проблемы вы пытаетесь решить? И что самое главное? Безопасность? Легкое создание пользовательского интерфейса? Масштабируемость?
Ответ на «какие функции он должен иметь» действительно зависит от ответов на такие вопросы, как выше.
Вот мои предложения:
Теперь мои причины:
… если вы вообще работали с разработчиками, вы работали с разработчиками, которые любят изобретать колесо без уважительной причины. Это очень, очень распространенный шаблон отказа.
… они уйдут и напишут сотни и тысячи самых страшных языков, которые вы могли бы себе представить …
… «О, я собираюсь создать свою собственную фреймворк, создать свое собственное все», и все будет круче, чем то, что вы могли бы просто выйти и получить …
из StackOverflow Podcast # 3 .
Таким образом, сэкономить время и работать над чем-то, что решает проблему для людей, таких как веб-приложение, которое позволяет людям автоматически обновлять Twitter, когда ящик для мусора кошки нуждается в очистке. Выполняется проблема «Объектно-ориентированная PHP-платформа». Независимо от того, какая структура вы соскользнете вместе, никогда не будет такой надежной или полезной или многофункциональной, как любая свободная, полностью поддерживаемая инфраструктура, доступная СЕГОДНЯ .
Это не значит, что у вас не может быть опыта обучения, но почему это происходит в темноте, создавая структуру, которая превратится в бесполезную блоб кода, оставив вас без каких-либо показов для вашего времени? Разработка веб-приложения, что-то для людей, чтобы использовать и наслаждаться, я думаю, вы найдете опыт невероятно полезным и ОБРАЗОВАТЕЛЬНЫМ .
Как сказал Джим OHalloran, написание собственной структуры дает вам очень хорошее представление о том, как другие структуры делают вещи.
Тем не менее, я написал уровень доступа к данным до того, как почти полностью отвлекся от любого SQL. Код приложения может запрашивать соответствующий объект, а слой абстракции сделал много магии для извлечения данных только тогда, когда это было необходимо, не нужно было повторно извлекать, сохранять только тогда, когда оно было изменено, и поддерживало размещение некоторых объектов в разных базах данных. Он также поддерживал реплицированные базы данных и уважал задержку репликации и имел интеллектуальный объект коллекции. Он также был очень расширяемым: ядро было параметром, и я мог добавить целый новый объект с примерно 15 строками кода – и получил всю магию бесплатно.
Я также написал механизм компоновки CRUD, который использовался для значительного процента сайта. Ядро было параметром, поэтому он мог запускать список и редактировать страницы для чего угодно, как только вы написали список параметров. Он автоматически выполнял разбиение на страницы, сохранение-новое удаление и т. Д. И т. Д., Используя слой объекта выше. Это не было объектно-ориентированным само по себе, но это могло быть сделано так.
Другими словами, объектно-ориентированная структура в PHP не только возможна, но и может быть очень эффективной. Это все было в PHP 4, BTW, и я столкнулся с тем, что было возможно с объектами PHP 4 пару раз. 🙂
Я никогда не добирался до центральной отправки, которая называла объекты, но я был недалеко. Тем не менее, я работал с несколькими фреймворками, которые делают это, и макет файла может быстро стать волосатым. По этой причине я пошел бы на систему отправки, которая была бы такой сложной, какой она должна быть, и не более того. Простое действие / представление (это почти MVC в любом случае) должно дать вам нечто большее, чем достаточно.
Сначала я начал создавать свою собственную структуру с похожими идеалами. Однако через пару месяцев я понял, что воссоздал работу, которая была сделана много раз. В итоге я нашел фреймворк с открытым исходным кодом, который легко расширялся и использовал его в качестве основы для моей собственной разработки.
Функции, которые я реализовал сам:
Функции, на которые я смотрел и думал, забудьте об этом! Я построю поверх кого-то elses:
Конечно, возможно создание структуры, которая превосходит опции с открытым исходным кодом, но почему вы беспокоитесь?
Это правда, что некоторые разработчики изобретают колесо без уважительной причины. Но поскольку есть уже хорошие рамки вокруг, это не означает, что это пустая трата времени, когда вы делаете это самостоятельно. Я начал с того, что не хотел использовать его для чего-то большего, чем упражнение. Я очень рекомендую это делать.
У меня есть идеальная ссылка для вас, мой друг: 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.
И писать мои собственные рамки было лучшим, что я сделал (я на самом деле все еще делаю), так как я узнал гораздо больше, чем я ожидал.
По пути я узнал (чтобы назвать несколько):
И многие другие базовые вещи PHP, которые вы всегда случайно обнаруживаете от чтения чего-то.
Все это не только значительно улучшило мое понимание PHP и вещей, которые приходят с ним, на более продвинутый уровень, но также и некоторые коммерчески / широко используемые методы и принципы.
И это все усилило мою уверенность в использовании PHP в целом, что в свою очередь облегчает обучение.
Когда вы начинаете, вы изучаете основы – A (переменные), затем B (как написать основную функцию) и т. Д.
Но это не займет много времени, когда вы пытаетесь изучить более продвинутые вещи, чтобы учиться и использовать D и E, вам также нужно учиться и понимать F, G, H и J, а также знать тех, кого вы должны знайте K, L и M, и чтобы знать части L и M, вам сначала нужно понять N и O …
Это становится минным полем, так как попытка научиться чему-то сводится к тому, что нужно сначала изучить несколько других вещей, и эти другие вещи часто требуют понимания разных вещей.
И вы окажетесь в миле от того места, где вы начали, ваш ум покалывает и стреляет из него искры, и около 20 вкладок открываются с различными передовыми PHP-вещами, ни одна из которых вам на 100% удобнее.
Но со временем, с практикой и, безусловно, преданностью, все будет в порядке, и вы оглянетесь на код, даже на коллекцию файлов / классов, и подумайте: «Я написал это …»?
Написание структуры очень помогло с этим «минным полем», потому что:
Вы можете сделать это, как хотите. Это может быть не самая лучшая практика, но пока вы пытаетесь научиться лучшей практике, со временем вы улучшаетесь и, вероятно, проще, чем просто читать учебники, потому что вы контролируете, что и как вы что-то делаете.
Ну, во-первых, вы не можете изобретать колесо, это невозможно, поскольку вы просто сделаете колесо.
Когда люди говорят: «Не изобретайте велосипед», они, конечно, означают «там уже есть рамки», и, честно говоря, они написаны опытными разработчиками.
Это не значит, что у фреймворков нет проблем или проблем, но в целом они довольно прочные, безопасные и хорошо написанные.
Но утверждение бессмысленно по отношению к написанию собственных фреймворков!
Написание собственных рамок для учебных целей действительно полезно. Даже если вы планируете использовать его на коммерческой основе или для своего собственного сайта, вы не просто «заново изобрели колесо», вы сделали что-то еще.
Ваша инфраструктура не будет похожа на другие, у нее не будет много функций и функций, что может стать для вас основным преимуществом!
До тех пор, пока вы понимаете, о лучших методах безопасности и т. Д., Потому что вы можете думать, что пишете отличную систему, которая очень быстро и без всех наворотов, которые существуют в других фреймворках, но на самом деле у вас есть дыры в местах, где кто-то мог бы залезть. ,
Но проект обучения, который вы не используете в Интернете, идеален – или используйте его, в конце концов, когда вы достаточно продвинуты, чтобы знать, что это безопасно!
При всем том, что вы должны написать свои собственные рамки IF:
,
Без предыдущего опыта или передовых знаний о PHP вы, скорее всего, потратите некоторое время на создание структуры, дальнейшее чтение и знания покажут вам, что ваш подход искажен, и поэтому вы можете удалить все и начать заново.
Не унывайте это.
Я сделал именно это, так как я узнал так много продвинутых шаблонов и способов делать вещи на этом пути в первый месяц, я оказался там, где рефакторинг не был хорошим, и единственным вариантом был пустой холст с совершенно новым подходом.
Тем не менее, это было очень приятно, поскольку я увидел, что структура гораздо лучше сформировалась, и я мог видеть, что не только лучшая структура основы начинается, но и осознана, потому что я лучше понимал продвинутый PHP.
Просто сделай это! Просто убедитесь, что у вас есть план того, что вы хотите, прежде чем писать код.
Серьезно, напишите на бумаге, как вы собираетесь загружать проверку ошибок, собираетесь ли вы автоматически загружать или включать файлы по мере необходимости? У вас будет централизованный механизм загрузки, который создает классы, когда они вам понадобятся, или какой-либо другой метод?
Независимо от того, что вы делаете, и независимо от того, на какой стадии вы находитесь, если вы направляетесь на новую территорию, сначала планируйте ее. Вы будете рады этому, когда вы нажмете кирпичную стену, можете вернуться к своим планам и осознать небольшое отклонение от ваших планов , решив это.
В противном случае вы просто закончите беспорядок, не планируете или не переустраиваете его, чтобы решить текущую проблему или требования, с которыми вы сталкиваетесь.
Вы хотите создать точно то же самое, над чем я работал в течение нескольких лет, и результатом является Agile Toolkit.
$page->add('CRUD')->setModel('User');
Вся разбивка на страницы и многое другое реализованы через встроенную поддержку AJAX и Object Reloading. Ниже код показывает тематическую кнопку со случайной меткой. Кнопка перезагружается, если щелкнуть, показывая новый номер.
$b=$page->add('Button')->setLabel(rand(1,50)); $b->js('click')->reload();
Все проверки формы основаны на AJAX. Ответ от сервера – это цепочка JavaScript, которая указывает браузеру либо выделять и отображать сообщение об ошибке, либо перенаправлять на следующую страницу, либо выполнять любое другое действие javascript.
Сортировка таблиц и разбиение на страницы имеют очень интуитивную и простую реализацию, когда вы действительно можете перезагрузить объект.
Это кажется неуместным и неправильным. Шаблоны лучше в VCS.