Pourquoi les signatures de fonction PHP sont-elles si incohérentes? [fermé]

17

Je parcourais certaines fonctions PHP et je n'ai pas pu m'empêcher de remarquer ce qui suit:

<?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)
?>

Remarquez la fonction array_key_exists()et property_exists(). Dans le premier, le nom de la propriété (clé d'un tableau) est le premier paramètre tandis que dans le second, c'est le deuxième paramètre. Par intuition, on pourrait s'attendre à ce qu'ils aient une signature similaire. Cela peut prêter à confusion et le temps de développement peut être perdu en faisant des corrections de ce type.

PHP, ou tout autre langage d'ailleurs, ne devrait-il pas envisager de rendre cohérentes les signatures des fonctions associées?

Shamim Hafiz
la source
2
+1 bravo, c'est l'une des premières choses que j'ai remarquées sur php et que j'ai toujours trouvé ennuyeuses
Kevin
Meh. Utilisez un IDE.
Ben Dubuisson

Réponses:

10

Ce que vous proposez consiste essentiellement à modifier les signatures pour de nombreuses fonctions existantes. Réfléchissez un instant à l'effet que cela aurait sur le code existant. Supposons maintenant que le groupe PHP ait publié la version N de PHP qui change les signatures de 30% des fonctions. Imaginez maintenant que vous devez écrire du code qui s'exécute à la fois sur PHP vN et PHP v. {N-1} - à quel point cela serait-il amusant?

Imaginez maintenant que vous êtes un hébergeur ou un gestionnaire de centre de données corporatif - quelle incitation auriez-vous à prendre en charge PHP vN, à condition qu'une fois que vous basculez, tout le code soit cassé et les utilisateurs viennent à votre bureau avec des fourches et des torches?

StasM
la source
4
+1 C'est difficile une fois que vous avez commencé quelque chose dans le mauvais sens, mais que vous avez une si grande base d'utilisateurs qui l'utilisent dans son état actuel.
Andy Fleming
4
C'est un bon point. J'étais en fait conscient de cela, mais mon point principal est qu'ils auraient dû le savoir en premier lieu.
Shamim Hafiz
7
@Shamim True, ce qui explique pourquoi PHP a une mauvaise réputation en premier lieu;)
Andy Fleming
1
PHP, comme tant de choses, a commencé comme un petit outil pour résoudre un petit problème, si on l'avait conçu "correctement" à l'époque, il pourrait être plus agréable que, mais ne l'aurait peut-être pas atteint, donc personne ne l'aurait utilisé ... et un autre petit outil aurait "gagné", un outil avec différentes incohérences ...
johannes
3
C'est pourquoi il existe une chose telle que la dépréciation. Vous créez de nouveaux noms standardisés et vous déconseillez l'ancien "saladier" des noms de fonctions, mais vous les laissez pour quelques versions. À un moment bien connu, vous sortez une nouvelle version majeure qui les supprime. Voilà comment cela se fait. C'est de la pure lâcheté de la part des développeurs PHP qu'ils ne l'aient pas fait. Ils franchissent la faible barrière à l'entrée qui donne à PHP un avantage sur les autres langages Web, et ils réussissent à cause de cela, donc ils n'ont PAS à continuer d'améliorer le langage de base.
Dan Ray
10

Parce que PHP est le langage sans spécification.

Et littéralement, tout le monde pouvait ajouter quelques fonctions, et il n'était pas question de cohérence au début. Donc, le désordre.

ts01
la source
tout le monde ne peut pas ajouter de fonctions
StasM
@StasM: Qui peut, le groupe DEV? Un lien où je peux trouver comment ce groupe fonctionne?
Shamim Hafiz
@StasM: ok, j'ai exagéré un peu. le vrai problème est le manque de conventions depuis le début ou une personne responsable de la cohésion du code. C'est trop tard. Je doute que cela puisse être changé sans bifurquer littéralement PHP comme un autre langage.
ts01
Les principes de fonctionnement du groupe @Shamim Dev sont deux: le consensus et la confiance. Ce qui est cool, mais je crains que ce ne soit pas suffisant pour un bon développement du langage
ts01
@Shamim: commencez avec php.net et wiki.php.net.
StasM
4

