「モダンPHP勉強会」レポート

今日はモダンPHP勉強会に参加しました。
場所は六本木のGree。初めてきた!参加申し込み数70人で補欠待もでてます。


今回はモダンなPHPの使い方がテーマということで、最新のPHP技術を勉強したいと思います。


 以下は勉強会のメモ。
 聞いたものをだいたいそのまま書き写しているので、プレゼン資料が公開されたらそっちをみたほうが正確でよいかと思いますが、雰囲気を伝える意味で載せておきます。誤字脱字はご容赦を。
 また、当日はustreamでの中継もありました→こちら
 ustreamへの発言はtwitterハッシュタグで検索すればまとめて見られるでしょう。→こちら


                                                                                                                                    • -

■ もっと知りたい名前空間 (発表:fivestar氏) 資料

                                                                                                                                    • -


PHP5.3.0で搭載された名前空間について。
モダンといって思いつくのは・・・
PHP5から強化されたオブジェクト指向
フレームワークの機能


名前空間概要
 UNIXファイルシステムディレクトリがなかったら、ファイル名がかぶって大変><
 ファイル名がかぶるからと一部改変して対処してもzipを展開したらかぶっちゃったり!
 PHPでも関数名やクラス名がかぶってこまることはよくある。
 ↓
 これを解決するのが名前空間


 名前空間は。PHP5.3.0から実装されて、関数名、クラス名、定数なごが衝突するのを防ぐ。
 変数名は適用されない。


<?php
namespace foo\bar; // 名前空間の制限 この前の行になにも書いてはいけない!
class MyObject{} // foo\bar\MyObject となる
$obj = new MyObject(); // foo\bar\MyObject


名前空間は、「namaespase」で宣言。名前空間の区切りは「\」(バックスラッシュ→日本語フォントだと円マークだけど・・・まあ一文字でうちやすいから・・・かわいい・・・なれてから文句いってくださいとのこと)
先頭に「¥」をつけるとグローバル(ルート)からの絶対指定になる。
UNIXファイルシステムディレクトリと考えるとわかりやすい。
「__NAMESAPCE__」定数、namespace演算子で現在のnamespaceを得られる。



▼ 定義
非修飾名 区切り文字を含まない識別子
修飾名 区切り文字を含まない識別子
完全修飾名 区切り文字を含まない識別子



▼ インポート・エイリアス

<?php
use foo\Foo; // インポート 現在の名前空間にインポートされ名前空間を省略できる
$obj = new Foo();


use MyApplicaion_MyObj as MyObj; // エイリアス
$obj = new MyObj();


use bar\baz as baz; // 名前空間エイリアス
$obj = new baz\MyObj();


※ 同盟の名称でinportはできない


▼ 同一空間で名前空間を複数指定する場合

複数書けば良い。
namespaceがでてくるごとに、切り替わる。
または、{ } で囲むと、その範囲がnamespaceで指定される。こっちのほうがよい。

※ namespace { } で囲まれるとグローバル空間で指定される。
※ ネストはできない
※ 一つのファイルで名前空間を複数指定可能。同一の複数の名前空間がいくつも記述することも可能。
※ ただし、1つのファイルには1つの名前空間が望ましい




名前空間の注意点

▼ 名前解決ルール

現在の名前空間からの相対指定となる。
・クラスは、名前空間にないとみつからない
・関数は、名前空間になければグローバルの空間を探しに行く
・動的に文字列変数をnew して、その保持している文字のクラスを生成できる。
 ※ ただし、「¥」はエスケープ文字なので、「”」ではなくて「’」で囲んだ文字列で指定しないといけない。
 ※ 文字列で指定した場合はkならずグローバル空間から指定されるので注意!
   (名前解決はコンパイル時に行われるため、実行時には名前解決を行われないためと考えられる)



名前空間とオートロード(フレームワークでよく利用される)

 apl_autoload_register で関数を指定すると、指定した関数が読み込まれていない状態で使用しようとしたときに実行されるスクリプトをかける。


 名前空間内で、オートロードされた場合は、グローバル指定された名前空間(名前解決された)に変換されてクラス名が渡される。


 useをしただけではクラスはロードされない。
 オブジェクトをnewした時点で、オートロードされる。


 class_exists()でクラスの存在判定ができる。
 デフォルト引数ではない場合は、オートロードされる。この場合は、文字列のまま(グローバルからの指定)でクラスがロードされる。



