$el = array_shift($instance->find(..))
El código anterior informa de alguna manera la advertencia de estándares estrictos, pero esto no:
function get_arr(){
return array(1, 2);
}
$el = array_shift(get_arr());
Entonces, ¿cuándo informará la advertencia de todos modos?
get_arr()
función) no producir el aviso estricta estándares (probado PHP 5.2 y PHP 5.5).Respuestas:
Considere 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á la siguiente salida:
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
test::get_arr()
método no es una variable y en modo estricto esto generará una advertencia. Este comportamiento es extremadamente no intuitivo ya que elget_arr()
método 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 puede cambiar la firma de
array_shift
, también puede usar una variable intermedia:fuente
current
supone que el puntero de la matriz está en el primer elemento. Puede ser una suposición válida en la mayoría de los casos, pero hay que tener cuidado.array_shift()
que espera una referencia para modificar :-)$intermediate
valor utilizando un par adicional de paréntesis.$el = array_shift( ( get_arr() ) );
. Ver stackoverflow.com/questions/9848295/…$instance->find()
devuelve una referencia a una variable.Obtiene el informe cuando intenta utilizar esta referencia como argumento para una función, sin almacenarlo primero en una variable.
Esto ayuda a prevenir pérdidas de memoria y probablemente se convertirá en un error en las próximas versiones de PHP.
Su segundo bloque de código arrojaría un error si escribiera como (tenga
&
en cuenta 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 agradable) sería:
Básicamente, primero haces una asignación a una variable temporal y envías la variable como argumento.
fuente
array_shift($tmp = $instance->find(..))
asigna el valor de$instance->find(..)
a$tmp
y luego pasa el valor de la asignación aarray_shift()
- que no es lo mismo que pasa a$tmp
sí mismo, así que no es mejor que la situación original sin la asignación es.La causa del error es el uso de la función de estructuras de datos de programación interna de PHP, array_shift () [php.net/end].
La función toma una matriz como parámetro. Aunque se indica un ampersand en el prototipo de
array_shift()
en el manual ", no hay ninguna documentación de advertencia a continuación en la definición extendida de esa función, ni hay ninguna explicación aparente de que el parámetro se pasa de hecho por referencia.Quizás esto sea / entendido /. Sin embargo, no entendí, por lo 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);
fuente
Este código:
$monthly_index = array_shift(unpack('H*', date('m/Y')));
Necesita cambiarse a:
$date_time = date('m/Y'); $unpack = unpack('H*', $date_time); array_shift($unpack);
fuente
El segundo fragmento tampoco funciona y 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 no puede hacer referencia a algo que no sea una variable. Vea las explicaciones de Rasmus aquí: Estándares estrictos: solo las variables deben pasarse por referenciafuente
Bueno, en casos obvios como ese, siempre puedes decirle a PHP que suprima mensajes usando "@" delante 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 eliminar todos los errores de esta manera, pero en ciertos casos (como este) resulta útil y aceptable.
Como resultado, estoy seguro de que su amigo 'administrador del sistema' estará satisfecho con un sistema menos contaminado
error.log
.fuente