{ непрограммистам будет неинтересно – вот вам лучше фотки } Начал изучать PHP 😉 Я на этом языке программирую уже где-то 6 лет, чтоб не соврать – вот решил его выучить, наконец 😉 На самом деле, я глубоко им никогда не интересовался – разобрался в основных конструкциях, и на этом остановился. С тех пор и язык изменился, на самом деле – когда я начинал, он еще даже не был объектно-ориентированным, кажись. В общем, стал разбираться. Я не перестаю балдеть, что тот “движок”, который я написал на коленке (в буквальном смысле!), работая на заправке, по сей день используется в разработке коммерческих сайтов – на нем создано не менее 200-х проектов (я сам около 100 сделал) общей стоимостью в страшные вообще деньги 😉 При этом движок – слова доброго не заслуживает, я реально на нем изучал PHP. А до этого я изучал ASP на незабвенном проекте jubaree – именно для него и был создан этот безымянный “фреймворк”, который впоследствии я перевел на PHP, причем очень криво. Что забавно, этот движок без моего разрешения использовала конкурирующая фирма в Донецке – не будем показывать пальцем; ну да мне это скорей приятно, чем обидно 😉 Подзачитал немного по новым pattern’ам программирования, узнал много нового – я реально отстал от жизни. Поизучал немного объектно-ориентированные возможности PHP, а то я их не использовал никогда. Почитал про динамически подключаемые поля к классам и прочие полумагические вещи – интересно, и даже полезно. Посмеялся над невозможностью создания нескольких конструкторов с разным набором параметров, придумал забавный выход через статические функции. В общем, хочу на какое-то время вернуться в амплуа программера – у меня это довольно хорошо получается, на самом деле, что там скромничать – мастерство не пропьешь 😉 Я как раз книжку читаю на эту тему сейчас – у каждого человека есть свои таланты и предрасположенности, которые даны ему с рождения, и типа задача не в том, чтобы научиться делать хорошо какие-то _чужие_ вещи, а в том, чтобы максимально раскрыть _свой_ потенциал, _свои_ таланты. Программирование и вообще всякие логические штуки – это однозначно моя стихия (в отличие от, например, отношений с людьми, музыки, рисования) – и никуда эти способности от меня не делись – некуда им деваться, человек не меняется в этом плане. Поэтому, кстати, задача грамотных родителей состоит не в том, чтобы выбрать удачную карьеру для своего ребенка, а в том, чтобы дать ему попробовать всего понемножку и вовремя заметить, в чем именно его призвание – ну и обеспечить наилучшие условия для раскрытия того потенциала, который, вообще говоря, был создан в момент оплодотворения. Отбился от темы децл 😉 Я ж за движок рассказываю. Компания растет, технологии улучшаются, подходы к программированию меняются, а мы все сидим на этом старом коде. Пора двигаться вперед. Приступил к разработке нового движка. Ознакомился со следующими фреймворками: Django, Zend Framework, Symfony, CakePHP, Qcodo. Django мне _очень_ понравилась. Модель описывается именно так, как мне бы и хотелось: таблица это класс, поля это члены класса, причем тоже объекты – и вся информация о поле инкапсулирована в эти переменные. То, что надо. Автоматом генерится база, автоматом создается “админка”. Прекрасная система шаблонов, с наследованием. Мощная вещь, короче. Но это не PHP, это Питон… а с Питоном другая проблема – специалистов мало, и хорошие специалисты очень знают себе цену… а самое главное – не желают заниматься рутинной работой. Готовить специалистов с нуля, обучая новых людей новому языку программирования, а потом смотреть, как они уходят – долго, дорого и грустно. PHP-шников довольно много, они непритязательные и по сравнению с питонщиками недорогие, к тому же дофига опытных программистов, которые умеют решать конкретные real life задачи, а не только вести мастер-классы – не будем показывать пальцем опять 😉 К тому же нам как ни крути нужно поддерживать полтыщи старых проектов на PHP, так что совсем от этого устаревшего языка нам не уйти. Ну и еще есть пара соображений… в общем, от Django пришлось отказаться. Zend Framework совсем не такой, как другие – это не полный фреймворк, а только component framework, т.е. в общем-то набор библиотек, только объектно-ориентированное все. Список клиентов, case studies – впечатляют. Ну и вообще, Zend это ж создатели PHP, серьезная корпорация и все такое. Symfony и CakePHP намного более дружелюбные поначалу, но ZF производит намного более серьезное и профессиональное впечатление. В Qcodo мне понравился подход к Code Generation, но система очень сырая – такое юзать мы точно не будем. Что сильно удивило, так это то, что ни один из популярных фреймворков для PHP не умеет делать админку. В CakePHP есть так называемый scaffolding, но это недоделанное порно, его использовать в production нельзя даже и близко. То, что делает Django – это единственный вариант автоматически-создаваемого бекенда, который можно продать без доработки (и мук совести). Он неплохой, и в некоторых вещах он даже лучше, чем то, что я написал 5 лет назад 😉 Но если брать в общем, то бекенд, создаваемый моим “движком” таки более продвинутый, чем даже джанговский, не говоря уже о пхп-шных фреймворках. Вот те фичи, которые делают его по-настоящему полезным: 1) Поддержка foreign keys: в списке записей показывается инфа из foreign таблицы (форматирование на базе шаблона), при редактировании выбор записи осуществляется либо из списка в dropdown’е, либо через popup (если записей много), либо через ajax’овый suggest combobox (это новая, подглючивающая фича ;), по каждому объекту автоматом показываются кол-во подчиненных объектов их ссылающихся на него таблиц 2) Поддержка many-to-many полей 3) Поддержка картинок и загружаемых файлов; картинки ужимаются в thumbnails автоматом 4) Фильтрация по любым типам полей: по датам, по числовым, по строкам, по текстам, по ссылочным, даже по файлам, картинкам и many-to-many 5) Задаваемый пользователем порядок следования записей, когда надо 6) Поддержка иерархических структур; фильтрация по поддереву В общем, все что надо – все есть. Средний бекенд для типового проекта делается за 2 часа – это значительно дольше, чем на Джанге, правда, потому что не соблюдается DRY principle и вообще. Весь викенд занимался research’ем на тему современных фреймворков, и судя по тому, что пишет народ в форумах, такая функциональность нужна _всем_ – а есть она только в джанге. Короче, начал писать новый движок – на базе Zend Framework. Вернее, это будет именно генерилка админки, ну и может там пару вспомогательных функций – с терминологией и именем проекта надо еще определиться 😉 Подумываю сделать движок Open Source – не уверен, как к этому отнесутся партнеры по бизнесу, правда, но в принципе это может быть даже выгодно – если движок получится хорошим (почему нет?) и приобретет большую популярность (почему нет?), то он может стать достаточно известным продуктом – а уж сделать на этом деньги ума много не надо имхо. В общем, впереди много кодирования. Ну и напоследок, вот немножко кода на тему конструкторов в PHP:
// допустим, нам хочется класс Apple, который, в зависимости от контекста мы хотим // создавать либо как // $apple = new Apple($color, $size) // либо как // $apple = new Apple($color, $price, $weight) // т.е. с разным набором параметров в конструкторе, потому что нам нужны // разные наборы полей. Вот два способа: class AppleCherezZhopu { var $color, $size, $price, $weight; function __construct() { $argn = func_num_args(); if($argn<>2 and $argn<>3) throw new Exception('[AppleCherezZhopu::__construct] Invalid number of arguments'); $argv = func_get_args(); if($argn==2) { $this->color = $argv[1]; $this->size = $argv[2]; } else // if($argn==3) { $this->color = $argv[1]; $this->price = $argv[2]; $this->weight = $argv[3]; } } } $apple_cherez_zhopu1 = new AppleCherezZhopu('red', 'medium'); $apple_cherez_zhopu2 = new AppleCherezZhopu('green', 2.50, 3); class GoodApple() { var $color, $size, $price, $weight; private function __construct() { // приватный конструктор снаружи даже и вызвать нельзя } static function ForCatalog($color, $size) { $apple = new GoodApple(); $apple->color = $color; $apple->size = $size; return $apple; } static function ForShoppingCart($color, $price, $weight) { $apple = new GoodApple(); $apple->color = $color; $apple->price = $price; $apple->weight = $weight; return $apple; } } // второй вариант читается намного лучше - и в описании класса, и в создании объекта: $good_apple1 = GoodApple::ForCatalog('red', 'medium'); $good_apple2 = GoodApple::ForShoppingCart('green', 2.50, 3);
Leave a Reply