¿Por qué las firmas de funciones PHP son tan inconsistentes? [cerrado]

17

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?

Shamim Hafiz
fuente
2
+1 bravo, esta es una de las primeras cosas que noté sobre php y siempre he encontrado molesto
Kevin
Meh Utiliza un IDE.
Ben Dubuisson

Respuestas:

10

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?

StasM
fuente
44
+1 Es difícil una vez que has comenzado algo de la manera incorrecta, pero tienes una base de usuarios tan grande usándolo en su estado actual.
Andy Fleming
44
Ese es un buen punto. De hecho, era consciente de esto, pero mi punto principal es que deberían haberlo sido en primer lugar.
Shamim Hafiz
77
@Shamim True, que es parte de por qué PHP tiene una mala reputación en primer lugar;)
Andy Fleming
1
PHP, como tantas otras cosas, comenzó como una pequeña herramienta para resolver un pequeño problema, si uno lo hubiera diseñado "correctamente", entonces podría ser mejor, pero tal vez no hubiera alcanzado la tracción, por lo que nadie lo usaría ... y otra pequeña herramienta tendría "ganado", una herramienta con diferentes inconsistencias ...
Johannes
3
Es por eso que existe la despreciación. Usted crea nombres nuevos y estandarizados y desprecia la antigua "barra de ensaladas" de los nombres de las funciones, pero los deja por unos pocos lanzamientos. En algún momento bien publicitado, sale con una nueva versión de versión principal que los elimina. Así es como se hace esto. Es pura cobardía por parte de los desarrolladores de PHP que no hayan hecho esto. Están montando la barrera de entrada baja que le da a PHP una ventaja sobre otros lenguajes web, y tienen éxito debido a eso, por lo que no TIENEN que seguir mejorando el lenguaje central.
Dan Ray
10

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.

ts01
fuente
no todos pueden agregar funciones
StasM
@StasM: ¿Quién puede, el grupo DEV? ¿Algún enlace donde pueda encontrar cómo funciona ese grupo?
Shamim Hafiz
@StasM: ok, exageré un poco. El problema real es la falta de convenciones desde el comienzo o una persona responsable de la cohesión del código. Ahora es muy tarde. Dudo si eso se puede cambiar sin literalmente bifurcar PHP como otro lenguaje.
ts01
Los principios de operación del grupo @Shamim Dev son dos: consenso y confianza. Lo cual es genial, pero me temo que no es suficiente para un buen desarrollo del lenguaje
Ts01
@Shamim: comience con php.net y wiki.php.net.
StasM
4

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.

Andy Fleming
fuente
La función de degradación es una cosa, la fácil. Cambiar el orden de los argumentos es más, más difícil
ts01
@ ts01 clava el problema esencial. Con solo parámetros posicionales, no hay forma de saber que su actual foo(a,b)debería ser foo(b,a)porque alguien cambió la firma de Foo.
Frank Shearar
@ TS01, @Frank: Usted tendría que cambiar el nombre de la función, también ... no es una idea especialmente buena para cosas como "property_exists" donde no es ningún otro nombre decente. Personalmente, me gustaría ver que las matrices se conviertan en objetos reales para que puedas decir $array->key_exists('whatever'), pero, meh :-)
Dean Harding
En realidad, lo que cualquier desarrollador de PHP puede hacer es crear sus propias funciones nuevas para envolverlas. Tenga en cuenta también que isset () tiene una sintaxis universal para ambos ejemplos mencionados, pero simplemente no están en desuso como parte de la especificación compilada.
user1122069
3

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.

James Anderson
fuente
También mantuvieron los nombres de las funciones de C que estaban envolviendo en algunos casos (las funciones str en particular) mientras divergían enormemente de las convenciones de nomenclatura de C (como son) para otros nombres de funciones.
Dan Ray
2

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)

Jesse
fuente
1
En otros idiomas, puedo escribir sin referencia constante a los documentos. PHP siempre me tengo que preocupar ... ¿esta función se escribe "str_" o simplemente "str"? ¿Es esta "matriz _" - algo o no mencionamos matrices? ¿Qué hace "length ()" cuando se le da una cadena? Oh demonios, no, es "strlen ()" que realmente quería ... ¿Es "aguja, pajar" o "pajar, aguja"? Ningún otro idioma me deja pasar por todo eso.
Dan Ray
Como tú, este @DanRay me molestó constantemente. Empecé a usar NetBeans PHP IDE ahora, lo que me da la información exacta que necesito directamente en el editor.
escritura 02392