variable valor referencia por parametros funciones php reference strict

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.