前回あれれ?な状態で終わったのでその続き。
保存できていなかったはずのfile.txtですが、予想外なところで発見されました。
C:\xampp\apache\file.txt
どういうことか。
実はデストラクタの実行されるタイミングでカレントディレクトリが変わってしまうのです。
明示的にunset等を利用して参照を切断すると、その時点でデストラクタが実行されます。
この場合のカレントディレクトリは、通常のメソッドと同じくプログラムのある場所です。
何も書かずに終了した場合、参照が切断されるのはプログラムの終了後です。
従ってデストラクタもプログラムの終了後に実行されます。
この場合のカレントディレクトリは、何故かApacheの作業フォルダになってしまうのです。
試してみましょう。
デストラクタを変更します。
filereader.class.php
public function __destruct(){ var_dump(getcwd()); } |
呼び出し側
file.php
<?php require_once('./filereader.class.php'); $fp=new fileReaderClass('file.txt'); unset($fp); ?> |
実行結果。
string(23) "C:\xampp\htdocs\src\php"
file.php
<?php require_once('./filereader.class.php'); $fp=new fileReaderClass('file.txt'); ?> |
実行結果。
string(15) "C:\xampp\apache"
なんてこった。
unsetのような一見無関係に見える命令で実行結果が変わってしまいます。
こんな不安なクラスを放置しておくわけにはいきません。
常にフルパスを取得し、同じファイルを参照できるように変更します。
filereader.class.php
public function __construct($file_name){ |
dirname(__FILE__)で絶対パスを取得して設定することで、以後ファイルには常にフルパスでアクセスすることができます。
unsetの有無によって保存先が変わるようなことももうありません。
ちなみにWindowsのパス区切りは\であり、Linux環境との差異を吸収するDIRECTORY_SEPARATOR定数なんかも用意されていますが、PHPではそこらへんは自動的に変換してくれるのであまり気にしなくてもよかったりします。
このクラスを使用することにより、今後はファイルを通常の変数と同じように扱うことが出来るようになります。
実用とするには、タブや改行のエスケープを追加したりディレクトリトラバーサル対策を考えたりといった改良が必要となりますが、個人ユースならこのくらいでいいでしょう。