<?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>fxposter&#039;s wave &#187; PHP</title>
	<atom:link href="http://blog.fxposter.org/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fxposter.org</link>
	<description>Stories about Ruby, JavaScript, Objective-C and other cool tools</description>
	<lastBuildDate>Sun, 30 Oct 2011 20:00:54 +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>Ressurection</title>
		<link>http://blog.fxposter.org/2010/05/02/ressurection/</link>
		<comments>http://blog.fxposter.org/2010/05/02/ressurection/#comments</comments>
		<pubDate>Sun, 02 May 2010 00:04:15 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[macbook]]></category>
		<category><![CDATA[macosx]]></category>
		<category><![CDATA[objective-c]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=766</guid>
		<description><![CDATA[Настало время возродить этот блог. За более чем полугодие на нем не появилось ни одной статьи и я наконец-то намерен прекратить этот &#8220;застой&#8221;. Да, по сравнению с временами, которые были раньше у меня стало существенно меньше времени, чтобы писать что-то большое и серьезное - работа, университет (если быть точнее - то написание диплома) и еще [...]]]></description>
			<content:encoded><![CDATA[<p>Настало время возродить этот блог. За более чем полугодие на нем не появилось ни одной статьи и я наконец-то намерен прекратить этот &#8220;застой&#8221;. Да, по сравнению с временами, которые были раньше у меня стало существенно меньше времени, чтобы писать что-то большое и серьезное - работа, университет (если быть точнее - то написание диплома) и еще один &#8220;секретный сайд проект&#8221; о котором, возможно, я когда-нибудь всем расскажу.</p>
<p>Начну с глобальных изменений, которые произошли за последнее время в моей жизни и которые однозначно коснутся этого блога.</p>
<p>Ну, во-первых, я теперь не пишу на PHP. Вообще не пишу. И не очень сильно слежу за последними веяниями моды, связанными с этим языком. Да, я все равно иногда появляюсь в группе симфонистов (кому нужен доступ туда - пишите, там новичков любят и на многие нубские вопросы отвечают :) ). Да, я иногда посматриваю на фреймворки, которые сейчас являются популярными в сфере PHP - всякие Yii, ZF, etc. Посматриваю исключительно для того, чтобы быть в курсе происходящего. Учить их и писать на них в общем-то не очень хочется.</p>
<p>На что я променял PHP? Естественно на <a href="http://www.ruby-lang.org/">Ruby</a>. Я не восхищаюсь этим языком, не превозношу его над остальными, просто на работе я пишу на нем (кстати, я работаю над стартапом для бизнесов - <a href="http://waysgo.com/">WaysGo</a>, запуск будет, я надеюсь, очень скоро) и ни на чем другом желания писать особо не возникает - с точки зрения веб-разработки Ruby меня полностью устраивает. Этот язык удобен и достаточно экспрессивен. А <a href="http://rubyonrails.org/">Ruby On Rails</a> - отличное средство для тех, кто хочет писать веб-приложения. Ну, в общем, вы меня поняли. ;)</p>
<p>Кстати говоря, я немного соврал насчет того, что я пишу на Ruby на работе. С начала этой недели я пишу iPhone-приложение на <a href="http://ru.wikipedia.org/wiki/Objective-C">Objective-C</a> и, в связи с этим, шустренько осваиваю Mac, Xcode, сам Objective-C и всякую прочую фигню, которая нужна для разработки под iPhone. Определенного мнения по поводу мака я пока сказать не могу, а вот Objective-C с первого подхода отличается похожестью на руби с точки зрения вызовов методов у объектов и открытых классов, но в то же время отличается несколько некрасивым синтаксисом (квадратные скобки, рррррр). С другой стороны, к синтаксису Ruby у меня тоже изначально было плохое отношение. Это отношение, кстати, не изменилось - я по прежнему считаю, что Ruby - непонятный язык для новичка, и если код на, например, Python можно просто читать, то для того, чтобы почитать код на Ruby придется сначала посмотреть туториалы, или что-то в этом роде, потому что синтаксис кроме выразительности отличается еще и неочевидностью. После пары дней работы с Ruby проблемы отпадают сами собой, так что этот аспект меня уже не очень беспокоит. Собственно, я надеюсь, что рано или поздно я перестану замечать синтаксис Objective-C и буду просто писать код, который делает что мне нужно.</p>
<p>Вот, собственно, и все на сегодня. Вроде ничего не забыл. До скорого! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2010/05/02/ressurection/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Data Mapper на PHP</title>
		<link>http://blog.fxposter.org/2008/10/13/data-mapper-in-php/</link>
		<comments>http://blog.fxposter.org/2008/10/13/data-mapper-in-php/#comments</comments>
		<pubDate>Sun, 12 Oct 2008 21:23:24 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[Data Mapper]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=580</guid>
		<description><![CDATA[Начинаю писать Data Mapper на PHP. На вопрос &#8220;почему&#8221; всего лишь 2 ответа - &#8220;хочется&#8221; и &#8220;нужен по работе простой, но удобный ORM&#8221;. Кто захочет присоединиться и в свободное время помогать мне его развивать - милости прошу. На данный момент это всё находится в ОЧЕНЬ начальной стадии - ничего не работает, да и как будут [...]]]></description>
			<content:encoded><![CDATA[<p>Начинаю писать <a href="http://martinfowler.com/eaaCatalog/dataMapper.html">Data Mapper</a> на PHP. На вопрос &#8220;почему&#8221; всего лишь 2 ответа - &#8220;хочется&#8221; и &#8220;нужен по работе простой, но удобный ORM&#8221;. Кто захочет присоединиться и в свободное время помогать мне его развивать - милости прошу.</p>
<p>На данный момент это всё находится в ОЧЕНЬ начальной стадии - ничего не работает, да и как будут работать некоторые вещи я еще не решил. Сейчас работа с бд строиться через mysqli, переход на PDO или поддержка других СУБД не планируется (но если кто-нибудь захочет - сделаем, там не так уж и много работы).</p>
<p>Текущее состояние можно будет посмотреть в <a href="http://svn2.assembla.com/svn/datamapper">SVN</a>. Тем, кто захочет помочь, нужно будет зарегистрироваться на Assembla и сказать мне свой логин.</p>
<p>Буду ОЧЕНЬ рад обсудить технические стороны проекта, а также его нужность.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/10/13/data-mapper-in-php/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Propel 1.3</title>
		<link>http://blog.fxposter.org/2008/08/20/propel-13/</link>
		<comments>http://blog.fxposter.org/2008/08/20/propel-13/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 19:53:41 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Propel]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=535</guid>
		<description><![CDATA[На днях вышла долгожданная новая версия достаточно популярного в узких кругах ORM - Propel 1.3. Из интересных мне нововведений: В основе Propel 1.3 лежит новый механизм работы с базами данных - PDO, который заменил Creole и привел к ощутимому повышению скорости работы. Теперь не нужно вручную загружать классы Propel и свои модели - теперь это [...]]]></description>
			<content:encoded><![CDATA[<p>На днях вышла долгожданная новая версия достаточно популярного в узких кругах ORM - <a href="http://propel.phpdb.org/trac/wiki/Users/News/Propel1.3.0">Propel 1.3</a>.</p>
<p>Из интересных мне нововведений:</p>
<ul>
<li>В основе Propel 1.3 лежит новый механизм работы с базами данных - <a href="http://php.net/pdo">PDO</a>, который заменил <a href="http://creole.phpdb.org/trac/">Creole</a> и привел к ощутимому повышению скорости работы.</li>
<li>Теперь не нужно вручную загружать классы Propel и свои модели - теперь это делается автоматически (через autoloading в PHP)</li>
<li>“Object Instance Pooling”, или, как его называет небезызвестный Фаулер - Identity Map. Причем, что самое интересное, это работает не только с retrieveByPk(), но и со всему doSelect*()-методами (в зависимости от переданных аргументов), что позволяет ускорить работу засчет отсутствия лишних запросов к бд, а также ненужности построения одинаковых обьектов несколько раз.</li>
<li>Связи один-к-одному теперь поддерживаются нативно (блин, хочу много-ко-многим!)</li>
<li>Куча мелких (и не очень) исправлений и улучшений</li>
</ul>
<p>Поподробнее можно прочитать на <a href="http://redotheweb.com/2008/08/20/propel-13-is-out/">RedoTheWeb</a>, в также на <a href="http://propel.phpdb.org/trac/wiki/Users/Documentation/1.3/Upgrading">офсайте Propel</a>.</p>
<p><em><strong>PS</strong>. Сам еще не юзал, но нужно будет попробовать. На мой взгляд, самый интересный момент связан с тем, можно ли переопределить фетчинг записей, например - выбирать только записи с <code>is_hidden = false</code>, да так, чтобы переопределять пришлось только одну функцию.</em></p>
<p><strong>Update</strong>: Как написали на <a href="http://www.symfony-project.org/blog/2008/08/21/propel-1-3-doctrine-1-0-and-symfony-1-2">официальном блоге Symfony</a> - &#8220;Object Instance Pooling is not an Identity Map because the database request is still needed&#8221;. Нужно будет изучить этот вопрос.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/08/20/propel-13/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Клич использующим Symfony</title>
		<link>http://blog.fxposter.org/2008/08/17/for-users-of-symfony/</link>
		<comments>http://blog.fxposter.org/2008/08/17/for-users-of-symfony/#comments</comments>
		<pubDate>Sat, 16 Aug 2008 22:36:54 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=530</guid>
		<description><![CDATA[Если вы используете Symfony, планируете это делать или просто интересуетесь этим фреймворком - значит нам нужно поговорить. Мои контакты: ICQ: 625585 Jabber: fxposter@gmail.com Skype: fxposter]]></description>
			<content:encoded><![CDATA[<p>Если вы используете Symfony, планируете это делать или просто интересуетесь этим фреймворком - значит нам нужно поговорить. Мои контакты:</p>
<ul>
<li>ICQ: 625585</li>
<li>Jabber: fxposter@gmail.com</li>
<li>Skype: fxposter</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/08/17/for-users-of-symfony/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Lambda-functions в PHP 5.3: часть 2</title>
		<link>http://blog.fxposter.org/2008/07/22/lambda-functions-in-php-53-part-2/</link>
		<comments>http://blog.fxposter.org/2008/07/22/lambda-functions-in-php-53-part-2/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 19:41:54 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Closure]]></category>
		<category><![CDATA[Lambda-function]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP 5.3]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=483</guid>
		<description><![CDATA[Еще немного помучал PHP 5.3 на тему Lambda-функций: $array = array(1, 2, 3); $array = array_map(function($v) { return $v * $v; }, $array); var_dump($array); array(3) { [0]=&#62; int(1) [1]=&#62; int(4) [2]=&#62; int(9) } I like that!]]></description>
			<content:encoded><![CDATA[<p>Еще немного помучал PHP 5.3 на тему Lambda-функций:</p>
<pre><code class="php">$array = array(1, 2, 3);
$array = array_map(function($v) { return $v * $v; }, $array);
var_dump($array);</code></pre>
<pre><code class="no-highlight">array(3) {
  [0]=&gt;
  int(1)
  [1]=&gt;
  int(4)
  [2]=&gt;
  int(9)
}</code></pre>
<p>I like that!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/07/22/lambda-functions-in-php-53-part-2/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Closures и Lambda-functions в PHP 5.3</title>
		<link>http://blog.fxposter.org/2008/07/22/closures-and-lambda-functions-in-php-53/</link>
		<comments>http://blog.fxposter.org/2008/07/22/closures-and-lambda-functions-in-php-53/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 19:29:25 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Closure]]></category>
		<category><![CDATA[Lambda-function]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP 5.3]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=479</guid>
		<description><![CDATA[Bolk открыл для сеня потрясающую новость - в PHP 5.3 будут замыкания и реальные lambda-функции. Поподробнее читаем здесь, а также у Bolk&#8217;а здесь и здесь (кстати говоря - здесь еще обьясняется, как создаются lambda-functions в текущих версиях PHP, кто не знает - почитайте). Не выдержал и проверил - поставил себе PHP 5.3: C:\Program Files\PHP&#62;php -v [...]]]></description>
			<content:encoded><![CDATA[<p>Bolk открыл для сеня потрясающую новость - в PHP 5.3 будут замыкания и реальные lambda-функции. Поподробнее читаем <a href="http://wiki.php.net/rfc/closures">здесь</a>, а также у Bolk&#8217;а <a href="http://bolknote.ru/2008/07/22/~1794">здесь</a> и <a href="http://bolknote.ru/2008/07/22/~1793">здесь</a> (кстати говоря - здесь еще обьясняется, как создаются lambda-functions в текущих версиях PHP, кто не знает - почитайте).</p>
<p>Не выдержал и проверил - поставил себе <a href="http://snaps.php.net/">PHP 5.3</a>:</p>
<pre><code class="no-highlight">C:\Program Files\PHP&gt;php -v
PHP 5.3.0-dev (cli) (built: Jul 22 2008 12:21:12)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2008 Zend Technologies</code></pre>
<p>Накидал простенький скриптец для тестов:</p>
<pre><code class="php">$lambda = function () { echo "Hello World!\n"; };
var_dump($lambda);

$lambda = create_function('', 'echo "Hello World!\n";');
var_dump($lambda);</code></pre>
<p>И запустил его:</p>
<pre><code class="no-highlight">C:\Program Files\PHP&gt;php test.php
object(Closure)#1 (0) {
}
string(9) " lambda_1"</code></pre>
<p>Как видите - теперь функции являются полноценными обьектами (&#8221;Closure - is simply an additional class&#8221;), что, на мой взгляд, просто замечательно! Даешь функции высших порядков в PHP!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/07/22/closures-and-lambda-functions-in-php-53/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>DomDocument &#8211; кодировка в HTML-документах</title>
		<link>http://blog.fxposter.org/2008/07/20/domdocument-encoding-in-html/</link>
		<comments>http://blog.fxposter.org/2008/07/20/domdocument-encoding-in-html/#comments</comments>
		<pubDate>Sun, 20 Jul 2008 16:53:32 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[DomDocument]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=474</guid>
		<description><![CDATA[На этот пост меня сподвигла неправильная (на мой взгляд работа fillin-фильтра в Symfony). Итак, поехали. DOM - это мощный компонент PHP для работы с Document Object Model. Почитать о его возможностях можно здесь (php manual). Я же хочу заострить внимание на том, что это расширение, в отличии от SimpleXML, например, может работать как с HTML, [...]]]></description>
			<content:encoded><![CDATA[<p>На этот пост меня сподвигла неправильная (на мой взгляд работа fillin-фильтра в Symfony). Итак, поехали.</p>
<p>DOM - это мощный компонент PHP для работы с Document Object Model. Почитать о его возможностях можно <a href="http://ua.php.net/manual/en/book.dom.php">здесь</a> (php manual). Я же хочу заострить внимание на том, что это расширение, в отличии от SimpleXML, например, может работать как с HTML, так и с XML.</p>
<p>DomDocument - один из классов компонента DOM, который отвечает за полный XML или HTML-документ.</p>
<p>И вот хотелось бы поговорить и показать, как этот DomDocument работает с кодировками и символами, отличными от латиницы.</p>
<p style="padding-left: 30px;">Для начала - небольшое отступление: DomDocument я создаю вот так: <code class="php">new DomDocument('1.0', 'UTF-8')</code>, указывая в качестве кодировки (&#8221;The encoding of the document as part of the XML declaration.&#8221;) UTF-8, так как, судя по моему опыту - указание кодировки здесь не дает вообще ничего.</p>
<p>Рассказывать тут особо нечего, поэтому я приведу код и результаты, а потом их проанализирую.</p>
<p><em>Весь текст в скриптах в кодировке UTF-8.</em></p>
<h3>Код класса &#8220;тестов&#8221;</h3>
<pre><code class="php">class Test_DomDocument_HTML_Charset {
  protected $dom;

  protected $html =
        '&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"&gt;
        &lt;html&gt;
        &lt;head&gt;
          &lt;meta http-equiv="Content-type" content="text/html; charset=UTF-8"&gt;
          &lt;title&gt;Тестовая страничка&lt;/title&gt;
        &lt;/head&gt;
        &lt;body&gt;
          &lt;p&gt;Привет&lt;/p&gt;
        &lt;/body&gt;
        &lt;/html&gt;';

  protected $html_without_charset =
        '&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"&gt;
        &lt;html&gt;
        &lt;head&gt;
          &lt;title&gt;Тестовая страничка&lt;/title&gt;
        &lt;/head&gt;
        &lt;body&gt;
          &lt;p&gt;Привет&lt;/p&gt;
        &lt;/body&gt;
        &lt;/html&gt;';

  protected function checkTestFunction($function)
  {
    return (strpos($function, 'test') === 0);
  }

  public function execute($callback) {
    $functions = get_class_methods(get_class($this));
    $functions = array_filter($functions, array($this, 'checkTestFunction'));
    foreach($functions as $function) {
      $this-&gt;setUp();
      $result = $this-&gt;$function();
      $callback($result, $function);
      $this-&gt;tearDown();
    }
  }

  protected function setUp() {
    $this-&gt;dom = new DomDocument('1.0', 'UTF-8');
  }

  protected function tearDown() {
  }

  /**
   * Возвращает кодировку документа.
   * Используется документ, в котором не указана кодировка.
   *
   * @return string
   */
  protected function testWithoutCharset() {
    $this-&gt;dom-&gt;loadHTML($this-&gt;html_without_charset);
    return $this-&gt;dom-&gt;encoding;
  }

  /**
   * Возвращает документ, после обработки его DomDocument'ом.
   * Используется документ, в котором не указана кодировка.
   *
   * @return string
   */
  protected function testWithoutCharsetHtml() {
    $this-&gt;dom-&gt;loadHTML($this-&gt;html_without_charset);
    return $this-&gt;dom-&gt;saveHTML();
  }

  /**
   * Возвращает кодировку документа.
   * Используется документ, в котором указана кодировка.
   *
   * @return string
   */
  protected function testWithCharset() {
    $this-&gt;dom-&gt;loadHTML($this-&gt;html);
    return $this-&gt;dom-&gt;encoding;
  }

  /**
   * Возвращает документ, после обработки его DomDocument'ом.
   * Используется документ, в котором указана кодировка.
   *
   * @return string
   */
  protected function testWithCharsetHtml() {
    $this-&gt;dom-&gt;loadHTML($this-&gt;html);
    return $this-&gt;dom-&gt;saveHTML();
  }

}</code></pre>
<h3>Код, показывающий результаты</h3>
<pre><code class="php">function echoHTMLResult($result, $function)
{
  echo "&lt;h3&gt;$function&lt;/h3&gt;\n";
  echo '&lt;pre&gt;&lt;code&gt;';
  if(is_string($result))
    $result = str_replace('&lt;', '&amp;lt;', str_replace('&gt;', '&amp;gt;', $result));
  var_dump($result);
  echo '&lt;/code&gt;&lt;/pre&gt;';
}</code></pre>
<pre><code class="html">&lt;?php $test = new Test_DomDocument_HTML_Charset(); ?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta http-equiv="Content-type" content="text/html; charset=UTF-8"&gt;
  &lt;title&gt;Тестовая страничка&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php $test-&gt;execute('echoHTMLResult') ?&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<h3>Результаты</h3>
<p><a href="http://blog.fxposter.org/wp-content/uploads/2008/07/dom_html.png"><img class="alignnone size-medium wp-image-476" title="Test_DomDocument_HTML_Charset" src="http://blog.fxposter.org/wp-content/uploads/2008/07/dom_html-300x187.png" alt="" width="300" height="187" /></a></p>
<h3>Выводы</h3>
<p>Как можно понять из результатов - кодировка документа при использовании HTML определяется исключительно через тег meta, а точнее - через charset, который там указан:</p>
<pre><code class="html">&lt;meta http-equiv="Content-type" content="text/html; charset=UTF-8"&gt;</code></pre>
<p>При отсутствии указанного тега/charset&#8217;а в нём - <code class="php">$dom-&gt;encoding</code> будет равен NULL (что можно с успехом использовать).</p>
<p>В общем-то всё, в ближайшие дни еще будет статья про кодировку в XML-документах, где всё немного интереснее.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/07/20/domdocument-encoding-in-html/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Использование Zend_Db_Table</title>
		<link>http://blog.fxposter.org/2008/07/20/using-zend_db_table/</link>
		<comments>http://blog.fxposter.org/2008/07/20/using-zend_db_table/#comments</comments>
		<pubDate>Sat, 19 Jul 2008 23:10:06 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Db]]></category>
		<category><![CDATA[Zend-Framework]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=472</guid>
		<description><![CDATA[На работе пришлось столкнуться с очень не нравившейся мне ORM&#8217;кой собственного производства. Стал делать свою (ну не дурак ли, а? :)), наваял за 3 дня простенькую ORM, отображающую структуру таблиц на обьекты, не контроллируя типов. Итог получился примерно такой: класс базы данных (относледовался от mysqli, pdo использовать было нельзя) класс таблицы, хранящий в себе бд, [...]]]></description>
			<content:encoded><![CDATA[<p>На работе пришлось столкнуться с очень не нравившейся мне ORM&#8217;кой собственного производства. Стал делать свою (ну не дурак ли, а? :)), наваял за 3 дня простенькую ORM, отображающую структуру таблиц на обьекты, не контроллируя типов. Итог получился примерно такой:</p>
<ul>
<li>класс базы данных (относледовался от mysqli, pdo использовать было нельзя)</li>
<li>класс таблицы, хранящий в себе бд, и отвечающий за CRUD записей</li>
<li>класс записи, перенаправляющий методы CUD классу таблицы</li>
</ul>
<p>Примерное использование:</p>
<pre><code class="php">$table = new ArticleTable();
$record = $table-&gt;fetchOneWhere("slug = 'hello'"); // получаем существующую запись
$record-&gt;name = 'Fucking Article!';
$record-&gt;save(); // вызывает insert/update в зависимости от того, новая ли это запись
$record = $table-&gt;create(); // создаем новую запись
$record-&gt;name = 'Fucking Article2!';
$record-&gt;slug = 'fucking_article';
// ...
$record-&gt;save();</code></pre>
<p>И что-то мне это очень сильно напомнило, а именно - Zend_Db: Zend_Db_Table / Zend_Db_Table_Row. Недолго думая - выкинул нафиг свою систему и залил в проект кусок Zend Framework&#8217;а (если нужно - потом скажу, какие именно файлы нужны для полноценной работы всего компонента Zend_Db), а также решил почитать, что сейчас вообще есть в этой Zend_Db, а есть, как оказалось - довольно много:</p>
<ul>
<li>Хорошая абстракция работы с бд</li>
<li>Классы записи/таблицы</li>
<li>Поддержка fetch&#8217;инга связанных обьектов</li>
<li>Поддержка many-to-many связей (этого даже в Propel нет)</li>
</ul>
<p>На самом деле - еще есть вещи, коотрые бы можно было добавить, чтобы они работали автоматически:</p>
<ul>
<li>Валидаторы в зависимости от типов полей таблицы</li>
<li>Возможность сразу fetch&#8217;ить данные из нескольких таблиц (точнее - получить такие данные довольно легко, но вот разбрасывать их по разным обьектам и связывать эти обьекты сейчас нужно ручками, если я не ошибаюсь, но опять же - это проблем не составляет)</li>
</ul>
<p>Вроде всё. Общее впечатление - просто замечательная система. Использовать легко и приятно. :)</p>
<p><strong>Пример:</strong><br />
Сначала пойдут мои супертипы слоя (кто читал <a href="http://www.amazon.com/Enterprise-Application-Architecture-Addison-Wesley-Signature/dp/0321127420">Patters of EAA</a> - поймет):</p>
<pre><code class="php">class Db_Table extends Zend_Db_Table_Abstract {
  /**
   * @return Zend_Db_Table_Rowset_Abstract
   */
  public function fetchAllBy($key, $value) {
    $where = $this->getAdapter()->quoteInto("$key = ?", $value);
    return $this->fetchAll($where);
  }

  /**
   * @return Zend_Db_Table_Row_Abstract
   */
  public function fetchRowBy($key, $value) {
    $where = $this->getAdapter()->quoteInto("$key = ?", $value);
    return $this->fetchRow($where);
  }

  public function __call($name, $arguments) {
    if(strpos($name, 'fetchRowBy') === 0) {
      array_unshift($arguments, substr($name, 10));
      return call_user_func_array(array($this, 'fetchRowBy'), $arguments);
    }

    if(strpos($name, 'fetchAllBy') === 0) {
      array_unshift($arguments, substr($name, 10));
      return call_user_func_array(array($this, 'fetchAllBy'), $arguments);
    }

    throw new Exception("Undefined method $name");
  }
}

class Db_Record extends Zend_Db_Table_Row_Abstract {
}</code></pre>
<p>А теперь - пример использования:</p>
<pre><code class="php">class Item extends Db_Table {
  protected $_name = 'items';
  protected $_rowClass = 'ItemRecord';
  protected $_referenceMap = array(
      'Group' => array(
        'columns'       => 'groupid',
        'refTableClass' => 'Group',
        'refColumns'    => 'groupid',
      )
    );
}

class ItemRecord extends Db_Record {
}

class Group extends Db_Table {
  protected $_name = 'groups';
  protected $_rowClass = 'GroupRecord';
  protected $_dependentTables = array('Item');
}

class GroupRecord extends Db_Record {
}

$itemTable = new Item();
$item = $itemTable->fetchRowBySlug('hello');
$group = $item->findParentGroup();</code></pre>
<p>Согласитель - всё просто и удобно, не так ли?</p>
<p>Для заинтересовавшихся - очень советую проштудировать полностью <a href="http://framework.zend.com/manual/en/zend.db.html">главу о Zend_Db</a> из документации Zend Framework&#8217;а. А также - <a href="http://blog.fxposter.org/2007/05/07/zend-database-table/">мой пост про Zend_Db_Table</a>, посвященный его улучшению (правда, я не знаю, насколько он сейчас актуален, проверять нет времени :( ).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/07/20/using-zend_db_table/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>Symfony 1.1</title>
		<link>http://blog.fxposter.org/2008/07/20/symfony-11/</link>
		<comments>http://blog.fxposter.org/2008/07/20/symfony-11/#comments</comments>
		<pubDate>Sat, 19 Jul 2008 22:35:28 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=470</guid>
		<description><![CDATA[Собственно, о том, что вышла Symfony 1.1 писали многие, и вы об этом наверняка уже слышали. Но для тех, кто об этом еще не знает, повторю нововведения, а также выскажу о них своё [авторитетное :)] мнение: Новая архитектура. Явное улучшение - компоненты теперь меньше зависят друг от друга. Новая система конфигурирования. К счастью, конфигурация через [...]]]></description>
			<content:encoded><![CDATA[<p>Собственно, о том, что <a href="http://www.symfony-project.org/blog/2008/06/30/the-wait-is-over-symfony-1-1-released">вышла Symfony 1.1</a> писали многие, и вы об этом наверняка уже слышали. Но для тех, кто об этом еще не знает, повторю нововведения, а также выскажу о них своё [авторитетное :)] мнение:</p>
<ul>
<li><a href="http://www.symfony-project.org/blog/2008/06/23/the-symfony-1-1-architecture">Новая архитектура</a>. Явное улучшение - компоненты теперь меньше зависят друг от друга.</li>
<li>Новая система конфигурирования. К счастью, конфигурация через YAML-файлы никуда не делась. Просто сама структура конфигов переделана.</li>
<li>&#8220;The new object-oriented <a class="ext-link" href="http://www.symfony-project.org/book/forms/1_1/">form framework</a>&#8220;. Звучит действительно круто. А смысл такой - генерация форм динамически, вместо статических хелперов (которые, кстати, остались), а также - вся работа с формами (указание полей, их валидаторов, настройка свойств показа формы и прочее)  теперь делается в одном месте, что очень удобно. Есть интеграция форм с Propel, например - автоматическая генерация форм по модели.</li>
<li>Новая <a href="http://www.symfony-project.org/cookbook/1_1/en/tasks">система консольных комманд</a>. Честно сказать - если вы не разрабатываете плагины, то разницу вы увидите только в том, что некоторые комманды поменяли своё название.</li>
<li>Новый <a href="http://www.symfony-project.org/blog/2008/06/19/yaml-in-symfony-1-1">парсер YAML</a>. Разве что изменили выдачу инфы об ошибках. Ну и кое-что добавили. Как по мне - для конечного девелопера разница очень мала.</li>
<li>Теперь плагины - это обычные пакеты PEAR, со всеми вытекающими последствиями, из которых главным, на мой взгляд, является возможность указаниязависимостей от других плагинов.</li>
<li> Теперь можно выдавать различные вьюхи в зависимости от того, какоt значение принимает хедер Accept. Поподробнее - <a href="http://www.symfony-project.org/cookbook/1_1/en/iphone">здесь</a>.</li>
<li>Собствено, ORM теперь полностью вынесен в плагины. Symfony 1.0 содержала в себе Propel 1.2, и была возможность заменить его на Propel 1.3/Doctrine через плагины. Теперь же и Propel 1.2 вынесен в отдельный плагин. Скорее всего эта возможность пришла вследствии пункта №1.</li>
<li>Для того, чтобы приложения, написанные на Symfony 1.0 запускались на версии 1.1 был сделан sfCompat10Plugin, который, насколько я понял, в версии 1.2 уберут совсем. К сожалению, проекты всё таки прийдется дорабатывать, чтобы они работали на Symfony 1.1, подробнее об этом можно прочесть <a href="http://svn.symfony-project.com/branches/1.1/UPGRADE">здесь</a>.</li>
<li> Переписан класс routing&#8217;а. Теперь все пути кешируются + от этого класса можно отнаследоваться и переделать, от чего бы я <a href="http://blog.fxposter.org/2008/03/21/regexp/">не отказался</a>.</li>
</ul>
<p>А теперь посмотрите и скажите - что из этого может реально пригодится? ИМХО:</p>
<ul>
<li>Form Framework</li>
<li>Зависимости в плагинах</li>
<li>Различные вьюхи в зависимости от того, какоt значение принимает хедер Accept</li>
</ul>
<p>Причем последние два пункта лично я пока не использовал бы нигде. Просто нет необходимости. К чему это я клоню - этот релиз чуть ли не официально был признан &#8220;промежуточным&#8221; - минимум новых интересных фич и очень сильная переработка кода, причем зачастую внутреннего, для облегчения дальнейшей поддержки и добавления новых фич в будущем. В частности - в версии 1.2 нововведений меньше, но они гораздо больше коснуться конечных пользователей фреймворка (коснуться - в хорошем смысле). Кстати говоря, версия 1.2 выйдет уже в октябре, через 3 месяца&#8230; Но это уже несколько друга история, о которой мы поговорим, скорее всего завтра.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/07/20/symfony-11/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Symfony 1.1 RC 2 и всякие интересности</title>
		<link>http://blog.fxposter.org/2008/06/11/symfony-11-rc-2-and-many-interesting-things/</link>
		<comments>http://blog.fxposter.org/2008/06/11/symfony-11-rc-2-and-many-interesting-things/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 07:41:44 +0000</pubDate>
		<dc:creator>fxposter</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Работа]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fxposter.org/?p=440</guid>
		<description><![CDATA[Вышел второй релиз-кандидат Symfony 1.1. Улучшений немного, по сравнению с предыдущими бетами и rc, что, несомненно, радует - версия 1.1 становиться всё стабильнее и стабильнее - уже и релиз не за горами. Тем временем Fabien (главный разработчик Symfony) разродился кучкой постов: Изменение структуры директорий в проектах на Symfony 1.1. Отсылка писем в Symfony 1.1 с [...]]]></description>
			<content:encoded><![CDATA[<p>Вышел <a href="http://www.symfony-project.org/blog/2008/06/09/say-hello-to-the-the-second-release-candidate-of-symfony-1-1">второй релиз-кандидат Symfony 1.1</a>. Улучшений немного, по сравнению с предыдущими бетами и rc, что, несомненно, радует - версия 1.1 становиться всё стабильнее и стабильнее - уже и релиз не за горами.</p>
<p>Тем временем Fabien (главный разработчик Symfony) разродился кучкой постов:</p>
<ul>
<li><a href="http://www.symfony-project.org/blog/2008/06/09/how-to-customize-the-directory-structure-in-symfony-1-1">Изменение структуры директорий в проектах на Symfony 1.1</a>.</li>
<li><a href="http://www.symfony-project.org/blog/2008/06/10/how-to-send-emails-in-symfony-1-1">Отсылка писем в Symfony 1.1 с помощью Swift Mailer</a>. В версии 1.0 для этого использовался PHP Mailer, обернутый в симфониевский декоратор.</li>
<li><a href="http://www.symfony-project.org/blog/2008/06/09/how-to-create-an-optimized-version-of-your-website-for-the-iphone-in-symfony-1-1">Как создать оптимизированную под iPhone версию вашего сайта с помощью Symfony</a>. За неприглядным (как по мне) названием лежит интересный рассказ о форматах представления и mime-type&#8217;ах. Советую почитать, очень интересно. Ах да, про iPhone всё-таки не забыли. :)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.fxposter.org/2008/06/11/symfony-11-rc-2-and-many-interesting-things/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced

Served from: blog.fxposter.org @ 2012-02-10 05:07:01 -->
