ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Let's PHPコミュのopendir関数に関して質問

  • mixiチェック
  • このエントリーをはてなブックマークに追加
どうもです。
php bugReportに在るのかもしれませんが、
当方英語がからきしダメゆえに全部読むと「日が暮れてしまう」、
ということでこちらにて質問いたしたく。
// PHP MLに投げてもいいのですが生憎今環境が無いゆえ。

opendir関数なのですが、
展開したいディレクトリ一覧の中に 「0」と言う名前のディレクトリが場合、
ディレクトリハンドラが消滅してしまうようです。。
これはバグなのでしょうか?それともコードが変なのか?


[ディレクトリ構成]
/ - 0/
  - testDIR/
  - test.php


[test.php]
<?php
if(! $dhn = @opendir("./"))
 echo "cant open directory\n";
while($d = readdir($dhn))
{
 if(preg_match("/^\.*$/", $d))
  continue;
 if($d == $_SERVER["PHP_SELF"])
  continue;
 echo $d."\n";
}
@closedir($dhn);
echo "[close]";
?>

[結果]
> php test.php
[close] <-何も出力されない
>

[実行環境]
OS:Windows2000
PHP:PHP version 5.0.2

0という名前のディレクトリを削除した場合、
> php test.php
testDIR/
test.php
>
となるので「おそらく0と言う名前のディレクトリが悪さをしている」と思うのですが
識者の方々、どうか教授願えませんでしょうか。

--
ぺそ@URL一行だけ出す諸兄はクールだ..

コメント(9)

ここまで書いてナンだが、ディレクトリハンドラが消滅してたら5行目のreaddirでエラーが帰ってくるはずだと思った。
よって原因は違うところにあるのかしら。ららら。
同じ環境を持っていないので何とも言えませんが。
取りあえず @ 付いてるのが気になります。外してみては。
予想ですが、
>while($d = readdir($dhn))

$dに0が代入され、while文が0をfalseと解釈し、ループが終了しているのでは?
追記です。
http://jp.php.net/manual/ja/function.readdir.php
にもありますように、

while (false !== ($d = readdir($dhn))) {

と書き直し、型も検証するようにすれば予期したとおりに動くのではないでしょうか。
>$dに0が代入され、while文が0をfalseと解釈し、ループが終了しているのでは?
あー〜〜・・・・・・・・・(=v=;

なるほど。全て理解しました。
そういえばphpは文字列「0」もbool型「false」と等価でしたねぇ(汗
// この辺すげーややこしいですなw;

で、cidy殿の言うとおり
while (false !== ($d = readdir($dhn))) {
としたら正常に動きました。
どもありがとうでした〜

// ちなみに補足しておくと、@opendir の @ はエラーメッセージをエスケープしてるだけっすョ
// 「ここにはエラーがなかったっす!」って言う「聞き手」からのメッセージにもなったりします
// 逆にこれがドツボに嵌まる原因だったりもしますけどね...
スクリプトの頭にいつもつけてます。
ini_set(display_errors,1);//デバッグ
ini_set(display_errors,0);//稼動環境
じゃダメ?
デフォルトでエラー吐かない環境も結構あるので。

# 「大変そうだね」って言われると
# 「関数並び替えているだけです」と答えてます。
とりあえず
TRUE・FALSE・NULL・0・1は*ちゃんと*使い分けましょう
等価・否は=== or !==を使いましょう
ということで

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Let's PHP 更新情報

Let's PHPのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。