<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dinexi&#039;s corner &#187; php</title>
	<atom:link href="http://blog.dinexi.ru/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.dinexi.ru</link>
	<description>Блог Станиса Шрамко</description>
	<lastBuildDate>Sat, 28 Jan 2012 11:12:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Кто победит: слон или тигр?</title>
		<link>http://blog.dinexi.ru/2011/11/21/kto-pobedit-slon-ili-tigr/</link>
		<comments>http://blog.dinexi.ru/2011/11/21/kto-pobedit-slon-ili-tigr/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 11:49:47 +0000</pubDate>
		<dc:creator>Dinexi</dc:creator>
				<category><![CDATA[главная]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://dinexi.ru/?p=3084</guid>
		<description><![CDATA[[stanis@home ~] % php -r &#8216;class A { function __construct() { $this->b = new B(); } } class B { function __construct() { $this->a = new A(); } } $a = new A();&#8217; По какой причине, по-вашему, скопытится данная программа?]]></description>
			<content:encoded><![CDATA[<p>[stanis@home ~] % php -r &#8216;class A { function __construct() { $this->b = new B(); } } class B { function __construct() { $this->a = new A(); } } $a = new A();&#8217;</p>
<p>По какой причине, по-вашему, скопытится данная программа?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dinexi.ru/2011/11/21/kto-pobedit-slon-ili-tigr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP: duck vs static</title>
		<link>http://blog.dinexi.ru/2011/11/14/php-duck-vs-static/</link>
		<comments>http://blog.dinexi.ru/2011/11/14/php-duck-vs-static/#comments</comments>
		<pubDate>Sun, 13 Nov 2011 17:00:12 +0000</pubDate>
		<dc:creator>Dinexi</dc:creator>
				<category><![CDATA[главная]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://dinexi.ru/?p=3000</guid>
		<description><![CDATA[Решил посмотреть в цифрах, насколько instanceof быстрее достаточно прямого method_exists() и корявого is_callable(). Результаты, надо сказать, впечатляют. [cc lang="php" tab_size="2" width="600"] [/cc] Ваши прогнозы?]]></description>
			<content:encoded><![CDATA[<p>Решил посмотреть в цифрах, насколько instanceof быстрее достаточно прямого method_exists() и корявого is_callable().<br />
Результаты, надо сказать, впечатляют.<br />
<span id="more-3000"></span><br />
[cc lang="php" tab_size="2" width="600"]<br />
<?php</p>
<p>interface iStatic {<br />
  public function addOne($a);<br />
}</p>
<p>class Experimental implements iStatic {<br />
  public function addOne($a) {<br />
    return $a++;<br />
  }<br />
}</p>
<p>$obj = new Experimental();<br />
$var = 0;<br />
$startTime = microtime(true);<br />
for ($i = 0; $i < 100000; $i++) {<br />
  if ($obj instanceof iStrict) {<br />
    $var = $strict->addOne($var);<br />
  }<br />
}<br />
$totalTimeForInstanceOf = microtime(true) &#8211; $startTime;</p>
<p>$var = 0;<br />
$startTime = microtime(true);<br />
for ($i = 0; $i < 100000; $i++) {<br />
  if (is_callable(array($obj, 'addOne'))) {<br />
    $var = $obj->addOne($var);<br />
  }<br />
}<br />
$totalTimeForIsCallable = microtime(true) &#8211; $startTime;</p>
<p>$var = 0;<br />
$startTime = microtime(true);<br />
for ($i = 0; $i < 100000; $i++) {<br />
  if (method_exists($obj, 'addOne')) {<br />
    $var = $obj->addOne($var);<br />
  }<br />
}<br />
$totalTimeForMethodExists = microtime(true) &#8211; $startTime;</p>
<p>echo &#8220;Static: {$totalTimeForInstanceOf} ms\n&#8221;;<br />
echo &#8220;Duck (is_callable()): {$totalTimeForIsCallable} ms\n&#8221;;<br />
echo &#8220;Duck (method_exists()): {$totalTimeForMethodExists} ms\n&#8221;;</p>
<p>?></p>
<p>[/cc]<br />
Ваши прогнозы?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dinexi.ru/2011/11/14/php-duck-vs-static/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>oDesk Advanced PHP Developer test</title>
		<link>http://blog.dinexi.ru/2009/12/20/odesk-advanced-php-developer-test/</link>
		<comments>http://blog.dinexi.ru/2009/12/20/odesk-advanced-php-developer-test/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 07:14:34 +0000</pubDate>
		<dc:creator>Dinexi</dc:creator>
				<category><![CDATA[главная]]></category>
		<category><![CDATA[odesk]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://dinexi.ru/?p=2678</guid>
		<description><![CDATA[Не, ну кто их там делает?! Куча вопросов вида: &#8220;А что выведет на экран вот такая конструкция?&#8221;]]></description>
			<content:encoded><![CDATA[<p>Не, ну кто их там делает?!</p>
<p>Куча вопросов вида: &#8220;А что выведет на экран вот такая конструкция?&#8221;<br />
<code language="php"><br />
<?php<br />
  print (2==3);<br />
</code></p>
<p>Ребята, мамой клянусь: ничегошеньки она не выведет.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dinexi.ru/2009/12/20/odesk-advanced-php-developer-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SVN log by developer</title>
		<link>http://blog.dinexi.ru/2009/09/11/svn-log-by-developer/</link>
		<comments>http://blog.dinexi.ru/2009/09/11/svn-log-by-developer/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 09:34:44 +0000</pubDate>
		<dc:creator>Dinexi</dc:creator>
				<category><![CDATA[главная]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://dinexi.ru/?p=2629</guid>
		<description><![CDATA[Задача очень типовая: посмотреть список коммитов девелоперов, желательно красиво. Требует colordiff&#8217;а (спасибо Антону Фёдорову). xpath("/log/logentry[author = '$author']") as $node) { $revision = $node['revision']; $previousRevision = $revision - 1; $date = date(DATE_RFC2822, strtotime((string)$node->date)); printf("\nRevision %d, %s at %s\n", $revision, $author, $date); foreach($node->paths->path as $path) { $totalChanged++; printf("%s\n", $path); if (!$brief) { printf("%s\n\n", `svn diff -r $previousRevision:$revision [...]]]></description>
			<content:encoded><![CDATA[<p>Задача очень типовая: посмотреть список коммитов девелоперов, желательно красиво.</p>
<p>Требует colordiff&#8217;а (спасибо <a href="http://blog.datacompboy.ru">Антону Фёдорову</a>).<br />
<span id="more-2629"></span></p>
<pre lang="php" line="1">
<?php
/**
 * Analyzes the SVN's XML and outputs the verbose list of developer's commits
 *
 * @author Stanis Shramko <im@dinexi.ru>
 */

// Checking the args
if (isset($argv[1]))
{
  $author = $argv[1];
}
else
{
  echo "Usage:\n";
  echo "svnlogbyuser.php DEV [FULL]\n";
  die(-1);
}
$brief = (isset($argv[2])) ? false : true;

// Getting the data
$xml = simplexml_load_string(`svn log -r HEAD:0 -v --xml`);
$totalChanged = 0;

// Parsing them using XPath and, if required, svn and colordiff
foreach ($xml->xpath("/log/logentry[author = '$author']") as $node)
{
  $revision = $node['revision'];
  $previousRevision = $revision - 1;
  $date = date(DATE_RFC2822, strtotime((string)$node->date));
  printf("\nRevision %d, %s at %s\n", $revision, $author, $date);
  foreach($node->paths->path as $path) {
    $totalChanged++;
    printf("%s\n", $path);
    if (!$brief)
    {
      printf("%s\n\n", `svn diff -r $previousRevision:$revision ^/$path | colordiff`);
    }
  }
}
printf("Total changed %d by %s\n", $totalChanged, $author);

?>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.dinexi.ru/2009/09/11/svn-log-by-developer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP-проекты: пути развития</title>
		<link>http://blog.dinexi.ru/2009/08/04/php-proekty-puti-razvitiya/</link>
		<comments>http://blog.dinexi.ru/2009/08/04/php-proekty-puti-razvitiya/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 22:17:01 +0000</pubDate>
		<dc:creator>Dinexi</dc:creator>
				<category><![CDATA[главная]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[мысли]]></category>
		<category><![CDATA[цитата]]></category>

		<guid isPermaLink="false">http://dinexi.ru/?p=2500</guid>
		<description><![CDATA[…другое дело, что у коммерческих php-шных проектов, погнавшихся за дешевизной php-программистов, есть два более-менее основных пути развития: 1) взяли студентов, разогнали, взяли студентов, разогнали (несколько ещё таких же итераций), перестали гоняться за дешевизной, набрали умных ребят за адекватные деньги и начали работать; 2) взяли студентов, разогнали, взяли студентов, разогнали (несколько ещё таких же итераций), перестали [...]]]></description>
			<content:encoded><![CDATA[<p>…другое дело, что у коммерческих php-шных проектов, погнавшихся за дешевизной php-программистов, есть два более-менее основных пути развития: 1) взяли студентов, разогнали, взяли студентов, разогнали (несколько ещё таких же итераций), перестали гоняться за дешевизной, набрали умных ребят за адекватные деньги и начали работать; 2) взяли студентов, разогнали, взяли студентов, разогнали (несколько ещё таких же итераций), перестали гоняться за дешевизной и перешли на питон/джаву/.net/whatever.<br />
Ключевое и там, и там именно «перестали гоняться за дешевизной».<br />
А сам PHP ни в чём не виноват. Просто строить на нём энтерпрайз глупо, а небольшие сайты — дешевле. Это, примерно, так же, как ООП: в маленьком проекте очень часто нафиг не нужно. А в большом всё ж таки помогает, зачастую серьёзно.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dinexi.ru/2009/08/04/php-proekty-puti-razvitiya/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Вышел PHP5.3</title>
		<link>http://blog.dinexi.ru/2009/07/02/vyshel-php5-3/</link>
		<comments>http://blog.dinexi.ru/2009/07/02/vyshel-php5-3/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 18:48:55 +0000</pubDate>
		<dc:creator>Dinexi</dc:creator>
				<category><![CDATA[главная]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://lambda.nav.academ.org/?p=2339</guid>
		<description><![CDATA[The long awaited release of PHP 5.3 is finally here! Bask in the glory of all the new enhancements and go download it to start using it today! Долгожданный релиз PHP 5.3 состоялся!]]></description>
			<content:encoded><![CDATA[<p>The long awaited release of PHP 5.3 is finally here! Bask in the glory of all the new enhancements and go download it to start using it today!</p>
<p>Долгожданный релиз PHP 5.3 <a href="http://www.php.net/archive/2009.php#id2009-06-30-1">состоялся</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dinexi.ru/2009/07/02/vyshel-php5-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>И ещё раз о слонах&#8230;</title>
		<link>http://blog.dinexi.ru/2009/06/28/i-eshhyo-raz-o-slonax/</link>
		<comments>http://blog.dinexi.ru/2009/06/28/i-eshhyo-raz-o-slonax/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 14:45:41 +0000</pubDate>
		<dc:creator>Dinexi</dc:creator>
				<category><![CDATA[главная]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[картинки]]></category>

		<guid isPermaLink="false">http://lambda.nav.academ.org/?p=2334</guid>
		<description><![CDATA[…как о символе PHP. Слон, как известно, считается животным мудрым. И вообще, насколько я помню, инкарнацией бога, который мудростью отличался. От других. У жрецов в AD&#38;D мудрость тоже была основным таким качеством. Классическим образчиком такого жреца является братец Тук, он очень любил своих ближних оглоблей отоварить. Я тут не так давно пост писал о мудрости [...]]]></description>
			<content:encoded><![CDATA[<p>…как о символе PHP. Слон, как известно, считается животным мудрым. И вообще, насколько я помню, инкарнацией бога, который мудростью отличался. От других. У жрецов в AD&amp;D мудрость тоже была основным таким качеством. <ins>Классическим образчиком такого жреца является братец Тук, он очень любил своих ближних оглоблей отоварить.</ins></p>
<p>Я тут не так давно пост писал о мудрости и о PHP, в сочетании с ним флоны тут не просто к месту, они тут ломятся по осевой со скоростью километров двести в час. <a href="/zhrecy-programmirovaniya/">Вот</a> он.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dinexi.ru/2009/06/28/i-eshhyo-raz-o-slonax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Купи Флона!</title>
		<link>http://blog.dinexi.ru/2009/06/28/kupi-flona/</link>
		<comments>http://blog.dinexi.ru/2009/06/28/kupi-flona/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 09:25:25 +0000</pubDate>
		<dc:creator>Dinexi</dc:creator>
				<category><![CDATA[главная]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://lambda.nav.academ.org/?p=2312</guid>
		<description><![CDATA[Это есть такая инициатива у студии Elroubio — сделать Флона символом PHP. К языку я питаю давнюю и стойкую нелюбовь, однако инициатива мне нравится: должен же у языка быть какой-то символ, если больше ему гордиться нечем. Какая-то эта инициатива лопоухая и забавная. И с фоботом. Вот и решил в меру своих скромных сил поддержать. Флон [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_2311" class="wp-caption alignnone" style="width: 303px"><a href="http://www.elroubio.net/?p=adopt_an_elephpant"><img class="size-medium wp-image-2311" title="GPL Pin-Up Girl" src="http://lambda.nav.academ.org/wp-content/uploads/2009/06/phpinup_gpl_3-293x300.jpg" alt="Купи слона!" width="293" height="300" /></a><p class="wp-caption-text">Купи Флона!</p></div>
<p>Это есть такая инициатива у студии <a href="http://www.elroubio.net/?p=adopt_an_elephpant">Elroubio</a> — сделать Флона символом PHP. К языку я питаю давнюю и стойкую нелюбовь, однако инициатива мне нравится: должен же у языка быть какой-то символ, <span style="text-decoration: line-through;">если больше ему гордиться нечем</span>. Какая-то эта инициатива лопоухая и забавная. И с фоботом. Вот и решил в меру своих скромных сил поддержать. Флон мне понравился. Да, мне вообще нравятся Флоны, вот <a href="http://www.postgresql.org/">ещё один</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dinexi.ru/2009/06/28/kupi-flona/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Обработчики событий</title>
		<link>http://blog.dinexi.ru/2009/06/21/obrabotchiki-sobytij/</link>
		<comments>http://blog.dinexi.ru/2009/06/21/obrabotchiki-sobytij/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 23:40:15 +0000</pubDate>
		<dc:creator>Dinexi</dc:creator>
				<category><![CDATA[главная]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://lambda.nav.academ.org/?p=2150</guid>
		<description><![CDATA[События и обработчики событий давно не новость в объектно-ориентированном программировании: общеизвестен паттерн проектирования Observer [1], который используется в изрядном количестве библиотек и программных продуктов. Меня интересует использование этого паттерна в PHP5. Самая простая, классическая реализация этого паттерна наличествует в SPL [2], где этот паттерн определён интерфейсами SplSubject и SplObserver. Простенько, теперь — со вкусом PHP. [...]]]></description>
			<content:encoded><![CDATA[<p>События и обработчики событий давно не новость в объектно-ориентированном программировании: общеизвестен паттерн проектирования Observer <a href="http://en.wikipedia.org/wiki/Observer_pattern">[1]</a>, который используется в изрядном количестве библиотек и программных продуктов. Меня интересует использование этого паттерна в PHP5.<br />
Самая простая, классическая реализация этого паттерна наличествует в <abbr title="Standard PHP Library">SPL</abbr> <a href="http://www.php.net/%7Ehelly/php/ext/spl/main.html">[2]</a>, где этот паттерн определён интерфейсами <a href="http://www.php.net/%7Ehelly/php/ext/spl/interfaceSplSubject.html">SplSubject</a> и <a href="http://www.php.net/%7Ehelly/php/ext/spl/interfaceSplObserver.html">SplObserver</a>. Простенько, теперь — со вкусом PHP.<br />
Во фреймворке Prado <a href="http://www.pradosoft.com">[3]</a> система событий очень мощно развита, недаром он называется «событийно-ориентированным». События порождаются в изрядном количестве, к любому из событий произвольного компонента можно привязать произвольное количество произвольных обработчиков. Естественно, большая часть событий относится к циклу создания страницы как таковой и к действиям пользователя: Prado ориентирован на создание веб-страниц в стиле ASP.NET <a href="http://www.asp.net/">[4]</a> с его концепцией code behind. Хотел было написать, что это единственный из найденных мной фреймворков для PHP5, где события играют важную роль в организации жизненного цикла приложения, но затем вспомнил, что есть ещё и Yii <a href="http://www.yiiframework.com/">[5]</a>, там тоже есть события, реализация очень похожа на реализацию Prado, что неудивительно: автор тот же. Порывшись для уверенности в Google, нашёл фреймворк PHP_Application <a href="http://papple.sourceforge.net/">[6]</a>, но глубоко изучать не стал.<br />
Достаточно удобно сделано навешивание обработчиков на события уровня бизнес-логики в достаточно известном движке блогов WordPress <a href="http://codex.wordpress.org/Plugin_API#Actions">[7]</a>.<br />
Также имеется несколько достаточно простых реализаций диспетчера событий — в частности, Event_Dispatcher <a href="http://pear.php.net/package/Event_Dispatcher">[8]</a>, пакет PEAR.</p>
<p>Мне давно хочется обсудить использование событий в приложениях на PHP. Нужно ли? Осмысленно ли? И, если ответ на первые два вопроса утвердительный, то где, в каких случаях? Лично мне кажется, что в событийно-ориентированных приложениях удобно расширять функционал, но они сложны как в проектировании, так и в тестировании. События могут использоваться как дополнительная «фишка» фреймворка, но быть краеугольным камнем, на котором построен весь функционал приложения, они не должны. Причин тому несколько:</p>
<ol>
<li>глядя на диаграммы и на код, мы не видим, что происходит параллельно вызовам тех или иных методов, то есть изменение состояния системы для нас неочевидно;</li>
<li>в этой связи нам необходимо очень внимательно добавлять и удалять обработчики событий: повесить два обработчика одного и того же события или не повесить ни одного очень легко, а искать ошибку такого рода очень сложно;</li>
<li>сложность проектирования самих классов событий очень велика, так как заставляет в событии размещать всю возможную информацию, которая может понадобиться обработчику; либо нам нужно «вытаскивать» необходимые данные субъекта в обработчике.</li>
</ol>
<p>Ваши мнения?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dinexi.ru/2009/06/21/obrabotchiki-sobytij/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>В NetBeans IDE 7.0 будет поддержка symfony</title>
		<link>http://blog.dinexi.ru/2009/06/17/v-netbeans-ide-7-0-budet-podderzhka-symfony/</link>
		<comments>http://blog.dinexi.ru/2009/06/17/v-netbeans-ide-7-0-budet-podderzhka-symfony/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 22:16:39 +0000</pubDate>
		<dc:creator>Dinexi</dc:creator>
				<category><![CDATA[главная]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://lambda.nav.academ.org/?p=2119</guid>
		<description><![CDATA[Нашёл на YS-Pro эту небезынтересную информацию. То есть это уже не PHP EarlyAccess, который появился довольно давно. Это полноценная поддержка PHP в сочетании с поддержкой мощного фреймворка. Мир взял за правило меняться к лучшему.]]></description>
			<content:encoded><![CDATA[<p>Нашёл на <a href="http://ys-pro.com/v-netbeans-ide-70-budet-podderzhka-symfony">YS-Pro</a> эту небезынтересную информацию. То есть <a href="http://www.symfony-project.org/blog/2008/09/11/support-symfony-inclusion-in-netbeans">это</a> уже не PHP EarlyAccess, который появился довольно давно. Это полноценная поддержка PHP в сочетании с поддержкой мощного фреймворка. Мир взял за правило меняться к лучшему.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.dinexi.ru/2009/06/17/v-netbeans-ide-7-0-budet-podderzhka-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

