2011-08-16 13 views
5

He notado algunas inconsistencias en el manual de PHP; Se documenta una serie de firmas de función central para aceptar argumentos por referencia, sin embargo, aceptan argumentos por valor.Argumentos PHP de funciones centrales; el manual dice referencia, sin embargo acepta valores

He publicado una más specific question anteriormente, y @cweiske proporciona una gran respuesta (con referencia a la fuente pertinente PHP), sin embargo estas inconsistencias parecen ser más desenfrenada.

Hay una serie de funciones que se ven afectados por esta (Voy a actualizar esta lista como órdenes; también la nota, estas pruebas se realizaron en un ambiente error_reporting(-1))

Ahora a mí respecta, no porque yo estoy siendo anal sobre la documentación, sino porque temo que los desarrolladores de PHP son en la valla de los detalles de implementación de estas funciones (o algo igualmente poco fiable)

Por ejemplo, uso array_replace_recursive(), para tomar un argumento de matriz y aplicarlo contra otra matriz que contenga los valores predeterminados. Algunos de mi base de código se ha aprovechado de esta incoherencia, hacer simplemente:

$values = array_replace_recursive(array(
    'setting_1' => array(
     'sub-setting_1' => '', 
     'sub-setting_2' => '', 
     'sub-setting_3' => '', 
    ), 
    'setting_2' => array(
     'sub-setting_1' => 0, 
     'sub-setting_2' => 0, 
    ), 
    'setting_3' => true, 
), $values); 

lo tanto la producción de una serie con formato correcto (de moverse gratuita isset() llamadas)

¿Debo preocuparme con esto? Estoy pensando en enviar una solicitud de error relacionada con la documentación, pero primero tengo curiosidad si alguien en SO (mirando en su dirección @cweiske) tiene información sobre por qué esto se ha hecho.

Respuesta

2

Quizás no estoy entendiendo su dilema, pero esas funciones no modifican directamente los datos en sus parámetros, por lo tanto, si aceptan por referencia o valor es un punto discutible, ¿no? De cualquier manera, necesitará asignar el valor de retorno si desea que la llamada a la función realmente haga cualquier cosa para usted.

En términos de conocimiento de por qué es posible que esté viendo la discrepancia. PHP 5 ha tenido muchos cambios en la forma en que funcionan las referencias. De hecho, creo que es PHP 5.3+ que ya no permite ciertos usos de & para asignar por referencia. Lo que puede estar viendo es la transición de algunas de las funciones básicas de PHP para cumplir con las nuevas reglas sobre asignación de referencia. Si la memoria me sirve, la rama de PHP 5.3 en realidad estaba destinada a ser PHP 6, pero se fusionó decididamente en el tronco como una rama en lugar de esperar a que se terminen varias funciones complejas. Esto explicaría por qué nunca antes has visto una confusión como esta en PHP.

+0

Gracias @Brian - Mi dilema es que el punto no es discutible por el hecho de que los desarrolladores de PHP pueden haber documentado esto explícitamente porque hay un cambio en el horizonte. Si la función * no * modifica los argumentos, ¿por qué los define por referencia? Si la función * does * modifica los argumentos, ¿por qué aceptar los valores pasados? Si se trata de una supervisión de la documentación, y con 5.4, junto con todos los cambios/ramificaciones de la versión, (* como mencionó, 5.3, 6.0, etc. *), entonces es completamente comprensible. Sin embargo, la implementación permite pasar valores. Esto no parece correcto, y solo quiero saber por qué. – Dan

+0

Ah, veo a dónde se dirige con que jaja su preocupación, entonces, es si pretenden modificar la forma en que funcionan estas funciones permitiéndoles tomar sus parámetros como referencias y trabajar directamente en ellos en lugar de exigir que el resultado de la función sea devuelto? Pude ver cómo eso podría ser un problema: P Lamentablemente, tampoco soy alguien que habitualmente indaga en la fuente de PHP, así que dejaré el campo de la pregunta a uno de los nerds más nerds aquí en la pila;) – Brian

Cuestiones relacionadas