X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Снова несколько вопросов по PHP и системе Eleanor
Гость_wizard993_*
сообщение 2013-03-18, 23:39
Сообщение #1



Гости





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

1. Снова вопрос по внутренностям Eleanor. Теперь заинтересовался шаблонизатором. Когда с пол-года назад, я и пользователь Djadka рассуждали на тему применения Fluent Interface на практике. В итоге всё закончилось тем, что Александр внёс довольно конкретные изменения в шаблонизатор. В этих изменениях, как всегда это бывает, когда я пытаюсь понять, что вообще Александр имел ввиду, мне очень понравилась свзяка с методом Template::__call() и методами Template_Mixed::_() и Template_List::_(). Честно говоря у меня сложилось впечатление, что это всё-таки какой-то паттерн проектирования (хотя я и не уверен). Ну повосхищались и хватит. Непонятно мне другое. Даже после того, как Александр прокомментировал код,

public
	$s='',#Аккомулятор результатов
	$cloned=false;#Флаг выполненной клонированости. Смысл состоит в том, что каждый fluent interface - отдельный независимый объект.


Может я совсем тупой и программирование - это не моё, но я так и не понял в чём смысл флага выполненной клонированности. Что было бы, если бы не клонировали объект, а использовали оригинал? Я попытался воссоздать это в песочнице (имею ввиду на локальном хосте), но так и не заметил разницы.
Т.е. вот так
Код:

<?php
abstract class E
{
	public
		$s=&apos;&apos;,
		$cloned=false;
	
	public function __toString()
	{
		$s=$this->s;
		$this->s=&apos;&apos;;
		return$s;
	}
	
	public function __clone()
	{
		$this->cloned=true;
	}
	
	public function __call($n,array$p)
	{
		if(!$this->cloned)
		{
			$O=clone$this;
			return$O->__call($n,$p);
		}
		$r=$this->_($n,$p);
		$this->s.=$r.&apos; &apos;;
		return$this;
	}
	
	abstract function _($n,array$p);
}

class A extends E
{
	public
		$n;
	
	public function _($n,array$p)
	{
		var_dump($n,$p);
		return$n;
	}
}
$A=new A;
echo$A->ipb(&apos;first&apos;)->eleanor(&apos;second&apos;)->joomla(&apos;third&apos;);
?>

Прикрепленные файлы  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


Меняем код на следующий:

<?php
abstract class E
{
	public
		$s=&apos;&apos;;
	
	public function __toString()
	{
		$s=$this->s;
		$this->s=&apos;&apos;;
		return$s;
	}
	
	public function __call($n,array$p)
	{
		$r=$this->_($n,$p);
		$this->s.=$r.&apos; &apos;;
		return$this;
	}
	
	abstract function _($n,array$p);
}

class A extends E
{
	public
		$n;
	
	public function _($n,array$p)
	{
		var_dump($n,$p);
		return$n;
	}
}
$A=new A;
echo$A->ipb(&apos;first&apos;)->eleanor(&apos;second&apos;)->joomla(&apos;third&apos;);
?>

Прикрепленные файлы  index.php ( 474 байт ) Скачиваний: 0

Вывод остаётся тем же. В общем, не понял я идею. Если можно, поясните. (Возможно это не несёт нагрузки на код, а что-то вроде семантики?)

2. Теперь вопрос непосредственно про процесс обучения Web-developing'у. Александр, как-то где-то вас уже спрашивали, как вы учили PHP. Насколько я помню ответ заключался в юзаньи php.net и разборе кода. У меня вопрос в следующем. В php.net я могу подцепить всю основу языка, но вот вы, например, откуда вычитали про переменную $_SERVER['REDIRECT_QUERY_STRING'] ? (С этим $_SERVER'ом я вообще не пойму, где взять полный список того, что туда всовывают?) или откуда вы узнали про Singleton?
Вот кусок кода, отвечающий за Zlib сжатие:

$s=gzcompress($s,1);
$s=substr($s,0,-4);
$s="\x1f\x8b\x08\x00\x00\x00\x00\x00".$s.pack(&apos;V&apos;,$gcrc).pack(&apos;V&apos;,$gsize);

