$el = array_shift($instance->find(..))
Yukarıdaki kod bir şekilde sıkı standars uyarı raporları, ama bu olmaz:
function get_arr(){
return array(1,2);
}
$el = array_shift(get_arr());
Peki ne zaman zaten uyarı bildirir?
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)
}
Nedeni? test::get_arr() yöntemi bir değişken değil ve sıkı modu altında bu bir uyarı oluşturur. Bu davranış, get_arr() yöntemi returns bir dizi değeri olarak son derece non-sezgisel.
Sıkı modunda bu hata aşmanın yöntemi imzasını değiştirmek ya da öylesine bir başvuru kullanmak değildir:
function test_arr($a) {
var_dump($a);
}
Eğer imzanızı değiştiremezsiniz beri array_shift da bir ara değişkeni kullanabilirsiniz:
$inter= get_arr();
$el= array_shift($inter);
$instance->find() değişkene başvuru verir.
You get the report when you are trying to use this reference as an argument to function, without storing it at variable first.
Bu bellek sızıntıları önlemede yardımcı olur ve muhtemelen önümüzdeki PHP sürümlerinde hata olacaktır.
O (not ve fonksiyon imzada) gibi yazdı eğer 2 kod hata atmak:
function &get_arr(){
return array(1,2);
}
$el = array_shift(get_arr());
Yani çok hızlı (ve çok güzel) düzeltme olacaktır:
$el = array_shift($tmp = $instance->find(..));
Temelde ilk geçici bir değişkene bir atama yapmak, ve bir argüman olarak değişken gönderebilirsiniz.
İkinci pasajı ya da çalışmaz ve bu yüzden. array_shift argümanını değiştiren bir değiştirici işlevi, bu nedenle onun parametresi bir referans olmasını beklediğini, ve bir değişken olmayan bir şey başvuramaz. Burada Rasmus 'açıklamaları için bkz: http://bugs.php.net/bug.php?id=48937