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