名前空間フレームワーク


 Symphonyやドクトリン(O/Rマッパー)は、名前空間を活用して開発されている。
(その他のフレームワークでも名前空間を活用するようになっていくだろう)


▼ 「PHP Standrds Working Group」で策定中 (Google Group内)

 「Coding standard for PHP 5.3 and above」にで、名前空間に関するルールが定められている。
名前空間は、常に小文字+アンダースコア
・トップレベルはベンダー名(最短で)。例)zend , cake など
・サブの名前空間は自由につかってよい
名前空間のセパレータは、ディレクトリセパレータを表す
・名前はアンダースコア(_)は意味を持たない(ディレクトリではない)


【クラス名】
・アッパーキャメルで命名
・クラス名のアンダースコアは(_)は、ディレクトリセパレーターと表す
・インターフェースは、Interfaceサフィックスをつける
・抽象クラスは、Abstractサフィックス


【例外に関するルール】
・すべてのパッケージはパッケレベルのExceptionを低具する
・可能な限りSPLレ外を使う (それ以外はパッケージレベルの例外)


【主要フレームワーク対応状況の例)】
Lithiumフレームワーク
 命名規則は準拠している。


Zend Framework , PEAR2
 不明?準拠する?
 PEAR2は、pear2と先頭のベンダー名だけは小文字で準拠している模様。その下位階層は準拠しないかも


symfony / Doctrine
 名前空間もアッパーキャメル
 ※ PEAR命名規則のおける 「_」 を 「¥」に置き換えているだけのような・・・
 ※ 開発開始が、groupが出来る前だったためではないか?


・・・準拠状況はまちまちみたいですね・・・
SplClassLoaderというオートローダを使えば、いろいろな命名規則に対応できるらしい



◆ 感想 ◆
 名前空間は他のモダンぽい言語同様整備されている。
 インポートやエイリアスは便利そう。
 ただ、展開のされ方(カレントから相対かグローバルからか)が場合によってちがうのがハマリそう。
 命名規約については統一化するためのワーキンググループがあるが、有力フレームワークも準拠出来ていないものが多くカオスっぽい。




                                                                                                                                    • -

■ ぜんぶ見せますSPL (発表:sotarok氏)資料

                                                                                                                                    • -


● SPLとは
「Standard PHP Library」


PHP5に標準搭載された拡張機能
PHPの「標準的な問題」を解決するための
・クラス
・インターフェース
・例外
など


PHP5.0以降で対応。5.3では無効にできないためかならずインストールされている。
バージョンがあがるたびにかなりバージョンがあがってる。


ただまだ利用者が少ないため、「なにがあのが」「どんなときにつかえそうか」を今回解説。


▼ おさらい;PHPのインターフェース
interface句で定義できる。5.0から対応。
定義済みのインターフェースは以下のものがある
・Traversable → foreac可能になる(抽象インターフェース)
Iterator → 反復処理を行うためのインターフェース (nextとかcurrent,keyなど)
・IteratirAggrigator → 外部イテレータを作成するためのインターフェイス
・ArrayAccress → 配列風にアクセス可能になる これ→[]  
・Serializable → serialize/unsirialize時の挙動を独自実装できる



● SPLのインターフェース群(ほとんどイテレータ用)

・Countable → count関数の引数に渡せるよういになる
・OuterIterator → イテレータインターフェイスイテレータを作るための
・RecursiveIterator → 階層構造をもつクラスを実装する
・SeekableItrerator → seekメソッドによっていてレート位置をいどうして要素のアクセスする


● SPLのクラス

・SplFileinfo → フィル譲歩うを扱うクラス(SplFileObjectなどのベース)GetRealaPath ,getBasenameなど
・SplFileObject → ファイルをオブジェクトとしての読み書きを扱えるようにするクラス。複数イテレータが実装されているため、1行づついてレートしたりできる。標準のPHPの関数と同じようなメソッドが実装されている →一時ファイル用は、SplTmpFileObject
・ArrayObject→ オブジェクトを配列として動作させることができる →クラスの複数のメンバーを配列のようにアクセスdけいる
・SplObserver/SplSubject → Observerパターンを実装するためのクラス。実装は自分でする。(PEAR::HTP_Request2などで活用されている)


