忍者ブログ
[PR]
×

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



2017/11/24 09:02 |
PHP5.6.0 デストラクタだけカレントディレクトリが違う
<?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


2014/06/06 20:10 | Comments(0) | PHP

コメント

コメントを投稿する






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



<<買ったものリスト 2014/06/08 | HOME | PHP5.6.0 「第14回オフラインリアルタイムどう書くの参考問題」をPHPで解く>>
忍者ブログ[PR]