Видел аналогичную штуку в заметках на php.net, но там не расписано, почему отрезаются именно последние четыре байта (я потом нашёл, что это контроьная сумма и длина несжатых данных), но вот всё равно не понимаю, почему необходимо отрезать четыре байта и вставлять вручную полученную контрольную сумму. А я не думаю, что вы из таких людей, которые абы что и абы как вставляют в код.
Может быть есть какие-то web-ресурсы где можно подробнее почитать? Или вы идёте и читаете RFC и какие-нибудь другие стандарты на английском языке?

3. Есть ли CMS/CMF/форумный движок (кроме Eleanor :D ), который вы считаете, ну если не эталоном, то заслуживающим внимания или разбора внутренностей?
4. Как вы учили JavaScript, есть ли какая-то литература, которую вы могли бы посоветовать и/или web-ресурсы для изучения и совершенствования навыков?

5. Не могли бы вы в кратце, но понятно и доступным языком :) объяснить, в каких случаях применяется конструкция (мини-паттерн/кодотрюк):

do
{
    #... код
}
while(false);

На php.net не отправляйте, там совсем мало и не очень понятно написано про вот эту конструкцию. Я как бы понимаю в принципе, что она делает, но когда используется не допираю)
6. Посоветуйте, пожалуйста, IDE для PHP. Я вот сейчас на Zend Studio 10 сижу

Сообщение отредактировал wizard993 - 2013-03-18, 23:55

Прикрепленные файлы
Прикрепленные файлы  index.php ( 634 байт ) Скачиваний: 0
Прикрепленные файлы  index.php ( 474 байт ) Скачиваний: 0
 
Перейти в начало страницы
+Цитировать сообщение
A1es
сообщение 2013-03-19, 0:05
Сообщение #2
Любитель
Иконка группы

Группа: Eleanor user
Сообщений: 180
Регистрация: 2009-04-19

Репутация:   нет  
Всего: нет


Мне тоже интересен этот вопрос, задавал его уже говорит что в библиотеке курил мануалы. Очень хотелось бы узнать побольше инфы на эту тему, особенно с чего начинать, на что обратить внимание. Саня колись :popcorm2:
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2013-03-19, 1:03
Сообщение #3
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


Цитата (wizard993 @ 2024-03-28 13:23)
Вывод остаётся тем же. В общем, не понял я идею. Если можно, поясните. (Возможно это не несёт нагрузки на код, а что-то вроде семантики?)

Поясняю, зачем нужно копирование объекта. Для начала, представьте себе связку:

echo Eleanor::$Template->Fist()->Second()->Third();


Теперь представим внутренности каждого из методов, для удобства запишем их в виде класса шаблона:

class TplMyTemplate
{
	public static function First()
	{
		return 'First<br />';
	}
	
	public static function Second()
	{
		return 'Second<br />';
	}
	
	public static function Third()
	{
		return 'Third<br />';
	}
}


В результате, как не трудно догадаться, получится HTML код:

First<br />
Second<br />
Third<br />


Но давайте немного изменим код, так, чтобы у нас был шаблон в шаблоне. Опять таки, для удобства, все методы будут внутри одного класса.
class TplMyTemplate
{
	public static function First()
	{
		return 'First<br />';
	}
	
	public static function Second()
	{
		$runned=Eleanor::$Template->Runned();
		return 'Second'.$runned.'<br />';
	}
	
	public static function Third()
	{
		return 'Third<br />';
	}
	
	public static function Runned()
	{
		return 'Was runned...';
	}
}

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

Цитата (wizard993 @ 2024-03-28 13:23)
вы, например, откуда вычитали про переменную $_SERVER['REDIRECT_QUERY_STRING'] ?

Обычный var_dump. :)

Цитата (wizard993 @ 2024-03-28 13:23)
Видел аналогичную штуку в заметках на php.net, но там не расписано, почему отрезаются именно последние четыре байта (я потом нашёл, что это контроьная сумма и длина несжатых данных), но вот всё равно не понимаю, почему необходимо отрезать четыре байта и вставлять вручную полученную контрольную сумму. А я не думаю, что вы из таких людей, которые абы что и абы как вставляют в код.

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

