Помощник
Здравствуйте, гость ( Вход | Регистрация )
Снова несколько вопросов по PHP и системе Eleanor |
Гость_wizard993_* |
2013-03-18, 23:39
Сообщение
#1
|
|
Гости |
Слежу за развитием системы, но из за плотного графика учёбы редко, когда успеваю вникнуть во все тонкости.
1. Снова вопрос по внутренностям Eleanor. Теперь заинтересовался шаблонизатором. Когда с пол-года назад, я и пользователь Djadka рассуждали на тему применения Fluent Interface на практике. В итоге всё закончилось тем, что Александр внёс довольно конкретные изменения в шаблонизатор. В этих изменениях, как всегда это бывает, когда я пытаюсь понять, что вообще Александр имел ввиду, мне очень понравилась свзяка с методом Template::__call() и методами Template_Mixed::_() и Template_List::_(). Честно говоря у меня сложилось впечатление, что это всё-таки какой-то паттерн проектирования (хотя я и не уверен). Ну повосхищались и хватит. Непонятно мне другое. Даже после того, как Александр прокомментировал код,
Может я совсем тупой и программирование - это не моё, но я так и не понял в чём смысл флага выполненной клонированности. Что было бы, если бы не клонировали объект, а использовали оригинал? Я попытался воссоздать это в песочнице (имею ввиду на локальном хосте), но так и не заметил разницы. Т.е. вот так Код:
index.php ( 634 байт ) Скачиваний: 0 Цитата Вывод в браузер (var_dump() перегружается xDebug'ом): string 'ipb' (length=3) array (size=1) 0 => string 'first' (length=5) string 'eleanor' (length=7) array (size=1) 0 => string 'second' (length=6) string 'joomla' (length=6) array (size=1) 0 => string 'third' (length=5) ipb eleanor joomla Меняем код на следующий:
index.php ( 474 байт ) Скачиваний: 0 Вывод остаётся тем же. В общем, не понял я идею. Если можно, поясните. (Возможно это не несёт нагрузки на код, а что-то вроде семантики?) 2. Теперь вопрос непосредственно про процесс обучения Web-developing'у. Александр, как-то где-то вас уже спрашивали, как вы учили PHP. Насколько я помню ответ заключался в юзаньи php.net и разборе кода. У меня вопрос в следующем. В php.net я могу подцепить всю основу языка, но вот вы, например, откуда вычитали про переменную $_SERVER['REDIRECT_QUERY_STRING'] ? (С этим $_SERVER'ом я вообще не пойму, где взять полный список того, что туда всовывают?) или откуда вы узнали про Singleton? Вот кусок кода, отвечающий за Zlib сжатие:
Видел аналогичную штуку в заметках на php.net, но там не расписано, почему отрезаются именно последние четыре байта (я потом нашёл, что это контроьная сумма и длина несжатых данных), но вот всё равно не понимаю, почему необходимо отрезать четыре байта и вставлять вручную полученную контрольную сумму. А я не думаю, что вы из таких людей, которые абы что и абы как вставляют в код. Может быть есть какие-то web-ресурсы где можно подробнее почитать? Или вы идёте и читаете RFC и какие-нибудь другие стандарты на английском языке? 3. Есть ли CMS/CMF/форумный движок (кроме Eleanor ), который вы считаете, ну если не эталоном, то заслуживающим внимания или разбора внутренностей? 4. Как вы учили JavaScript, есть ли какая-то литература, которую вы могли бы посоветовать и/или web-ресурсы для изучения и совершенствования навыков? 5. Не могли бы вы в кратце, но понятно и доступным языком объяснить, в каких случаях применяется конструкция (мини-паттерн/кодотрюк):
На php.net не отправляйте, там совсем мало и не очень понятно написано про вот эту конструкцию. Я как бы понимаю в принципе, что она делает, но когда используется не допираю) 6. Посоветуйте, пожалуйста, IDE для PHP. Я вот сейчас на Zend Studio 10 сижу Сообщение отредактировал wizard993 - 2013-03-18, 23:55 |
|
|
||
A1es |
2013-03-19, 0:05
Сообщение
#2
|
|
Любитель Группа: Eleanor user Сообщений: 180 Регистрация: 2009-04-19 Репутация: нет Всего: нет |
Мне тоже интересен этот вопрос, задавал его уже говорит что в библиотеке курил мануалы. Очень хотелось бы узнать побольше инфы на эту тему, особенно с чего начинать, на что обратить внимание. Саня колись
|
|
|
||
Alexander |
2013-03-19, 1:03
Сообщение
#3
|
|
Eleanor developer Группа: Администраторы Сообщений: 5 262 Регистрация: 2008-11-11 Из: Николаев Версия системы: RC5 Репутация: нет Всего: 67 |
Поясняю, зачем нужно копирование объекта. Для начала, представьте себе связку:
Теперь представим внутренности каждого из методов, для удобства запишем их в виде класса шаблона:
В результате, как не трудно догадаться, получится HTML код:
Но давайте немного изменим код, так, чтобы у нас был шаблон в шаблоне. Опять таки, для удобства, все методы будут внутри одного класса.
Попробуйте теперь интепретировать, как будет выполняться код. Не буду публиковать ответ ввиду того, что и времени мало и вам будет интересно самостоятельно протестить. Обычный var_dump. Видел аналогичную штуку в заметках на php.net, но там не расписано, почему отрезаются именно последние четыре байта (я потом нашёл, что это контроьная сумма и длина несжатых данных), но вот всё равно не понимаю, почему необходимо отрезать четыре байта и вставлять вручную полученную контрольную сумму. А я не думаю, что вы из таких людей, которые абы что и абы как вставляют в код. Некоторые вещи, которые работают, нужно принимать такими, какими они есть и не пытаться выебать себе мозг понять то, что требует долгого и скурпулезного курения манов. Откройте алгоритм преобразования доменных имен из и в punycode (класс так и называется). Я не сидел и не курил маны, а просто нашел где-то неплохую блок-схему преобразования и по ней написал код. Разбираться почему именно так, а не иначе у меня нет ни времени ни интереса. Изначально я учил делфи. Учил просто: накачивал себе исходников всевозможных в библиотеке с бесплатным Интернетом (давали 1 бесплатный час в неделю, для 2003 года это было очень круто). Потом дома сидел и пытался вдуматься в код. У меня дома не было ни Интернета, ни справочников, ни знакомых делфистов, которым можно задавать вопросы. Все вопросы я записывал в тетрадку и, когда следующий раз посещал библиотеку, быстро-быстро (за пол-часа, остальные пол-часа я тратил на выискивание новых исходников) пытался найти ответы на вопросы. Так, собственно, я и учился кодить. А когда пересаживался на PHP, у меня в общем-то был только сайт php.net и небольшой запас знаний делфи. Все вопросы я задавал сайту php.net и, о чудо, находил ответы. К сожалению, такой себе способ изучения имеет огромный минус: отсутствие теоретической базы. Именно поэтому я завалил 2 собеседования на должность разработчика PHP, по причине того, что не смог дать определение понятиям: инкапсуляция, рефакторинг, полиморфизм и т.п. В общем, на собеседования на соискателя доложности PHP разработчика не хожу Знаю точно, что IPB & PhpBB - это жопы. Остальные не ковырял, руки не доходили. Остальные же меня не устраивают с точки зрения здравого смысла. Например, VB у которого разные функции запускаются из разных файлов (showforum.php, showtopic.php) - такого идиотизма я не понимаю, поэтому и не ковыряю. Может и есть, но не встречал. Показывайте, посмотрю, оглашу свой вердикт. Да точно так же, как и PHP. Полезные веб-ресурсы это javascript.ru и phpjs.org - их двух мне хватает с головой. А, ну и еще api.jquery.com Мог бы, все очень просто. Хотя я не знаю, как это называется - сам доходил. Представьте себе бесконечный спуск if:
Так вот для удобства и экономии места, все выше можно зписать так:
Eleanor написан полностью PHP Expert Editor (для php файлов) и Notepad++ (для js файлов). Сейчас пытаюсь перейти на PHP Storm. Это мучительно больно: при всех его удобствах, то, что раньше казалось очень простым сейчас попросту отсутствует. Например:
... В общем такие маленькие, но очень полезные возможности весьма существенно облегчают разработку, поэтому до сих пор не могу перейти. Посоветовать тоже что-либо не могу, но Zend мне сразу не понравился. Сообщение отредактировал Alexander - 2013-03-19, 1:06 |
|
|
||
wormen |
2013-03-19, 2:36
Сообщение
#4
|
|
Опытный Группа: Eleanor user Сообщений: 800 Регистрация: 2012-09-13 Репутация: нет Всего: нет |
|
|
|
||
Alexander |
2013-03-19, 2:36
Сообщение
#5
|
|
Eleanor developer Группа: Администраторы Сообщений: 5 262 Регистрация: 2008-11-11 Из: Николаев Версия системы: RC5 Репутация: нет Всего: 67 |
wormen, а там доступны нужные мне удобности? Как распространяется?
|
|
|
||
wormen |
2013-03-19, 4:42
Сообщение
#6
|
|
Опытный Группа: Eleanor user Сообщений: 800 Регистрация: 2012-09-13 Репутация: нет Всего: нет |
насчет удобняшек, которые описаны в предыдущем твоем посте......если честно не проверял, и пользоваться ими не приходилось....лично меня более чем устраивает, есть весь нужный мне функционал
NetBeans IDE — лицензия GNU GPL v2, подробнее тут, офф. сайт тут ps. рекомендую для начинающих программистов Сообщение отредактировал wormen - 2013-03-19, 5:13 |
|
|
||
Гость_wizard993_* |
2013-03-19, 7:12
Сообщение
#7
|
|
Гости |
Цитата Обычный var_dump Alexander, я выпал в осадок Спасибо вам за ответы и советы. А вот как писалась Элеанор? Ну я имею ввиду с чего начали писать. Какой файл / класс был первым? И ещё интересует вопрос. Вот писали вы писали, а в какой момент появился дизайн? Ну на какаом этапе разработки я имею ввиду. |
|
|
||
Alexander |
2013-03-19, 20:11
Сообщение
#8
|
|
Eleanor developer Группа: Администраторы Сообщений: 5 262 Регистрация: 2008-11-11 Из: Николаев Версия системы: RC5 Репутация: нет Всего: 67 |
Не понял, что имелось ввиду? Поясните Первым написанным классом был класс Url. Поэтому система начиналась именно с него. Тогда меня категорически не устраивало что большинство CMS того времени (да и сейчас в общем) не умеют красиво реализовывать ЧПУ. В моём понимании, ЧПУ - это полностью человечная ссылка, которая не содержит каких-либо идентификаторов. Дизайн шел параллельно с разработкой. Сейчас, кстати, это уже третий дизайн админки. Предыдущие 2 вы можете увидеть в музее истории и развития Eleanor CMS. |
|
|
||
Гость_wizard993_* |
2013-03-19, 21:08
Сообщение
#9
|
|
Гости |
Я просто был совершенно уверен, что всё намного сложнее. Были мысли, что это где-то прописано в стандартах или в мануале, но я не могу этого найти. А в итоге оказывается, что это простой, банально простой var_dump(). И пока не отошёл от темы задам ещё вопрос, потому что, несмотря на мануал я не понимаю. Из того, что написано в мануале, я сделал, возможно неправильный вывод, о том, что $_SERVER['ключ'] и getenv('ключ') это эквивалентно. Тем не менее в одном из апдейтов на GoogleCode я заметил, что вы заменили вызов $_SERVER на getenv для какого-то ключа (сейчас уже не помню точно для какого). Не могли бы вы объяснить разницу между $_SERVER['ключ'] и getenv('ключ'). Кстати, Александр, огромное спасибо за подсказки и разъяснение про клонирование в шаблонизаторе. Воссоздал этот класс в песочнице, потом попробовал тоже самое на Eleanor. Идею понял. Честно говоря, всё оказалось просто, впрочем, как и всегда (чувствую себя дерьмом ). Получается, примерно следующее:
И каждый из методов, например, MyPiceOfTemplate2() может внутри себя содержать вызов ещё нескольких цепочек, каждая из которых является отдельным, друг от друга независимым объектом. Ну я уже более-менее на короткой ноге с этим классом. Разобрался как и что в основном работает, также благодаря вашим разъяснениям. Очень нравится регулярка в .htaccess, где после индекса добавляется !. Я ещё не встречал нигде подобной идеи. Ещё жду того момента, когда там появится __invoke(). Очень интересно посмотреть, что вы придумаете, поскольку там же есть ещё __construct() + в ядре есть __get(). Как всё это вместе будет работать - для меня пока загадка. Но скорее всего, всё будет как всегда - ещё какая-нибудь хитрая связка, видя которую глаза вылетают из орбит, а на деле получится всё как два пальца Я так понимаю, у вас есть знакомый или друг, который дизайном занимается? Или вы какую-то простейшую вёрстку сами писали? Просто где-то в постах встречал, вы говорили, что не очень разбираетесь в CSS. Ещё интересно как писалось ядро (RC1 - RC5 я видел). Сам код понятно - открыл и посмотрел. Интересен сам подход и процесс. Т.е. как проектировалось (или же всё писалось в порыве творческого вдохновения без каких-то набросков), что шло первым, что писалось потом. Почему решили делать ядро именно на Singleton'е (я видел в интернете кучу постов, где кулцхакеры писали, что синглтон - говно, потому что потом возникают проблемы с масштабированностью. Какие конкретно проблемы, естественно никто не писал, но бурление говна было чуть больше, чем дох*я). Почему от -> решили перейти к :: (имеется ввиду $Mainclass->тратата. В RC5 этих стрелочек была тьма)? Сообщение отредактировал wizard993 - 2013-03-19, 21:18 |
|
|
||
Alexander |
2013-03-19, 21:37
Сообщение
#10
|
|
Eleanor developer Группа: Администраторы Сообщений: 5 262 Регистрация: 2008-11-11 Из: Николаев Версия системы: RC5 Репутация: нет Всего: 67 |
Из того, что написано в мануале, я сделал, возможно неправильный вывод, о том, что $_SERVER['ключ'] и getenv('ключ') это эквивалентно. Тем не менее в одном из апдейтов на GoogleCode я заметил, что вы заменили вызов $_SERVER на getenv для какого-то ключа (сейчас уже не помню точно для какого). Не могли бы вы объяснить разницу между $_SERVER['ключ'] и getenv('ключ'). Все тоже очень просто. На самом деле getenv эквивалентно
Поэтому, чтобы много не писать, я воспользовался готовым решением. Стемлюсь к краткости. Не все переменные $_SERVER предопределены на разных хостингах. Ещё жду того момента, когда там появится __invoke(). Очень интересно посмотреть, что вы придумаете, поскольку там же есть ещё __construct() + в ядре есть __get(). Как всё это вместе будет работать - для меня пока загадка. Но скорее всего, всё будет как всегда - ещё какая-нибудь хитрая связка, видя которую глаза вылетают из орбит, а на деле получится всё как два пальца Лучше не ждать, а задать конкретный вопрос - я напишу вас своё виденье решения. Это было вынуждено, поскольку однажды мне сильно понадобилась поддержка URL смешанного типа вроде /news/новость.html?param=value . Попробовав массу вариантов, каждый раз всплывали какие-то глюки. В результате, остановился на том, что есть сейчас. Вроде работает. Друг этот centroarts.com . Мои познания в css действительно скудны. Удобство. Мне сейчас нужно, чтобы доступ к ядру системы был максимально, скажем так, минимизирован. Раньше для доступа к БД, приходилось писать:
Сейчас же можно гораздо проще:
Singleton может и плох, но как по-другому сделать удобно, я пока не знаю. Основным и единственным смыслом Singleton класса Eleanor является автозагрузка классов с автоматическим созданием стандартного объекта. Так, например, в RC5 приходилось писать:
Сейчас же все гораздо проще:
При таком обращении, система автоматически находит нужный класс, подгружает его и создает объект. Если подскажете мне, как сделать еще удобнее (желательно, с отказом от Singleton) - без проблем сделаю Кроме того, я уделяю много внимания оптимизации кода. В RC5 была беда: перекрестные ссылки - однозначеное зло. С переходом на PHP 5.3, появились новые возможности, которые позволили мне отказаться от перекрестных ссылок и оптимизировать код. |
|
|
||
Гость_wizard993_* |
2013-03-31, 22:32
Сообщение
#11
|
|
Гости |
Это было вынуждено, поскольку однажды мне сильно понадобилась поддержка URL смешанного типа вроде /news/новость.html?param=value . Попробовав массу вариантов, каждый раз всплывали какие-то глюки. В результате, остановился на том, что есть сейчас. Вроде работает. По-моему решение очень даже неплохое. В особенности облегчает идентификацию типа ссылки - ЧПУ или динамика. А вот как лично Вы считаете, чем плох Singleton? Я бы с радостью подсказал, но я не вижу смысла в отказе от такой концепции. Начиная с RC1 ядро Eleanor использовало Singleton. Было другое API для вызова методов, но пофакту внутри находился Singleton. По-моему - отказаться от Singleton - это заново писать ядро. Окей. Александр, хотелось бы узнать ваше виденье решения по поводу создания __invoke(){} для класса Url Сообщение отредактировал wizard993 - 2013-03-31, 22:33 |
|
|
||
Alexander |
2013-03-31, 23:58
Сообщение
#12
|
|
Eleanor developer Группа: Администраторы Сообщений: 5 262 Регистрация: 2008-11-11 Из: Николаев Версия системы: RC5 Репутация: нет Всего: 67 |
По-сути, он нарушает концепцию ООП, когда от одного класса я могу создать сколько угодно объектов. Получается, что Singleton, это какой-то костыль, потому что (теоретически) статические методы / переменные класса должны его полностью заменить. Но! У него есть очень сильная сторона: удобная передача самого себя разным частям кода. Тоесть мне удобно передавать и работать с объектом внутри различных функций и классов. Попробуйте переписать следующий код на манер статических переменных и методов:
Возможно, код покажется плохо применимым в реальной жизни, но смысл только в том, что объекты более удобно передавать нежели названия классов в виде строк. Есть еще и вторая: конструктор и деструктор, но это и так понятно. Я вижу только одно решение: использовать в качестве замены метода Construct. Но год назад я уже пытался так делать, получились жуткие тормоза. Может быть сейчас дело обстоит чуть лучше, не знаю, проверьте. |
|
|
||
Гость_wizard993_* |
2013-04-04, 18:55
Сообщение
#13
|
|
Гости |
пробовал делать так: 1. В ядро (класс Eleanor) добавляю коллер:
2. В классе Url рaскомментировал public function __invoke() 3. Замерил следующим образом время:
(Код вставил в индекс шаблона) Затем стёр ->Construct и снова замерил. ЧПУ включено в первом случае показал такие цифры: Время: ~7.085 Память: ~1.527 Пик памяти: ~1.673 во втором: Время: ~13.416 Память: ~1.526 Пик памяти: ~1.673 т.е. на память не влияет, а вот тормоза ощутимые. версия PHP: 5.4.13 Подозреваю, что со временем такие "чудеса" проделывает __call(). Возможно следует решать проблему с другой стороны. Ещё подумаю. Сообщение отредактировал wizard993 - 2013-04-04, 19:16 |
|
|
||
Alexander |
2013-04-04, 20:14
Сообщение
#14
|
|
Eleanor developer Группа: Администраторы Сообщений: 5 262 Регистрация: 2008-11-11 Из: Николаев Версия системы: RC5 Репутация: нет Всего: 67 |
wizard993, не совсем понятно зачем нужен был первый шаг: в BaseClass это и так предусмотрено.
Для хорошего теста, нужно все содержимое метода Construct скопировать в __invoke. И тогда тестить. Как не трудно догадаться, при __invoke идет в ~4 раза больше вызов всяких методов. |
|
|
||
Гость_wizard993_* |
2013-04-04, 20:19
Сообщение
#15
|
|
Гости |
В BaseClass смутило
Из мануала следует: Цитата Функция property_exists() не определяет магически доступные свойства с помощью метода __get. Учту. Будем искать Сообщение отредактировал wizard993 - 2013-04-04, 20:28 |
|
|
||
Alexander |
2013-04-04, 22:35
Сообщение
#16
|
|
Eleanor developer Группа: Администраторы Сообщений: 5 262 Регистрация: 2008-11-11 Из: Николаев Версия системы: RC5 Репутация: нет Всего: 67 |
|
|
|
||
Гость_wizard993_* |
2013-04-04, 23:49
Сообщение
#17
|
|
Гости |
так. или я уже заучился, или я чего-то не понимаю Разбираю попорядку. $Eleanor - это переменная, которая хранит объект класса Eleanor; Существует 3 вида обращения к разным субъектам, релизуемые через эту переменную 1. $Eleanor->Object($propetries); 2. $Eleanor->Object->ObjMethod($propetries); 3. $Eleanor->dynamic_public_propetry; Нас интересует первый пункт. То есть как передать параметры объекту. Т.к. метода Object в классе Eleanor не существует, нас перенаправляет в метод __call() класса BaseClass А там условие:
Т.к. свойства Object в классе Eleanor не существует, то property_exists($this,$n) возвращает false -> if возвращает false -> идём логировать ошибку. Следовательно ничего не получилось. Что я упустил в рассуждениях? Сообщение отредактировал wizard993 - 2013-04-05, 7:48 |
|
|
||
Alexander |
2013-04-05, 1:13
Сообщение
#18
|
|
Eleanor developer Группа: Администраторы Сообщений: 5 262 Регистрация: 2008-11-11 Из: Николаев Версия системы: RC5 Репутация: нет Всего: 67 |
Цитата Т.к. свойства Object в классе Eleanor не существует, то property_exists($this,$n) возвращает false -> if возвращает false -> идём логировать ошибку. Следовательно ничего не получилось. Что я упустил в рассуждениях? Я просто не учел, что вы вызываете Url первый раз. В моейм представлении, объект $Eleanor->Url уже вызывался ранее, а занчит - это уже просто свойство объекта $Eleanor. Сообщение отредактировал Alexander - 2013-04-05, 1:13 |
|
|
||
Текстовая версия | 0.0654 сек. 12 запросов GZIP включен Сейчас: 2024-09-25, 7:14 |