php - valor - Estándares estrictos: solo las variables deben pasarse por referencia
php ref var (6)
$el = array_shift($instance->find(..))
El código anterior informa de alguna manera la advertencia estricta de estándares, pero esto no:
function get_arr(){
return array(1,2);
}
$el = array_shift(get_arr());
Entonces, ¿cuándo informará la advertencia de todos modos?
Bueno, en casos obvios como ese, siempre puedes decirle a PHP que suprima mensajes usando "@" al frente de la función.
$monthly_index = @array_shift(unpack(''H*'', date(''m/Y'')));
Puede que no sea una de las mejores prácticas de programación para suprimir todos los errores de esta manera, pero en ciertos casos (como este) es práctico y aceptable.
Como resultado, estoy seguro de que su amigo SysAdmin estará satisfecho con un "error.log" menos contaminado. ;)
Considera el siguiente código:
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());
Esto generará el siguiente resultado:
Strict Standards: Only variables should be passed by reference in test.php on line 14
array(2) {
[0]=>
int(1)
[1]=>
int(2)
}
¿La razón? El método test::get_arr()
no es una variable y en modo estricto esto generará una advertencia. Este comportamiento es extremadamente no intuitivo ya que el método get_arr()
devuelve un valor de matriz.
Para evitar este error en modo estricto, cambie la firma del método para que no use una referencia:
function test_arr($a) {
var_dump($a);
}
Como no puedes cambiar la firma de array_shift
, también puedes usar una variable intermedia:
$inter= get_arr();
$el= array_shift($inter);
El segundo fragmento tampoco funciona y es por eso. array_shift
es una función modificadora que cambia su argumento, por lo tanto, espera que su parámetro sea una referencia, y usted no puede hacer referencia a algo que no sea una variable. Vea las explicaciones de Rasmus aquí: http://bugs.php.net/bug.php?id=48937
Este código:
$monthly_index = array_shift(unpack(''H*'', date(''m/Y'')));
Editar a:
$date_time = date(''m/Y'');
$unpack = unpack(''H*'', $date_time);
array_shift($unpack);
La causa del error es el uso de la función interna de PHP Programming Data Structures, array_shift () [php.net/end]. La función toma una matriz como parámetro. Aunque en el prototipo de "array_shift ()" en El manual se indica un signo de &, no hay una documentación de advertencia en la definición ampliada de esa función, ni existe ninguna explicación aparente de que el parámetro se haya pasado por referencia. esto es entendido /. No entendí, sin embargo, así que fue difícil para mí detectar la causa del error.
Reproducir código:
function get_arr()
{
return array(1,2);
}
$array = get_arr();
$el = array_shift($array);
$instance->find()
devuelve referencia a la variable.
Obtendrá el informe cuando intente utilizar esta referencia como argumento para funcionar, sin almacenarla primero en la variable.
Esto ayuda a evitar fugas de memoria y probablemente se convierta en error en las siguientes versiones de PHP.
Su segundo código arrojaría un error si escribiera algo similar (tenga en cuenta la función & en la firma de la función):
function &get_arr(){
return array(1,2);
}
$el = array_shift(get_arr());
Entonces una solución rápida (y no tan buena) sería:
$el = array_shift($tmp = $instance->find(..));
Básicamente, primero haces una asignación a la variable temporal y envías la variable como un argumento.