<?php class HOGE{ public function __construct(){ var_dump(getcwd()); // C:\path\to\DocumentRoot\test } public function fuga(){ var_dump(getcwd()); // C:\path\to\DocumentRoot\test } public function __destruct(){ var_dump(getcwd()); // C:\xampp } } $hoge = new HOGE(); $hoge->fuga();
PHPのシャットダウン中にデストラクタが呼ばれた場合、カレントディレクトリがサーバのルートに変わってしまいます。
chdir()等でカレントディレクトリを変更していた場合にも元に戻ってしまいます。
まあデストラクタの問題というよりはシャットダウン処理の仕様で、register_shutdown_function()でも同じ現象が発生します。
<?php register_shutdown_function(function(){ var_dump(getcwd()); // C:\xampp });
ここまでであれば、相当わかりにくいけどどうにか納得できないこともない。
そういう仕様ならそれに合わせるしかあるまい。
<?php class HOGE{ public function __construct(){ var_dump(getcwd()); // C:\path\to\DocumentRoot\test } public function fuga(){ var_dump(getcwd()); // C:\path\to\DocumentRoot\test } public function __destruct(){ var_dump(getcwd()); // C:\path\to\DocumentRoot\test } } $hoge = new HOGE(); $hoge->fuga(); $hoge = 1;
なんてこった。
これはあかんで。
こちらはスクリプト中でデストラクタが呼ばれるため、カレントディレクトリが継続しています。
回避手段としては、デストラクタでディレクトリ/ファイルを扱わないというのもありますが、仕様上難しいこともあるでしょう。
実用的には、
・定数か何かでパス定義しといて常にフルパスで扱う
で問題ないでしょう。
なおディレクトリ名がC:\になっているのはXAMPPを使っているからで、Linux環境でも再現します。
getcwd()が/とかになる。
PR