2016-04-08 5 views
0

私は使用しているコードでexplode()の結果を入れない行があるため、 "参照で渡す必要がある変数のみ"変数に変換する。厳密なPHP標準を使用する場合は必要に応じてwhileループ:のみ参照エラーで変数を渡すことができます

しかし、explode()関数がWhileループで使用されているため、私は適切な解決策を考えることができません。

私のコードは

function user_exists($username) { 
    rewind($this->fp); 
     while(!feof($this->fp) && trim($lusername = array_shift(explode(":",$line = rtrim(fgets($this->fp)))))) { 
      if($lusername == $username) 
       return 1; 
     } 
    return 0; 
} 

これを解決する方法上の任意の提案のように見えますか?

+2

あなたは1つの行にあまりにも多く詰め込もうとしています。その結果、読みにくくなるだけでなく、エラーが発生しやすくなります。物事を壊す。テンポラリ変数を設定し、whileループで代わりに使用します。また、あなたはどこでも '$ line'を使っていません(これはこのメソッドのコード全体ではない)。 – Mike

+0

ありがとう@Mike。どのように最高のコードを壊す上の任意の提案? 私は試しました: $ temps = explode( ":"、rtrim(fgets($ this-> fp))); while(!feof($ this-> fp)&& trim($ lusername = array_shift($ temps))){} これは参照エラーを解決しますが、機能を破壊します。 – Kaspar

答えて

1

私はたぶんあなたが座ってコードを少しばらばらにして、何が起こっているかを見てみる必要があると思います。

まず、条件が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)一部を可能にするポインタを、進みます。

関連する問題