<?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>Sooey &#187; php</title>
	<atom:link href="http://old-journal.sooey.com/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://old-journal.sooey.com</link>
	<description></description>
	<lastBuildDate>Fri, 04 Dec 2009 08:44:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHPで高階プログラミング</title>
		<link>http://old-journal.sooey.com/2009/05/24/1111/</link>
		<comments>http://old-journal.sooey.com/2009/05/24/1111/#comments</comments>
		<pubDate>Sun, 24 May 2009 12:03:11 +0000</pubDate>
		<dc:creator>juno</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.sooey.com/journal/?p=1111</guid>
		<description><![CDATA[SIGUSR2 > Higher Order PHP

PHPプログラマ的に実用的かどうかはさておき、SIGUSR2で紹介されているFnクラスをPHP 5.3(今ならRC2か)とセットで使うと、以下のようなコードを動かすことができる。

&#60;?php
require_once 'Fn.php';
&#160;
$r = Fn::foldl&#40;function &#40;$accumulated, $next&#41; &#123;
        return $accumulated += $next;
    &#125;, 100, array&#40;1, 2, 3&#41;&#41;;
&#160;
var_dump&#40;$r&#41;;  // =&#62; 106

面白いけれど、PHPプログラマの手には余るような気も。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://sigusr2.net/2009/Feb/06/higher-order-php.html">SIGUSR2 > Higher Order PHP</a></p>

<p>PHPプログラマ的に実用的かどうかはさておき、SIGUSR2で紹介されている<code>Fn</code>クラスをPHP 5.3(今ならRC2か)とセットで使うと、以下のようなコードを動かすことができる。</p>

<p><pre class="php"><span class="kw2">&lt;?php</span>
<span class="kw1">require_once</span> <span class="st0">'Fn.php'</span>;
&nbsp;
<span class="re0">$r</span> = Fn::<span class="me2">foldl</span><span class="br0">&#40;</span><span class="kw2">function</span> <span class="br0">&#40;</span><span class="re0">$accumulated</span>, <span class="re0">$next</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> <span class="re0">$accumulated</span> += <span class="re0">$next</span>;
    <span class="br0">&#125;</span>, <span class="nu0">100</span>, <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="nu0">1</span>, <span class="nu0">2</span>, <span class="nu0">3</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
&nbsp;
<a href="http://www.php.net/var_dump"><span class="kw3">var_dump</span></a><span class="br0">&#40;</span><span class="re0">$r</span><span class="br0">&#41;</span>;  <span class="co1">// =&gt; 106</span></pre></p>

<p>面白いけれど、PHPプログラマの手には余るような気も。</p>
]]></content:encoded>
			<wfw:commentRss>http://old-journal.sooey.com/2009/05/24/1111/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mixinは有害か？</title>
		<link>http://old-journal.sooey.com/2009/05/20/1090/</link>
		<comments>http://old-journal.sooey.com/2009/05/20/1090/#comments</comments>
		<pubDate>Wed, 20 May 2009 13:44:03 +0000</pubDate>
		<dc:creator>juno</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.sooey.com/journal/?p=1090</guid>
		<description><![CDATA[ちょっと前のときどきの雑記帖で紹介されていたMixins considered harmfulシリーズが面白そうだったので1と2を読んでみた。

Mixins considered harmful/1
Mixins considered harmful/2
Mixins considered harmful/3
Mixins considered harmful/4

以下、かんたんなまとめ。

Mixinを使いすぎるとクラス階層が爆発して、1クラスに数百メソッドなんて状況が頻発する

IDEのキーワード補完や、自動生成したAPIドキュメントが役立たずになる

Mixinはフレームワーク作成者にとっては便利

作成者はクラスの階層・関係が頭に入っているから

Mixinはフレームワーク利用者には不便

フレームワークのバグや挙動を調べようと深みに入ると処理を追い切れなくなる

比較的小規模で品質が安定したライブラリで使うぶんにはまあ許容範囲

しかしフレームワークは重厚長大になろうとしがちなので、そのうち罠にはまる

Zope2はMixinに害されてしまったため、Zope3はMixinではなくコンポジションを多様した

コンポジションは転送(Forwarding)のこと、委譲(Delegation)と似ているが少し違う

PHP界隈でも、Rails wannabeなフレームワークだと頑張って疑似Mixinを実現しているものがあるけれど、利用者からすると必ずしも嬉しいとは限らないということか。PHPだと結局マジックメソッドを駆使して実装することになるから、なおさらコードを追いづらいだろうなあ。
]]></description>
			<content:encoded><![CDATA[<p>ちょっと前の<a href="http://www.kt.rim.or.jp/%7ekbk/zakkicho/09/zakkicho0905a.html#D20090507-3">ときどきの雑記帖</a>で紹介されていたMixins considered harmfulシリーズが面白そうだったので1と2を読んでみた。</p>

<ul>
<li><a href="http://www.artima.com/weblogs/viewpost.jsp?thread=246341">Mixins considered harmful/1</a></li>
<li><a href="http://www.artima.com/weblogs/viewpost.jsp?thread=246483">Mixins considered harmful/2</a></li>
<li><a href="http://www.artima.com/weblogs/viewpost.jsp?thread=254367">Mixins considered harmful/3</a></li>
<li><a href="http://www.artima.com/weblogs/viewpost.jsp?thread=254507">Mixins considered harmful/4</a></li>
</ul>

<p>以下、かんたんなまとめ。</p>

<ul>
<li>Mixinを使いすぎるとクラス階層が爆発して、1クラスに数百メソッドなんて状況が頻発する

<ul>
<li>IDEのキーワード補完や、自動生成したAPIドキュメントが役立たずになる</li>
</ul></li>
<li>Mixinはフレームワーク作成者にとっては便利

<ul>
<li>作成者はクラスの階層・関係が頭に入っているから</li>
</ul></li>
<li>Mixinはフレームワーク利用者には不便

<ul>
<li>フレームワークのバグや挙動を調べようと深みに入ると処理を追い切れなくなる</li>
</ul></li>
<li>比較的小規模で品質が安定したライブラリで使うぶんにはまあ許容範囲

<ul>
<li>しかしフレームワークは重厚長大になろうとしがちなので、そのうち罠にはまる</li>
</ul></li>
<li>Zope2はMixinに害されてしまったため、Zope3はMixinではなくコンポジションを多様した

<ul>
<li>コンポジションは転送(Forwarding)のこと、委譲(Delegation)と似ているが少し違う</li>
</ul></li>
</ul>

<p>PHP界隈でも、Rails wannabeなフレームワークだと頑張って疑似Mixinを実現しているものがあるけれど、利用者からすると必ずしも嬉しいとは限らないということか。PHPだと結局マジックメソッドを駆使して実装することになるから、なおさらコードを追いづらいだろうなあ。</p>
]]></content:encoded>
			<wfw:commentRss>http://old-journal.sooey.com/2009/05/20/1090/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>レガシーなPHPコードをモック関数でテストする</title>
		<link>http://old-journal.sooey.com/2009/03/29/1039/</link>
		<comments>http://old-journal.sooey.com/2009/03/29/1039/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 03:24:32 +0000</pubDate>
		<dc:creator>juno</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.sooey.com/journal/?p=1039</guid>
		<description><![CDATA[クラスをあまり使っておらず、関数を中心に構築されているレガシーなPHPコードをテストするにはどうするか。

テストしたい対象がユーザ定義関数であれば、実際の関数定義を含んだファイルとは別にテスト用の挙動をするモック関数の定義を含んだファイルを用意しておき、ユニットテスト時には後者をrequireするという手法があるが、例えばmysql_connect()のような組み込みの関数の場合はそうもいかない。

Test your Legacy PHP Application with Function Mocks!では、PECLのrunkitモジュールを使うことで実行時に関数を再定義してしまう方法が紹介されている。

テスト対象となるすべての関数をいちいち置き換えていくのは大変だし、組み込みの関数を書き換えてしまう場合の副作用も気になるので常に使えるというわけではないけれど、憶えておくと役に立つ時があるかもしれない。
]]></description>
			<content:encoded><![CDATA[<p>クラスをあまり使っておらず、関数を中心に構築されているレガシーなPHPコードをテストするにはどうするか。</p>

<p>テストしたい対象がユーザ定義関数であれば、実際の関数定義を含んだファイルとは別にテスト用の挙動をするモック関数の定義を含んだファイルを用意しておき、ユニットテスト時には後者を<code>require</code>するという手法があるが、例えば<code>mysql_connect()</code>のような組み込みの関数の場合はそうもいかない。</p>

<p><a href="http://www.whitewashing.de/blog/articles/115">Test your Legacy PHP Application with Function Mocks!</a>では、PECLの<a href="http://pecl.php.net/package/runkit">runkit</a>モジュールを使うことで実行時に関数を再定義してしまう方法が紹介されている。</p>

<p>テスト対象となるすべての関数をいちいち置き換えていくのは大変だし、組み込みの関数を書き換えてしまう場合の副作用も気になるので常に使えるというわけではないけれど、憶えておくと役に立つ時があるかもしれない。</p>
]]></content:encoded>
			<wfw:commentRss>http://old-journal.sooey.com/2009/03/29/1039/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quality Assurance in PHP Projects</title>
		<link>http://old-journal.sooey.com/2009/03/06/1026/</link>
		<comments>http://old-journal.sooey.com/2009/03/06/1026/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 03:47:10 +0000</pubDate>
		<dc:creator>juno</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[book]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sooey.com/journal/?p=1026</guid>
		<description><![CDATA[PHPUnitのSebastian Bergmann氏とthePHP.ccのStefan Priebsch氏がQuality Assurance in PHP Projectsという書籍の執筆をしており、英語版とドイツ語版が今年後半に出版される予定だそうです。

PHPを使って大規模サイトを構築している人や、PHPを使っているオープンソースプロジェクトからケース・スタディを集約してまとめたものになる模様。書名が「PHPプロジェクトにおける品質保証」ということで、よくあるPHP入門書ではなくもっと実用的な内容を期待できそうです。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.phpunit.de/">PHPUnit</a>の<a href="http://sebastian-bergmann.de/">Sebastian Bergmann</a>氏と<a href="http://thePHP.cc/">thePHP.cc</a>のStefan Priebsch氏が<a href="http://qualityassuranceinphpprojects.com/">Quality Assurance in PHP Projects</a>という書籍の執筆をしており、英語版とドイツ語版が今年後半に出版される予定だそうです。</p>

<p>PHPを使って大規模サイトを構築している人や、PHPを使っているオープンソースプロジェクトからケース・スタディを集約してまとめたものになる模様。書名が「PHPプロジェクトにおける品質保証」ということで、よくあるPHP入門書ではなくもっと実用的な内容を期待できそうです。</p>
]]></content:encoded>
			<wfw:commentRss>http://old-journal.sooey.com/2009/03/06/1026/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 5.3のgoto</title>
		<link>http://old-journal.sooey.com/2008/12/31/925/</link>
		<comments>http://old-journal.sooey.com/2008/12/31/925/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 03:52:19 +0000</pubDate>
		<dc:creator>juno</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.sooey.com/journal/?p=925</guid>
		<description><![CDATA[PHP 5.3のリリースマネージャ、Johannes Schlüterさんのブログの「A hidden gem in PHP 5.3」シリーズ第三弾、gotoについて。

Goto your Christmas presents with PHP 5.3 &#8211; Johannes Schlüter

ここ数日間、PHP 5.3の秘宝についていくつか紹介してきた。今はクリスマスだし、PHP次期バージョンの新しい言語機能について見てみることにしよう:

jump label演算子の追加 (制限されたgoto) (Dmitry, Sara)

過度な悪評をさけるため上記のNEWSエントリは意図的に不明確になっている。が、クリスマスに家族と共に過ごさずにこれを読んでいるってことは、君はギークでありPHP 5.3には名前空間の他にgotoも導入されるってことを知っていると思う。そう、これはgotoラベルだ。NEWSエントリで書かれているように、同じ実行単位（関数内または同じファイル中のグローバル部分）内にしかジャンプできず、またループ内へのジャンプもできないという制限がある。

gotoを知っているのならば、それが酷いものであるということも知っているだろう。ではなぜ我々はそれを追加したのか？gotoが許されるとても限られたケースがいくつかあるんだ。ひとつは生成されたコード。コードジェネレータはgotoを使うことでgoto無しの場合よりもよりよいコードを書くことができるし、どのみち誰も生成されたコードを見ようなんて思わない。二つ目のシチュエーションは長いコードの固まりがあるときで、しかもその中で実行を中断して色々な後始末をしなきゃならない場合。短い擬似コードだとこんな感じだ:

&#60;?php
function process_file&#40;$filename&#41; &#123;
    $fp = fopen&#40;$filename, &#34;r&#34;&#41;;
    if &#40;!$fp&#41; &#123;
        goto cleanup;
    &#125;
&#160;
    $row [...]
]]></description>
			<content:encoded><![CDATA[<p>PHP 5.3のリリースマネージャ、<a href="http://schlueters.de/">Johannes Schlüter</a>さんのブログの「A hidden gem in PHP 5.3」シリーズ第三弾、gotoについて。</p>

<hr />

<h2><a href="http://schlueters.de/blog/archives/94-Goto-your-Christmas-presents-with-PHP-5.3.html">Goto your Christmas presents with PHP 5.3 &#8211; Johannes Schlüter</a></h2>

<p>ここ数日間、PHP 5.3の秘宝についていくつか紹介してきた。今はクリスマスだし、PHP次期バージョンの新しい言語機能について見てみることにしよう:</p>

<pre><code>jump label演算子の追加 (制限されたgoto) (Dmitry, Sara)
</code></pre>

<p>過度な悪評をさけるため上記のNEWSエントリは意図的に不明確になっている。が、クリスマスに家族と共に過ごさずにこれを読んでいるってことは、君はギークでありPHP 5.3には名前空間の他にgotoも導入されるってことを知っていると思う。そう、これはgotoラベルだ。NEWSエントリで書かれているように、同じ実行単位（関数内または同じファイル中のグローバル部分）内にしかジャンプできず、またループ内へのジャンプもできないという制限がある。</p>

<p>gotoを知っているのならば、それが酷いものであるということも知っているだろう。ではなぜ我々はそれを追加したのか？gotoが許されるとても限られたケースがいくつかあるんだ。ひとつは生成されたコード。コードジェネレータはgotoを使うことでgoto無しの場合よりもよりよいコードを書くことができるし、どのみち誰も生成されたコードを見ようなんて思わない。二つ目のシチュエーションは長いコードの固まりがあるときで、しかもその中で実行を中断して色々な後始末をしなきゃならない場合。短い擬似コードだとこんな感じだ:</p>

<p><pre class="php"><span class="kw2">&lt;?php</span>
<span class="kw2">function</span> process_file<span class="br0">&#40;</span><span class="re0">$filename</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="re0">$fp</span> = <a href="http://www.php.net/fopen"><span class="kw3">fopen</span></a><span class="br0">&#40;</span><span class="re0">$filename</span>, <span class="st0">&quot;r&quot;</span><span class="br0">&#41;</span>;
    <span class="kw1">if</span> <span class="br0">&#40;</span>!<span class="re0">$fp</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        goto cleanup;
    <span class="br0">&#125;</span>
&nbsp;
    <span class="re0">$row</span> = <a href="http://www.php.net/fread"><span class="kw3">fread</span></a><span class="br0">&#40;</span><span class="re0">$fp</span>, <span class="nu0">1024</span><span class="br0">&#41;</span>;
    <span class="co1">// 行に対して色々な処理をする</span>
    <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$error_while_processing</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        goto cleanup;
    <span class="br0">&#125;</span>
&nbsp;
    <span class="re0">$a_few_bytes</span> = <a href="http://www.php.net/fread"><span class="kw3">fread</span></a><span class="br0">&#40;</span><span class="re0">$fp</span>, <span class="nu0">4</span><span class="br0">&#41;</span>;
    <span class="co1">// また色々な処理 ...</span>
        <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$error_while_processing</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        goto cleanup;
    <span class="br0">&#125;</span>
&nbsp;
    <span class="coMULTI">/* ... */</span>cleanup:
    <a href="http://www.php.net/fclose"><span class="kw3">fclose</span></a><span class="br0">&#40;</span><span class="re0">$fp</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span class="kw2">?&gt;</span></pre></p>

<p>この他にも、コード全体をループで囲んでbreakを使うとか、try {} catchブロックで囲んで例外を投げるとか色々な方法はある。だが、gotoを使うとより綺麗になる（cleaner）。So have fun and use it with care!</p>
]]></content:encoded>
			<wfw:commentRss>http://old-journal.sooey.com/2008/12/31/925/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
