蛇使いの日常

コーンスネークを飼っているPythonエンジニアの日常や技術のことなど

PHPのSplFileObjectは微妙かもしれない

はじめに

蛇使いといいながら、現在仕事ではPHPで開発をしています。

ガッツリPythonで仕事していたり、いくつもシステムを作ていましたが、今回はPHPネタです。

 

SplFileObject

PHPにはSplというStandard PHP Libraryというものがあります。標準PHPライブラリですね。昔ネームスペースあり版のオートロードをやる時に、SPLを使ったことがあります。それにファイル系の処理をオブジェクトで扱えるSplFileObjectというものができていました。知らなかった~。

 

しかし、仕事でこれを使おうとしていたのですが、一つ問題がありました。

やりたかったことは、CSVファイルを出力することです。

CSV出力では面倒なので、fputcsv関数、SplFileObjectではfputcsvメソッドですね。こちらを使う前提です。

fputcsvを使う場合にやらないといけないこと、文字コード変換以外にも改行コードをLFからCRLFにしないといけません。

 

どうやるか?

改行コードをLFからCRLFに変換しないといけないわけですが、クラスを作ってstream_filter_registerに登録し、stream_filter_appendでファイルのストリームにCRLFを設定しなければなりません。

 

何が問題か?

fopenの返り値はファイルのストリームです。stream_filter_appendでは、ストリームを指定する必要があります。しかしSplFileObjectが返すものは、オブジェクトであり、ストリームではありません。そしてストリームにアクセスする方法がありません。そんなわけで、SplFileObjectからstream_filter_appendを使うことはできないのです。

 

本当はfputcsvが悪い?

fputcsvがLF固定ではなく、引数でCRLFを指定できるようになっていたら問題はありませんでした。fputcsvを使うのではなく、fputsでやる場合はSqlFileObjectで問題ありませんね。

 

最後に

久しぶりにPHPをやっていますが、いつもベストプラクティスを確率するには手が届かないことが多いです。妥協するという気持ちを忘れずやっていくしかありません。