$el = array_shift($instance->find(..))
Yukarıdaki kod bir şekilde katı standartlar uyarısını bildirir, ancak bu:
function get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
Peki uyarıyı ne zaman rapor edecek?
$el = array_shift($instance->find(..))
Yukarıdaki kod bir şekilde katı standartlar uyarısını bildirir, ancak bu:
function get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
Peki uyarıyı ne zaman rapor edecek?
get_arr()
fonksiyonu) vermez sıkı standartlar haber (PHP 5.2 ve PHP 5.5 test) üretirler.
Yanıtlar:
Aşağıdaki kodu göz önünde bulundurun:
error_reporting(E_STRICT);
class test {
function test_arr(&$a) {
var_dump($a);
}
function get_arr() {
return array(1, 2);
}
}
$t = new test;
$t->test_arr($t->get_arr());
Bu, aşağıdaki çıktıyı üretecektir:
Strict Standards: Only variables should be passed by reference in `test.php` on line 14
array(2) {
[0]=>
int(1)
[1]=>
int(2)
}
Sebep? test::get_arr()
Yöntem değişken değildir ve sıkı modunda bu bir uyarı üretecektir. get_arr()
Yöntem bir dizi değeri döndürdüğünden , bu davranış son derece sezgisel değildir .
Katı modda bu hatayı aşmak için, ya yöntemin imzasını bir referans kullanmayacak şekilde değiştirin:
function test_arr($a) {
var_dump($a);
}
İmzanızı değiştiremeyeceğiniz için array_shift
bir ara değişken de kullanabilirsiniz:
$inter = get_arr();
$el = array_shift($inter);
current
, dizi göstericisinin ilk öğede olduğu varsayımını yapar. Çoğu durumda geçerli bir varsayım olabilir, ancak dikkat edilmesi gereken biri.
array_shift()
bir referansın değiştirilmesini beklemesiyle aynı sorun olurdu :-)
$intermediate
Fazladan bir çift parantez kullanarak değeri önleyebilirsiniz . $el = array_shift( ( get_arr() ) );
. Bkz stackoverflow.com/questions/9848295/...
$instance->find()
bir değişkene başvuru döndürür.
Bu referansı, önce bir değişkene kaydetmeden, bir işleve argüman olarak kullanmaya çalıştığınızda raporu alırsınız.
Bu, bellek sızıntılarını önlemeye yardımcı olur ve muhtemelen sonraki PHP sürümlerinde bir hata haline gelecektir.
İkinci kod bloğunuz şöyle yazarsa bir hata atar ( &
işlev imzasına dikkat edin ):
function &get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
Yani hızlı (ve o kadar da hoş olmayan) bir düzeltme şu şekilde olacaktır:
$el = array_shift($tmp = $instance->find(..));
Temel olarak, önce geçici bir değişkene atama yaparsınız ve değişkeni argüman olarak gönderirsiniz.
array_shift($tmp = $instance->find(..))
atar değeri $instance->find(..)
için $tmp
ve daha sonra geçen atama değeri için array_shift()
- geçirmeden aynı şey değildir $tmp
kendisi, bu nedenle daha iyi bir atama olmadan orijinal durumuna daha uzundur.
Hatanın nedeni dahili PHP programlama veri yapıları işlevinin, array_shift () [php.net/end] kullanılmasıdır.
İşlev, parametre olarak bir diziyi alır. array_shift()
Kılavuzda prototipinde bir "ve işareti" belirtilmesine rağmen , bu işlevin genişletilmiş tanımını takip eden herhangi bir uyarıcı belge veya parametrenin aslında referansla aktarıldığına dair açık bir açıklama yoktur.
Belki de bu / anlaşıldı /. Ancak anlamadığım için hatanın nedenini tespit etmem zor oldu.
Kodu yeniden üretin:
function get_arr()
{
return array(1, 2);
}
$array = get_arr();
$el = array_shift($array);
Bu kod:
$monthly_index = array_shift(unpack('H*', date('m/Y')));
Değiştirilmesi gerekiyor:
$date_time = date('m/Y');
$unpack = unpack('H*', $date_time);
array_shift($unpack);
İkinci pasaj da çalışmıyor ve bu yüzden.
array_shift
argümanını değiştiren bir değiştirici işlevdir. Bu nedenle, parametresinin bir referans olmasını bekler ve değişken olmayan bir şeye referans veremezsiniz. Rasmus'un açıklamalarına buradan bakın: Sıkı standartlar: Yalnızca değişkenler referans olarak aktarılmalıdır
Pekala, bunun gibi bariz durumlarda, PHP'ye mesajları bastırmasını her zaman işlevin önünde "@" kullanarak söyleyebilirsiniz.
$monthly_index = @array_shift(unpack('H*', date('m/Y')));
Tüm hataları bu şekilde bastırmak en iyi programlama uygulamalarından biri olmayabilir , ancak bazı durumlarda (bunun gibi) kullanışlı ve kabul edilebilir.
Sonuç olarak, eminim arkadaşınız 'sistem yöneticisi' daha az kirlilikten memnun kalacaktır error.log
.