2016-04-08 23 views
0

"Kullanarak kodun yalnızca geçirilmesi gerekir" hatası kullanıyorum çünkü kullanıyorum kodda, explode() sonucunu vermeyen bir satır var çünkü bir değişkene. Sıkı PHP standartları kullanırken gerektiği gibi.Döngü: yalnızca Değişkenler referans hatasıyla iletilebilir

Ancak bir while döngüsünde explode() işlevi kullanıldığından uygun bir çözüm düşünemiyorum.

Kodum

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; 
} 

bunu çözmek için konusunda herhangi bir öneriniz benziyor?

+2

Orada tek bir satırda çok fazla yol almaya çalışıyorsunuz ve sonuç olarak, sadece okumak çok zor değil, gördüğünüz gibi hataya eğilimlidir. Bir şeyleri kır. Geçici değişkenleri ayarlayın ve sonra bunları while döngüsünde kullanın. Ayrıca, herhangi bir yerde "$ line" bile kullanmıyorsunuz (bu, bu yöntemin tüm kodu olmadığı sürece), bu da ortadan kaldırılabilir. – Mike

+0

Teşekkürler @Mike. Kodu nasıl en iyi şekilde bozacağınız konusunda herhangi bir öneriniz var mı? Denedim: $ temps = patlayabilir (":", rtrim (fgets ($ this-> fp))); (! Feof ($ this-> fp) ve& trim ($ lusername = dizi_shift ($ temps))) {} Bu, başvuru hatasını çözer, ancak işlevi bozar. – Kaspar

cevap

1

Belki de arkana yaslanıp kodunuzu biraz ayırmanız ve neler olup bittiğine bakmanız gerektiğini düşünüyorum.

Birincisi, koşul ise manual itibaren !feof($this->fp)

: Buraya göreceksiniz

feof — Tests for end-of-file on a file pointer

Bir şey feof()true veya false döndüren sadece bir test olmasıdır. Döngü konumdayken işaretçi pozisyonunu ilerletir, bu nedenle bu işlevi kullanırken, while döngüsünüzdeki başka bir yerde işaretçiyi ilerleten bir şey olmalı ya da sonsuz bir döngüye sahip olacaksınız.

İkinci durumdur: soldan sağa

trim($lusername = array_shift(explode(":",$line = rtrim(fgets($this->fp))))) 

İlk işlev bir string döndürür trim() vardır. Kullanışlı dandy comparison table'dan, if ((String) $var) yaptıklarında false değerini ve yalnızca dize boşsa ("") veya dize olarak sıfır sayısını ("0") değerlendirdiğimizi görürüz, aksi takdirde true değerini döndürür. Şahsen ben gerçekten if ((String) $var) kullanarak nefret etme eğilimindedir (birincisi, eğer karşılaştırma tablonuzu iyi bilmediğiniz sürece yeni başlayanlar için biraz belirsizdir çünkü ikincisi, insanların% 99'unun dize uzunluğunu kontrol ettiklerini, bu durumda bunu istiyorum. "0" dizesi için true döndürmek için). için false dönmek için ihtiyacınız olmadığı varsayılarak, bu değeri strlen($var) > 0 olarak değiştirebilir ve sonra değişkeni döngü içinde işleyebiliriz. Bu, buradaki şeyleri büyük ölçüde basitleştirmelidir.

Yani şimdi var:

while (!feof($this->fp) && strlen($var) > 0) { /*...*/ } 

Bu irade döngü üzerinde ya biz dosyanın sonuna ya $var boş çizgidir kadar. Diğer her şey while döngüsünün gövdesine boşaltılabilir, bu yüzden parçalara ayırmak daha kolaydır.

Yani bu şimdi ne var:

$line = rtrim(fgets($this->fp)); 
$lusername = array_shift(explode(":",$line))); 

Uh-oh! o "pis" hata vardır:

Strict Standards: Only variables should be passed by reference in /path/to/file.php on line x.

yüzden hatayı üreten kısım explode() ancak array_shift() değil, buradan görebilirsiniz.Ayrıca bkz .: Strict Standards: Only variables should be passed by reference

Bunun anlamı, array_shift() diziyi değiştirdiğinden, başvuru kaynağı olmasını gerektirir. Gerçek bir değişkeni geçmediğinizden, bunun yerine bir fonksiyonun sonucu olarak PHP bunu değiştiremez. function($var) = 3; gibi bir şey yapmaya benzer. Elbette bunu yapamazsın. Bunun yerine değeri geçici bir değişkene kaydetmeniz gerekir. Şimdi elimizde şu var: Daha fazla uyarı mesajı yok.

Yani birlikte bu koyarak, şimdi var: Daha önce belirtildiği gibi

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

Ayrıca, fgets() çeşitlendirmek while açıklamada !feof($this->fp) bölümünü verir işaretçi, ilerleyecek.

İlgili konular