Цитата (wizard993 @ 2024-03-28 13:23)
Александр, как-то где-то вас уже спрашивали, как вы учили PHP. Насколько я помню ответ заключался в юзаньи php.net и разборе кода.

Изначально я учил делфи. Учил просто: накачивал себе исходников всевозможных в библиотеке с бесплатным Интернетом (давали 1 бесплатный час в неделю, для 2003 года это было очень круто). Потом дома сидел и пытался вдуматься в код. У меня дома не было ни Интернета, ни справочников, ни знакомых делфистов, которым можно задавать вопросы. Все вопросы я записывал в тетрадку и, когда следующий раз посещал библиотеку, быстро-быстро (за пол-часа, остальные пол-часа я тратил на выискивание новых исходников) пытался найти ответы на вопросы. Так, собственно, я и учился кодить. А когда пересаживался на PHP, у меня в общем-то был только сайт php.net и небольшой запас знаний делфи. Все вопросы я задавал сайту php.net и, о чудо, находил ответы.
К сожалению, такой себе способ изучения имеет огромный минус: отсутствие теоретической базы. Именно поэтому я завалил 2 собеседования на должность разработчика PHP, по причине того, что не смог дать определение понятиям: инкапсуляция, рефакторинг, полиморфизм и т.п. В общем, на собеседования на соискателя доложности PHP разработчика не хожу :)

Цитата (wizard993 @ 2024-03-28 13:23)
3. Есть ли CMS/CMF/форумный движок (кроме Eleanor ), который вы считаете, ну если не эталоном, то заслуживающим внимания или разбора внутренностей?

Знаю точно, что IPB & PhpBB - это жопы. Остальные не ковырял, руки не доходили. Остальные же меня не устраивают с точки зрения здравого смысла. Например, VB у которого разные функции запускаются из разных файлов (showforum.php, showtopic.php) - такого идиотизма я не понимаю, поэтому и не ковыряю. Может и есть, но не встречал. Показывайте, посмотрю, оглашу свой вердикт.

Цитата (wizard993 @ 2024-03-28 13:23)
4. Как вы учили JavaScript, есть ли какая-то литература, которую вы могли бы посоветовать и/или web-ресурсы для изучения и совершенствования навыков?

Да точно так же, как и PHP. Полезные веб-ресурсы это javascript.ru и phpjs.org - их двух мне хватает с головой. А, ну и еще api.jquery.com :)

Цитата (wizard993 @ 2024-03-28 13:23)
5. Не могли бы вы в кратце, но понятно и доступным языком объяснить, в каких случаях применяется конструкция (мини-паттерн/кодотрюк):

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

if(...)
{
	Something();
	if(...)
	{
		Something();
		if(...)
		{
			Something();
			if(...)
			{
				Something();
				...	
			}
		}
	}
}


Так вот для удобства и экономии места, все выше можно зписать так:

do
{
	Something();
	if(!...)
		break;

	Something();
	if(!...)
		break;
		
	Something();
	if(!...)
		break;
		
	Something();
	if(!...)
		break;
	...
}while(false);


Цитата (wizard993 @ 2024-03-28 13:23)
6. Посоветуйте, пожалуйста, IDE для PHP. Я вот сейчас на Zend Studio 10 сижу

