私はたぶんあなたが座ってコードを少しばらばらにして、何が起こっているかを見てみる必要があると思います。
まず、条件がmanualから!feof($this->fp)
ながらです:あなたがここに気づくでしょう
feof — Tests for end-of-file on a file pointer
一つはfeof()
がtrue
またはfalse
を返すだけのテストであるということです。それはではありません。はループオーバー中にポインタの位置を進めます。したがって、この関数を使用している間は、whileループのどこかにポインタを進める何かが必要です。そうでなければ、無限ループになります。
第2の条件は次のとおりです。左から右へ
trim($lusername = array_shift(explode(":",$line = rtrim(fgets($this->fp)))))
まず関数はstring
返しtrim()、です。便利なダンディーcomparison tableからif ((String) $var)
を実行すると、文字列が空(""
)または数字がゼロの文字列("0"
)の場合にのみfalse
と評価されます。それ以外の場合はtrue
が返されます。個人的には、if ((String) $var)
を使って本当に嫌いです(最初は比較テーブルをよく知っていない限り初心者には少し不明です)。99%の人が実際に文字列の長さをチェックしているので、文字列"0"
の場合はtrue
を返します。したがって、を"0"
に返す必要がないと仮定すると、これをstrlen($var) > 0
に変更し、ループ内の変数を操作することができます。それはここで事を大幅に簡素化するはずです。
は、だから今、私たちは持っている:
while (!feof($this->fp) && strlen($var) > 0) { /*...*/ }
これがループ上のいずれかの私たちは、ファイルの末尾にあるか$var
が空行になるまで。それ以外のものはすべてwhile
ループの本体にロードすることができるため、分解するのがはるかに簡単です。
だから、これは我々が今持っているものです。
$line = rtrim(fgets($this->fp));
$lusername = array_shift(explode(":",$line)));
おっと!その「厄介な」エラーがあります:
Strict Standards: Only variables should be passed by reference in /path/to/file.php on line x.
だから我々は、エラーを生成する部分がexplode()
ではありませんが、array_shift()
、ここから見ることができます。参照:Strict Standards: Only variables should be passed by reference
これは、array_shift()
が配列を変更するため、参照する必要があることを意味します。あなたは実際の変数を渡すのではなく関数の結果を渡すので、PHPはそれを変更することができません。 function($var) = 3;
のようなことに似ています。もちろん、あなたはそれをすることはできません。代わりに、値を一時変数に保存する必要があります。だから我々は持っている:
$line = rtrim(fgets($this->fp));
$split = explode(":",$line);
$lusername = array_shift($split);
ウー!これ以上の警告メッセージはありません。
だから、一緒にこれを入れて、我々が今持っている:
while (!feof($this->fp) && strlen($lusername) > 0) {
$line = rtrim(fgets($this->fp));
$split = explode(":",$line);
$lusername = array_shift($split);
if($lusername == $username) {
return 1;
}
}
また、先に述べたように、fgets()
は変化させるwhile
文で!feof($this->fp)
一部を可能にするポインタを、進みます。
あなたは1つの行にあまりにも多く詰め込もうとしています。その結果、読みにくくなるだけでなく、エラーが発生しやすくなります。物事を壊す。テンポラリ変数を設定し、whileループで代わりに使用します。また、あなたはどこでも '$ line'を使っていません(これはこのメソッドのコード全体ではない)。 – Mike
ありがとう@Mike。どのように最高のコードを壊す上の任意の提案? 私は試しました: $ temps = explode( ":"、rtrim(fgets($ this-> fp))); while(!feof($ this-> fp)&& trim($ lusername = array_shift($ temps))){} これは参照エラーを解決しますが、機能を破壊します。 – Kaspar