2011-09-07 14 views
5

Debido a inconsistencias en el manual de PHP (como he publicado antes de) Solo estoy preguntando sobre alguna aclaración.Aclaración del manual PHP; valores predeterminados pasados ​​por referencia

El Argumentos de función página (http://ca2.php.net/manual/en/functions.arguments.php) tiene la siguiente nota:

Note: As of PHP 5, default values may be passed by reference.

Ahora, supongo que esto simplemente significa que la siguiente sintaxis es aceptable:

function foo(&$bar = null){ 
    // ... 
} 

Sin embargo, nuevamente debido a otras inconsistencias, me preguntaba si tal vez esto se refiere a otra cosa.

+0

Hmm, aparentemente puede establecer un valor predeterminado para una variable pasada por referencia en PHP. No puedo pensar en un caso en el que eso no sea una señal de que estás haciendo algo mal. –

+1

Gracias @Tim - Lo he estado usando en una función doble para resolver/validar rutas de solicitud. Al resolver, se pasa un argumento adicional por referencia y se rellena con parámetros resueltos. Al validar, no es necesario ningún argumento, ya que solo necesita el valor de retorno booleano. Esto no es diferente a 'preg_match'. – Dan

+0

Ah, eso tiene sentido. –

Respuesta

4

Esto significa que en PHP 4, utilizando un valor por defecto para los argumentos pasado por referencia daría lugar a un error de análisis:

Parse error: syntax error, unexpected '=', expecting ')' in ... 

Demo

En PHP5, cuando se pasa ningún argumento, la función tendrá una variable local normal llamada $bar inicializada a null.

Probablemente tiene que ajustarse para:

Note: As of PHP 5, function declarations may define a default value for argument passed by reference.

+0

Me di cuenta de esto; la frase * es * levemente confusa - de alguna manera lo lleva a creer que hay más de lo que parece. Estoy de acuerdo con la nueva redacción; mencioné que yo mismo: http://chat.stackoverflow.com/transcript/message/15381785#15381785 – Dan

+0

La redacción hace que parezca que de alguna manera puedes hacer 'function foo ($ bar = & $ something)' que es un poco absurdo; -) –

4

que significa que cuando se cambia la barra

$bar = "newvalue"; 

en función de edad (el original) se verán afectados también

<?php 
function foo(&$bar = null){ 
    $bar = 'newval'; 
} 

$bar = 'oldval, will be changed'; 
foo($bar); 
echo $bar; //RETURNS newval 

por lo que si cambia alguna variable pasada por referencia, que doesn' t importa dónde ha cambiado, fuente de uno se cambia, también

http://sandbox.phpcode.eu/g/51723

+0

Gracias @genesis - Entiendo que es la funcionalidad prevista de las referencias en general. La pregunta más relacionada con la mención anodina de los argumentos de referencia y los valores predeterminados.Como dije, supongo simplemente que significa que los argumentos aceptados por referencia también pueden tener valores predeterminados; Me preguntaba si se refería tal vez a alguna otra característica (* no mencionada tal vez *) o un efecto secundario. – Dan

+0

@Bracketworks: No lo creo – genesis

+0

Ni yo tampoco, pero el manual me ha sorprendido antes. El manual entra en detalles razonables solo en esa página (* y otras secciones; "Referencias explicadas", etc. *) sobre cómo pasar referencias por argumento. Parece que esa advertencia es innecesaria o se refiere a algo más que no estoy viendo. ¿Sabes a lo que me refiero? – Dan

0

Creo que la única razón de que esto existe es por permitir saltarse los parámetros de seguimiento en una llamada a la función

function test(&$bar = 10) 
{ 
    echo " '$bar' "; 
    $bar = $bar*2; 
    echo " '$bar' "; 
} 

test($aaa);  // prints '' '0'  (NULL as string, NULL*2) 
echo $aaa;  // prints 0   ($aaa is set to NULL*2) 
echo "<br>"; 

$bbb = 6; 
test($bbb);  // prints '6' '12' (6, 6*2) 
echo $bbb;  // prints 12   ($bbb is set to 6*2) 
echo "<br>"; 

test();  // prints '10' '20' 
// (uses the default value since the argument was skipped, so: 10, 10*2) 

Así que en mi humilde opinión la razón de que esto existe es simplemente la posibilidad de tener $ bar establecido en algún valor predeterminado dentro del alcance de la función cuando omite el parámetro principal en la llamada a la función

Si es así, estoy de acuerdo con usted, el manual debería ser más preciso sobre esto

Cuestiones relacionadas