La plupart des bonnes langues sont et s'efforcent d'être cohérentes.

C'est juste la réalité de l'état de PHP. Comme l'a mentionné StasM, ce serait un cauchemar d'essayer de changer des choses comme ça après coup. Cela affecterait trop de code existant. Souvent, PHP déprécie simplement les fonctions et crée de meilleures fonctions plus récentes et plus cohérentes, mais cela peut prendre beaucoup de temps.

Je pense que les programmeurs PHP qui réussissent se souviennent de la syntaxe particulière ou utilisent un logiciel qui leur indique automatiquement la syntaxe.

Andy Fleming
la source
déprécier la fonction est une chose, la plus simple. Changer l'ordre des arguments est de plus en plus difficile
ts01
@ ts01 résout le problème essentiel. Avec uniquement des paramètres de position, il n'y a aucun moyen de savoir que votre existant foo(a,b)devrait maintenant l'être foo(b,a)parce que quelqu'un a changé la signature de foo.
Frank Shearar
@ ts01, @Frank: Il faudrait aussi changer le nom de la fonction ... ce n'est pas une très bonne idée pour des choses comme "property_exists" où il n'y a pas d'autre nom décent. Personnellement, j'aimerais que les tableaux deviennent des objets réels, vous pourriez donc dire $array->key_exists('whatever')mais, meh :-)
Dean Harding
En fait, ce que tout développeur PHP peut faire, c'est créer ses propres nouvelles fonctions pour les envelopper. Notez également que isset () a une syntaxe universelle pour les deux exemples mentionnés, mais ils ne sont tout simplement pas obsolètes dans le cadre des spécifications compilées.
user1122069
3

La principale source d'incohérence est que beaucoup (la plupart?) Du php dans les fonctions intégrées sont vraiment des wrappers autour d'une bibliothèque C. La pensée initiale était "J'encapsule la fonction C xxxx donc je devrais garder l'ordre des paramètres le même". Quand il s'agissait d'écrire une fonction "php pur", cette réflexion a été étendue à "xxxx prend le fichier et les options, la nouvelle fonction prend un nom de fichier et des options, il est donc logique que yyyy prenne les mêmes paramètres dans le même ordre.

Le gros défaut ici est que les bibliothèques C sous-jacentes étaient très incohérentes au départ.

James Anderson
la source
Ils ont également conservé les noms de fonctions C qu'ils enveloppaient dans certains cas (les fonctions str en particulier) tout en s'écartant énormément des conventions de dénomination de C (telles qu'elles sont) pour d'autres noms de fonctions.
Dan Ray
2

La raison (a?) Était de rester compatible avec les versions précédentes de PHP. Au lieu de changer les noms de fonctions qui briseraient de nombreuses applications, les fonctions restent. Cependant, par intuition, oui, la dénomination de fonction cohérente doit être prise en compte pour les nouveaux langages.

Je dois être en désaccord avec vous sur le fait que le temps de développement est perdu. L'apprentissage de PHP peut prendre plus de temps pour comprendre le nommage de certaines fonctions, mais une fois maîtrisé (ou du moins conscient), cela devient un problème.

Compatibilité> Cohérence (au moins pour PHP)

Jesse
la source
1
Dans d'autres langues, je peux écrire sans référence constante aux documents. PHP Je dois toujours m'inquiéter ... cette fonction est-elle orthographiée "str_" ou simplement "str"? Est-ce "tableau _" - quelque chose ou ne mentionne-t-on pas les tableaux? Que fait "length ()" quand on lui donne une chaîne? Oh enfer, non, c'est "strlen ()" je voulais vraiment ... Est-ce "aiguille, meule de foin" ou "meule de foin, aiguille"? Aucune autre langue ne me fait traverser tout cela.
Dan Ray
Comme vous, j'ai été constamment gêné par ce @DanRay. J'ai commencé à utiliser NetBeans PHP IDE maintenant, ce qui me donne les informations exactes dont j'ai besoin directement dans l'éditeur.
deed02392