Eleanor написан полностью PHP Expert Editor (для php файлов) и Notepad++ (для js файлов). Сейчас пытаюсь перейти на PHP Storm. Это мучительно больно: при всех его удобствах, то, что раньше казалось очень простым сейчас попросту отсутствует. Например:
  • Как добавить BOM в файл? В Notepad++ это 2 клика мышью.
  • Как поставить bookmark в средине файла? В PHP Expert Editor это Alt+[цифра], переход к точке Ctrl+[цифра]
  • Как проверить синтаксис (отсутствие Parse Error-ов)? В PHP Expert Editor это F7.
  • Как перейти к первой и последней {, }, [, ], (, ) выражения? В PHP Expert Editor это Ctrl+[

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

Сообщение отредактировал Alexander - 2013-03-19, 1:06
Перейти в начало страницы
+Цитировать сообщение
wormen
сообщение 2013-03-19, 2:36
Сообщение #4
Опытный
Иконка группы

Группа: Eleanor user
Сообщений: 800
Регистрация: 2012-09-13

Репутация:   нет  
Всего: нет



Цитата (wizard993 @ 2013-03-19 03:30) 
6. Посоветуйте, пожалуйста, IDE для PHP. Я вот сейчас на Zend Studio 10 сижу

Еще NetBeans неплох, я на нем пишу
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2013-03-19, 2:36
Сообщение #5
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


wormen, а там доступны нужные мне удобности? Как распространяется?
Перейти в начало страницы
+Цитировать сообщение
wormen
сообщение 2013-03-19, 4:42
Сообщение #6
Опытный
Иконка группы

Группа: Eleanor user
Сообщений: 800
Регистрация: 2012-09-13

Репутация:   нет  
Всего: нет


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

NetBeans IDE — лицензия GNU GPL v2, подробнее тут, офф. сайт тут

p
s. рекомендую для начинающих программистов


Сообщение отредактировал 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 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


Цитата (wizard993 @ 2024-03-28 13:23)
Alexander, я выпал в осадок

Не понял, что имелось ввиду? Поясните :)

Цитата (wizard993 @ 2024-03-28 13:23)
А вот как писалась Элеанор? Ну я имею ввиду с чего начали писать. Какой файл / класс был первым?

Первым написанным классом был класс Url. Поэтому система начиналась именно с него. Тогда меня категорически не устраивало что большинство CMS того времени (да и сейчас в общем) не умеют красиво реализовывать ЧПУ. В моём понимании, ЧПУ - это полностью человечная ссылка, которая не содержит каких-либо идентификаторов.

Цитата (wizard993 @ 2024-03-28 13:23)
И ещё интересует вопрос. Вот писали вы писали, а в какой момент появился дизайн?

Дизайн шел параллельно с разработкой. Сейчас, кстати, это уже третий дизайн админки. Предыдущие 2 вы можете увидеть в музее истории и развития Eleanor CMS.
Перейти в начало страницы
+Цитировать сообщение
Гость_wizard993_*
сообщение 2013-03-19, 21:08
Сообщение #9



Гости





Цитата (Alexander @ 2013-03-19, 20:11)
Не понял, что имелось ввиду? Поясните :)

Я просто был совершенно уверен, что всё намного сложнее. Были мысли, что это где-то прописано в стандартах или в мануале, но я не могу этого найти. А в итоге оказывается, что это простой, банально простой var_dump().

И пока не отошёл от темы задам ещё вопрос, потому что, несмотря на мануал я не понимаю. Из того, что написано в мануале, я сделал, возможно неправильный вывод, о том, что $_SERVER['ключ'] и getenv('ключ') это эквивалентно. Тем не менее в одном из апдейтов на GoogleCode я заметил, что вы заменили вызов $_SERVER на getenv для какого-то ключа (сейчас уже не помню точно для какого). Не могли бы вы объяснить разницу между $_SERVER['ключ'] и getenv('ключ').

Кстати, Александр, огромное спасибо за подсказки и разъяснение про клонирование в шаблонизаторе. Воссоздал этот класс в песочнице, потом попробовал тоже самое на Eleanor. Идею понял. Честно говоря, всё оказалось просто, впрочем, как и всегда (чувствую себя дерьмом :) ).
Получается, примерно следующее:
Eleanor::$Template->queue[]=&apos;TplMyTemplate&apos;;
echo Eleanor::$Template->MyPiceOfTemplate1(...)->MyPiceOfTemplate2(...)->MyPiceOfTemplate3(...);

И каждый из методов, например, MyPiceOfTemplate2() может внутри себя содержать вызов ещё нескольких цепочек, каждая из которых является отдельным, друг от друга независимым объектом.
Цитата (Alexander @ 2013-03-19, 20:11)
Тогда меня категорически не устраивало что большинство CMS того времени (да и сейчас в общем) не умеют красиво реализовывать ЧПУ

