忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/05/01 15:16 |
PHP1-14:ファイルに保存クラスの追記

前回あれれ?な状態で終わったのでその続き。


保存できていなかったはずの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){

            $file_name=dirname(__FILE__)."/".$file_name;

            $tmp=file($file_name,FILE_SKIP_EMPTY_LINES);
            
            if($tmp===false){
                  return false;
            }
            
            foreach($tmp as $tmp_loop){
                  $tmp_ex=explode("\t",$tmp_loop);
                  $tmp_array[$tmp_ex[0]]=trim($tmp_ex[1]);
            }

            $this->file_name=$file_name;
            $this->contents=$tmp_array;
            return true;
      }


dirname(__FILE__)で絶対パスを取得して設定することで、以後ファイルには常にフルパスでアクセスすることができます。
unsetの有無によって保存先が変わるようなことももうありません。

ちなみにWindowsのパス区切りは\であり、Linux環境との差異を吸収するDIRECTORY_SEPARATOR定数なんかも用意されていますが、PHPではそこらへんは自動的に変換してくれるのであまり気にしなくてもよかったりします。

このクラスを使用することにより、今後はファイルを通常の変数と同じように扱うことが出来るようになります。
実用とするには、タブや改行のエスケープを追加したりディレクトリトラバーサル対策を考えたりといった改良が必要となりますが、個人ユースならこのくらいでいいでしょう。

PR


2008/08/14 11:21 | Comments(0) | TrackBack(0) | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP1-15:データベースを使う | HOME | Java1-5:JavaServletでカスタムタグ>>
忍者ブログ[PR]