● SPLのイテレーター 
23個もある→今回は18個だけ
・ArrayIterator → 配列をイテレートするためのもの(配列からイテレータをgetして使う。配列でやる意味は?)
・RecursiveArrayIterator → 階層配列をイテレートする。でもこのままでは、再帰はされない。→RecursiveIteratorIteratorを使うと再帰されて全部をイテレートでいる。
・InifinityIterator → 無限にくりかえされるイテレーター。カッコいい!けど、何につかうのか?
・LimitiiTERATOR → オフセット、イテレート回数制限を指定できる (Zendでもにたようなものがつかえわれていた)
・DirectoryIterator → 指定ディレクトリのファイルの一覧などとれる(ワイルフォカードでフィルタもできる)
・RecurciveDeirectoryIterator → 再帰的にディレクトリ階層をスキャンできる。これは便利だな
・RecursiveTreeIterator → ツリー表示ででてくる。アスキーアート
・FileSystemIterator→DirectoryIteratorを継承する。フラグを指定して、「.」「..」などをスキップしたりといった指定ができる。foreachのasでうける変数に、なにをいれるか指定できる。
 ※ __DIR__ 定数は、PHP5.3でつかるようになったよ
・GlobIterator → フラグで指定できる?
・FilterIterator → 「望まざる値をフィルタしてくれる」 acceptメソッドを実装すうことででフィルター対象を判定する(戻り値で指定)
・RecurusiveFilterIterator →再基板
・RegexIterator→FilterIteratorを継承。正規表現でマッチするかを判定できる
・NoRewidIterator →Rewindできないイテレータ。stdinなどをforeachにかけることができるようになるよ
・MultipleIterator →複数のイテレーターを同時にまわすことがdけいる。→複数ファイルを並列に同時に処理したいときに使うなど。AttachIteratorメソッドでイテレーターを登録、同時にそれぞれが進む
・SimpleXMLIterator →SimpleXMLをイテレートできる →RecursiveIteratorIteratorにわたすとXMLを全部スキャンできる
・EmptyIterator →空のイテレーター →使い道わからない →NULL Iteratorとして使うらしい(会場より)


● SPLのException
  SPL例外
 せっかく対応してるのにPHPの組み込み関数ではあんまり例外とばさない。
 SPLでは、エラー時は例外を活用している


● SPLのFunction


リフレクション的な
・clss_implement →そのクラスが実装しているインプリメントを返す
・class_parameter


イテレーター的な
iterator_to_array など


クラス的な
・spl_calasses →利用可能なSPLクラスを帰る
・spl_oject_hash


「spl_autoload」
PHPのautoloadを便利にするクラス。よく利用されている。
・spl_autoread_register → クラス、メソッドをautoloadに登録できる
・apl_autoload → autoloadのデフォルトの実行。Hogeクラスをnewすると、hoge.php , hoge.incを自動的に呼び出す →拡張子をしてするための関数も用意されている


autoloadはライブラリ開発者が主に利用するだろう



PHPのDATA STRUCTURE

・SplDoublyLinkedList → リンクリスト。キューやスタックを実装できる。
・SplStack / SplQueue → スタック、キュー
PHP標準のArrayにpush,popすることでも同じことはでいるが・・・ベンチしたが速度はほとんどかわらなかった。
など・・・



● まとめ

SPL便利
ぱっとみ使い道がわからないものもあるが、この機会につかってみてもらいたい。


◆ 感想 ◆
 大変便利なライブラリ群だとおもった。もっと使うべき。
 PHP5.3からは標準で搭載(オフにできない)ため、安心して使えるのはイイ
 Autoloadと組み合わせて、オレオレフレームワークを作りたくなるね


 第1部、第2部とも大変得るものがありました。
 従来型の開発だけではなく最新のPHPの有用な機能を活用することでできることや効率がぐんと大きくなると思います。


 その後懇親会。
 乾杯〜

 こちらでの勉強会は初めて参加しましたが、熱い議論を交わせたり期待以上に楽しかった。
 デザイナーとの分業の方法論(みなさん採用している方式にはこだわりがある)や、新サービスについてなど語り合いました。


PHPのテンプレートエンジンについて突発LT





 おつかれさまでした。