Ну я уже более-менее на короткой ноге с этим классом. Разобрался как и что в основном работает, также благодаря вашим разъяснениям. Очень нравится регулярка в .htaccess, где после индекса добавляется !. Я ещё не встречал нигде подобной идеи.
Ещё жду того момента, когда там появится __invoke(). Очень интересно посмотреть, что вы придумаете, поскольку там же есть ещё __construct() + в ядре есть __get(). Как всё это вместе будет работать - для меня пока загадка. Но скорее всего, всё будет как всегда - ещё какая-нибудь хитрая связка, видя которую глаза вылетают из орбит, а на деле получится всё как два пальца :)
Цитата (Alexander @ 2013-03-19, 20:11)
Дизайн шел параллельно с разработкой

Я так понимаю, у вас есть знакомый или друг, который дизайном занимается? Или вы какую-то простейшую вёрстку сами писали? Просто где-то в постах встречал, вы говорили, что не очень разбираетесь в CSS.

Ещё интересно как писалось ядро (RC1 - RC5 я видел). Сам код понятно - открыл и посмотрел. Интересен сам подход и процесс. Т.е. как проектировалось (или же всё писалось в порыве творческого вдохновения без каких-то набросков), что шло первым, что писалось потом. Почему решили делать ядро именно на Singleton'е (я видел в интернете кучу постов, где кулцхакеры писали, что синглтон - говно, потому что потом возникают проблемы с масштабированностью. Какие конкретно проблемы, естественно никто не писал, но бурление говна было чуть больше, чем дох*я). Почему от -> решили перейти к :: (имеется ввиду $Mainclass->тратата. В RC5 этих стрелочек была тьма)?

Сообщение отредактировал wizard993 - 2013-03-19, 21:18
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2013-03-19, 21:37
Сообщение #10
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


Цитата (wizard993 @ 2024-03-28 13:23)
Из того, что написано в мануале, я сделал, возможно неправильный вывод, о том, что $_SERVER['ключ'] и getenv('ключ') это эквивалентно. Тем не менее в одном из апдейтов на GoogleCode я заметил, что вы заменили вызов $_SERVER на getenv для какого-то ключа (сейчас уже не помню точно для какого). Не могли бы вы объяснить разницу между $_SERVER['ключ'] и getenv('ключ').

Все тоже очень просто. На самом деле getenv эквивалентно

$v=isset($_SERVER['ключ']) ? $_SERVER['ключ'] : false;

Поэтому, чтобы много не писать, я воспользовался готовым решением. Стемлюсь к краткости. Не все переменные $_SERVER предопределены на разных хостингах.

Цитата (wizard993 @ 2024-03-28 13:23)
Ещё жду того момента, когда там появится __invoke(). Очень интересно посмотреть, что вы придумаете, поскольку там же есть ещё __construct() + в ядре есть __get(). Как всё это вместе будет работать - для меня пока загадка. Но скорее всего, всё будет как всегда - ещё какая-нибудь хитрая связка, видя которую глаза вылетают из орбит, а на деле получится всё как два пальца

Лучше не ждать, а задать конкретный вопрос - я напишу вас своё виденье решения.

Цитата (wizard993 @ 2024-03-28 13:23)
Очень нравится регулярка в .htaccess, где после индекса добавляется !. Я ещё не встречал нигде подобной идеи.

Это было вынуждено, поскольку однажды мне сильно понадобилась поддержка URL смешанного типа вроде /news/новость.html?param=value . Попробовав массу вариантов, каждый раз всплывали какие-то глюки. В результате, остановился на том, что есть сейчас. Вроде работает.

Цитата (wizard993 @ 2024-03-28 13:23)
Я так понимаю, у вас есть знакомый или друг, который дизайном занимается? Или вы какую-то простейшую вёрстку сами писали? Просто где-то в постах встречал, вы говорили, что не очень разбираетесь в CSS.

Друг этот centroarts.com . Мои познания в css действительно скудны.

Цитата (wizard993 @ 2024-03-28 13:23)
Почему от -> решили перейти к :: (имеется ввиду $Mainclass->тратата. В RC5 этих стрелочек была тьма)?

Удобство. Мне сейчас нужно, чтобы доступ к ядру системы был максимально, скажем так, минимизирован. Раньше для доступа к БД, приходилось писать:

