お正月はPHPと格闘
高木です。こんにちは。
今年のお正月は姫路の実家に帰省しているのですが、実家にいながらもPHPと格闘しています。
杉山と私には冬休みの宿題が出ているからで、休み明け(実際にはその翌週)には何らかのプログラムを公開しないといけません。
そんなわけで、私はPHPを使ったプログラミングに取り組んでいるわけです。
私はこれまでもPHPはある程度使ったことがあります。
今回せっかくPHPを使うので、これまでにも多用してきた言語仕様だけでプログラミングするのでは面白くありません。
まだ使ったことがない言語仕様、ライブラリ、久しぶりに使うそれらも含めて、いろいろ試してみたいと考えました。
今回試してみたPHPの言語仕様やライブラリを手当たり次第に挙げてみます。
- Pharファイル
- クラスのオートローディング
- 名前空間
- 関数の引数や返り値の型指定
- eval
なんかがそうです。
あらかじめ断っておかないといけないのですが、PHPを使うといってもWebプログラミングをやるわけではありません。
コマンドラインツールしか作らないのです。
なぜコマンドラインツールを作るのにPHPを使うのかについては、ここでは触れないことにしましょう。
まず、Pharファイルですが、単純にファイルをPharファイルに格納することは以前からやっていました。
今回はPharファイルの中にディレクトリ構造を作ることに挑戦しました。
いろいろ試しましたが、buildFromDirectoryメソッドを使うのが一番楽だという結論に達しました。
Pharファイルにスタブを設定して直接実行できるようにもしました。
Pharファイルにシンボリックリンクを設定して任意のコマンド名にすることにも挑戦しました。
シンボリックリンクを作ろうと ln -s コマンドを使ったものの、Msys2ではデフォルトではコピーが作られてしまうようで期待通りに動作しません。
どうやらMsys2では、環境変数 MSYS に winsymlinks:nativestrict を設定しなければならないようです。
さらに、管理者権限でbashを起動しないとシンボリックリンクを作る権限がないため怒られます。
クラスのオートローディングにも挑戦しました。
__autoloadはもう古いようなのでspl_autoload_registerを使いました。
コールバック関数に渡される引数にはクラス名が渡されますが、名前空間を使ったときに具体的にどのような文字列が渡されるのかも実験しました。
クラス名に関しては、名前空間を含む素直な文字列が渡されました。
たとえば、Foo名前空間内のBarクラスだとすれば、’Foo\Bar’という文字列が渡されます。
グローバル空間を指す最初の \ は付加されないようです。
オートローディングについては、includeやrequireで取りこんだスクリプトの関数外でクラスをnewした場合、spl_autoload_registerでコールバックを登録するより前のタイミングになってしまうことがあり、ちょっとはまりました。
これについてはそんなに大したことではなく、要するに私の不注意ですね。
かなり長くなってきたので、名前空間、関数の引数や返り値の型指定、evalについては次回に回したいと思います。