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.
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
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