global $Mainclass;
$Mainclass->Db->Query(...);


Сейчас же можно гораздо проще:

Eleanor::$Db->Query();


Singleton может и плох, но как по-другому сделать удобно, я пока не знаю. Основным и единственным смыслом Singleton класса Eleanor является автозагрузка классов с автоматическим созданием стандартного объекта. Так, например, в RC5 приходилось писать:


$Mainclass->LoadClass('others/editor.php');
$Mainclass->Editor->...


Сейчас же все гораздо проще:

$GLOBALS['Eleanor']->Editor...

При таком обращении, система автоматически находит нужный класс, подгружает его и создает объект. Если подскажете мне, как сделать еще удобнее (желательно, с отказом от Singleton) - без проблем сделаю :)

Кроме того, я уделяю много внимания оптимизации кода. В RC5 была беда: перекрестные ссылки - однозначеное зло. С переходом на PHP 5.3, появились новые возможности, которые позволили мне отказаться от перекрестных ссылок и оптимизировать код.
Перейти в начало страницы
+Цитировать сообщение
Гость_wizard993_*
сообщение 2013-03-31, 22:32
Сообщение #11



Гости





Цитата (Alexander @ 2013-03-19, 21:37)
Это было вынуждено, поскольку однажды мне сильно понадобилась поддержка URL смешанного типа вроде /news/новость.html?param=value . Попробовав массу вариантов, каждый раз всплывали какие-то глюки. В результате, остановился на том, что есть сейчас. Вроде работает.

По-моему решение очень даже неплохое. В особенности облегчает идентификацию типа ссылки - ЧПУ или динамика.


Цитата (Alexander @ 2013-03-19, 21:37)
Singleton может и плох, но как по-другому сделать удобно, я пока не знаю.

А вот как лично Вы считаете, чем плох Singleton?

Цитата (Alexander @ 2013-03-19, 21:37)
Если подскажете мне, как сделать еще удобнее (желательно, с отказом от Singleton) - без проблем сделаю :)

Я бы с радостью подсказал, но я не вижу смысла в отказе от такой концепции. Начиная с RC1 ядро Eleanor использовало Singleton. Было другое API для вызова методов, но пофакту внутри находился Singleton. По-моему - отказаться от Singleton - это заново писать ядро. :unsure:

Цитата (Alexander @ 2013-03-19, 21:37)
Лучше не ждать, а задать конкретный вопрос - я напишу вас своё виденье решения.

Окей. Александр, хотелось бы узнать ваше виденье решения по поводу создания __invoke(){} для класса Url

Сообщение отредактировал wizard993 - 2013-03-31, 22:33
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2013-03-31, 23:58
Сообщение #12
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


Цитата (wizard993 @ 2024-03-28 13:23)
А вот как лично Вы считаете, чем плох Singleton?

По-сути, он нарушает концепцию ООП, когда от одного класса я могу создать сколько угодно объектов. Получается, что Singleton, это какой-то костыль, потому что (теоретически) статические методы / переменные класса должны его полностью заменить. Но! У него есть очень сильная сторона: удобная передача самого себя разным частям кода. Тоесть мне удобно передавать и работать с объектом внутри различных функций и классов. Попробуйте переписать следующий код на манер статических переменных и методов:

class SomeClass
{
	public static
		$O;
	public static function F(Singleton$O)
	{
		self::$O=$O;
	}
}

function W($O)
{
	$O->newprop='123';
	SomeClass($O);
}

$O=new Singleton;
W($O);
echo $O->newprop;

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

Цитата (wizard993 @ 2024-03-28 13:23)
Окей. Александр, хотелось бы узнать ваше виденье решения по поводу создания __invoke(){} для класса Url

Я вижу только одно решение: использовать в качестве замены метода Construct. Но год назад я уже пытался так делать, получились жуткие тормоза. Может быть сейчас дело обстоит чуть лучше, не знаю, проверьте.
Перейти в начало страницы
+Цитировать сообщение
Гость_wizard993_*
сообщение 2013-04-04, 18:55
Сообщение #13



Гости





