Estaba pasando por algunas funciones de PHP y no pude evitar notar lo siguiente:
<?php
function foo(&$var) { }
foo($a); // $a is "created" and assigned to null
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
Observe la función array_key_exists()
y property_exists()
. En el primero, el nombre de la propiedad (clave para una matriz) es el primer parámetro, mientras que en el segundo es el segundo parámetro. Por intuición, uno esperaría que tuvieran una firma similar. Esto puede generar confusión y el tiempo de desarrollo puede desperdiciarse haciendo correcciones de este tipo.
¿No debería PHP, o cualquier otro lenguaje, considerar hacer consistentes las firmas de funciones relacionadas?
Respuestas:
Lo que propone es esencialmente cambiar las firmas a muchas funciones existentes. Piense por un minuto qué efecto tendría en el código existente. Ahora suponga que el grupo PHP ha lanzado la versión N de PHP que cambia las firmas del 30% de las funciones. Ahora imagine que tiene que escribir código que se ejecute tanto en PHP vN como en PHP v. {N-1}. ¿Qué tan divertido sería eso?
Ahora imagine que es un administrador de centro de datos corporativo o de alojamiento: ¿qué incentivo tendría para admitir PHP vN, siempre que una vez que cambie, todo el código se rompería y los usuarios vendrían a su oficina con horquillas y antorchas?
fuente
Porque PHP es el lenguaje sin ninguna especificación.
Y, literalmente, todos podían agregar un par de funciones, y no había ninguna cuestión de consistencia al principio. Entonces, el desastre.
fuente
La mayoría de los buenos idiomas son y se esfuerzan por ser consistentes.
Es solo la realidad del estado de PHP. Como mencionó StasM, sería una pesadilla intentar cambiar cosas así después del hecho. Afectaría demasiado código existente. A menudo, PHP simplemente desprecia las funciones y crea nuevas funciones mejores que son más consistentes, pero que pueden llevar mucho tiempo.
Creo que los programadores PHP exitosos recuerdan la sintaxis particular o usan un software que les dice automáticamente la sintaxis.
fuente
foo(a,b)
debería serfoo(b,a)
porque alguien cambió la firma de Foo.$array->key_exists('whatever')
, pero, meh :-)La principal fuente de inconsistencia es que muchos (¿la mayoría?) De las funciones integradas de php son realmente envoltorios alrededor de alguna biblioteca de C. El pensamiento inicial fue "Estoy envolviendo la función C xxxx, por lo tanto, debería mantener el orden de parámetros igual". Cuando se trataba de escribir una función "php puro", este pensamiento se extendió a "xxxx toma archivo y opciones, la nueva función toma un nombre de archivo y opciones, por lo que tiene sentido que yyyy tome los mismos parámetros en el mismo orden.
El gran defecto aquí es que las bibliotecas C subyacentes eran muy inconsistentes para empezar.
fuente
La razón (a?) Era seguir siendo compatible con versiones anteriores de PHP. En lugar de cambiar los nombres de las funciones que romperían muchas aplicaciones, las funciones permanecen. Sin embargo, por intuición, sí, los nombres de funciones consistentes deben tenerse en cuenta para los nuevos idiomas.
Tengo que estar en desacuerdo con usted sobre el hecho de que se desperdicia el tiempo de desarrollo. Aprender PHP puede tomar más tiempo para comprender el nombre de ciertas funciones, pero una vez que se domina (o al menos se da cuenta) se convierte en un problema.
Compatibilidad> Consistencia (al menos para PHP)
fuente