人のソースを読むと勉強になる
Keitaです。
僕はもともと、Delphiの技術者で、PHPに関してはほとんど独学で勉強してきました。
もともとHTTP周りのアプリケーションには興味があり多少の知識やバッドノウハウはあったのですが、明確なスタイルは、いくつかの書籍を呼んでみても残念ながら得られませんでした。
で、ある日悩んでたところ、Pukiwikiというオープンソースのスクリプトを設置することになり、設置の方法について調べているうちにソースを読むことになりました。
で、Perlで掲示板!!とかいう時代のころにしては、Pukiwikiってわりと綺麗なソースなのでコーディングスタイルを含めてかなりいろいろなところが勉強になりました。
特に印象に残っているのがこのコードです。
function input_filter($param)
{
static $magic_quotes_gpc = NULL;
if ($magic_quotes_gpc === NULL)
$magic_quotes_gpc = get_magic_quotes_gpc();
if (is_array($param)) {
return array_map('input_filter', $param);
} else {
$result = str_replace("\0", '', $param);
if ($magic_quotes_gpc) $result = stripslashes($result);
return $result;
}
}
僕がみたころのコードはもっとはるかに単純だったと思います。
このプログラムは再起処理をする必要があるプログラムでarray_mapで処理しています。
このため、より高速にプログラムが処理できるようになっています。
このわずか15行にもみたないプログラムでも、いろいろなことを学びました。
今世の中で、公開されているPHPのスクリプトはわりといいものも悪いものもあったりして、どれを読んだらいいのかというのはわかりづらいかと思いますが、もし、今読むとしたら。
Zend Frameworkや、Ethna、Symfonyなどのフレームワークがお勧めです。
僕はEthnaを読むことが多いのですが、PHP4的なオブジェクト指向の絶妙な妥協点とかが見えて非常に面白いです。
あと、最近は、Cの勉強をしようかとおもっていて、PHP本体のソースコードにも目を通すようになりました。
まだぜんぜんわからないですが、少しずつわかってきてこれでいざとなったら、PHPのバグも直せるようになったらなーと思っています。
オープンソースが流行して、いろいろなソースが読めるような時代になったのは、技術者として非常にエキサイティングな時代になったと思います。
もし、読んでる途中でバグを見つけたりしたら、そのパッチを投げたりすれば、もしかすると新しい出会いがあるかもしれません。
社内のコードばかり見ているのもいいですが、たまには外のコードを時間をかけて読んで見てはいかがでしょうか。

コメント
PukiWikiのコードってかなり読みくかった気がします.HTMLとPHPがごちゃごちゃになってて(今はどうか知らないけど).
PHPのアプリケーションだと XOOPSとかWordPressは比較的きれいだと思います.コードの断片でよければPEARも参考になりますよ.
投稿者: ttsuruoka@unoh | 2006年10月 3日 15:02
本来テンプレート扱いとなるSkinまでの流れは、当時としては、結構、綺麗でした。
テンプレートを修正しようとすると、SkinがPHPとまぜこぜなので、そう感じるかもしれません。
定期的にリファクタもされていているようなので。今後も改善は期待できると思います。
投稿者: keita@unoh | 2006年10月 3日 15:10
今はskin以外は大分整理されていると思います
テンプレートエンジンがないのでプラグイン内はHTMLと混在してますけどね
コード量が少ない分まだよめるのかなぁとか言う側面はあるかと
綺麗なコードだとJawsはそこそこ綺麗にMVCで書かれていると思います
MDB2の勉強にもなっていいかも(デバッグ目的以外にまじめに読んでないけど
あとXOOPSならXOOPS Cubeもありだと思いますがコード量がべらぼうに増えてるのでそれはそれで大変かも(苦笑
投稿者: jokagi@unoh | 2006年10月 3日 15:11
僕が最初に読んだのはFreeBSD(98)のソースコードでした。
UNIX のソースコード読むなら、最初は FreeBSD がいいと思います。
FreeBSD なら最初から OS にソースコードがついてるし、OS とセットになってるのでプログラムも簡潔で短くて読みやすい。
Linux だと普通はソースパッケージ入れないといけなくて面倒だし、GNU のソフトウェアはマルチプラットフォーム前提なので、非互換性の処理がいろいろ入ってたりして雑音が多いので、本質的な部分を理解するのに時間がかかってしまう。
投稿者: masato | 2006年10月 3日 15:26
>Jaws
おー読んでみます。
Xoopsは、何回か挑戦しているのですが、いまいちコードになじめていません。もう一回やってみよう。
>FreeBSD
ほーほー。参考になります。
でもここら辺って全体的に今だと肥大化してそうですね。
というか98が懐かしいです...
投稿者: Keita | 2006年10月 4日 10:24
どうでもいいけど一応
s/Pukiwiki/PukiWiki/
ですね
array_map()もそろそろarray_map_recursive()とかできないかなぁ
投稿者: jokagi@unoh | 2006年10月 6日 11:03
array_map()で設定する関数に送り値を設定できるようになるとうれしいですねー
投稿者: Keita | 2006年10月 6日 14:57
送り値って何だろ
任意の値を渡したいとかなら
array_walk()が使えます
http://php.net/array_walk
問題は任意の引数を追加すると常にE_NOTICEでることなんですけど
#この配列をなめて$fooに結果をまとめたいとかによく使いました > array_walk()
投稿者: jokagi@unoh | 2006年10月 6日 15:10