Цитата (Alexander @ 2013-03-31, 23:58)
Я вижу только одно решение: использовать в качестве замены метода Construct. Но год назад я уже пытался так делать, получились жуткие тормоза. Может быть сейчас дело обстоит чуть лучше, не знаю, проверьте.


пробовал делать так:
1. В ядро (класс Eleanor) добавляю коллер:

public function __call($n,array$p)
{
	#Поддержка __invoke()
	$o=$this->__get($n);
	return call_user_func_array($o,$p);
}


2. В классе Url рaскомментировал public function __invoke()

3. Замерил следующим образом время:

$start=microtime();
for($i=0;$i<100000;$i++)
	$GLOBALS['Eleanor']->Url->Construct(['module'=>'account','act'=>'login','success'=>'true']);
$end=microtime();
$_=array_sum(explode(' ',$end))-array_sum(explode(' ',$start));
echo sprintf(
		'Время: %s '.
		'Память: %s '.
		'Пик памяти: %s',
		round($_,3),
		round(memory_get_usage()/1048576,3),
		round(memory_get_peak_usage()/1048576,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 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


wizard993, не совсем понятно зачем нужен был первый шаг: в BaseClass это и так предусмотрено.

Для хорошего теста, нужно все содержимое метода Construct скопировать в __invoke. И тогда тестить.

Цитата (wizard993 @ 2024-03-28 13:23)
Подозреваю, что со временем такие "чудеса" проделывает __call().

Как не трудно догадаться, при __invoke идет в ~4 раза больше вызов всяких методов.
Перейти в начало страницы
+Цитировать сообщение
Гость_wizard993_*
сообщение 2013-04-04, 20:19
Сообщение #15



Гости





Цитата (Alexander @ 2013-04-04, 20:14)
wizard993, не совсем понятно зачем нужен был первый шаг: в BaseClass это и так предусмотрено.


В BaseClass смутило
if(property_exists($this,$n) and is_object($this->$n) and method_exists($this->$n,&apos;__invoke&apos;))
			return call_user_func_array(array($this->$n,&apos;__invoke&apos;),$p);

Из мануала следует:
Цитата
Функция property_exists() не определяет магически доступные свойства с помощью метода __get.

Учту. Будем искать :)


Сообщение отредактировал wizard993 - 2013-04-04, 20:28
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2013-04-04, 22:35
Сообщение #16
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


Цитата (wizard993 @ 2024-03-28 13:23)
Из мануала следует:

А зачем вам метод __get ? Ну зачем?
Перейти в начало страницы
+Цитировать сообщение
Гость_wizard993_*
сообщение 2013-04-04, 23:49
Сообщение #17



Гости





Цитата (Alexander @ 2013-04-04, 22:35)
А зачем вам метод __get ? Ну зачем?

так. или я уже заучился, или я чего-то не понимаю
Разбираю попорядку.
$Eleanor - это переменная, которая хранит объект класса Eleanor;

Существует 3 вида обращения к разным субъектам, релизуемые через эту переменную

1. $Eleanor->Object($propetries);
2. $Eleanor->Object->ObjMethod($propetries);
3. $Eleanor->dynamic_public_propetry;

Нас интересует первый пункт. То есть как передать параметры объекту.
Т.к. метода Object в классе Eleanor не существует, нас перенаправляет в метод __call() класса BaseClass

А там условие:
f(property_exists($this,$n) and is_object($this->$n) and method_exists($this->$n,'__invoke'))
			return call_user_func_array(array($this->$n,'__invoke'),$p);



Т.к. свойства 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 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


Цитата
Т.к. свойства Object в классе Eleanor не существует, то property_exists($this,$n) возвращает false -> if возвращает false -> идём логировать ошибку.
Следовательно ничего не получилось.

Что я упустил в рассуждениях?

Я просто не учел, что вы вызываете Url первый раз. В моейм представлении, объект $Eleanor->Url уже вызывался ранее, а занчит - это уже просто свойство объекта $Eleanor.

Сообщение отредактировал Alexander - 2013-04-05, 1:13
Перейти в начало страницы
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 
RSS Текстовая версия 0.0395 сек.    11 запросов    GZIP включен    Сейчас: 2024-03-28, 13:23