Warum sind PHP-Funktionssignaturen so inkonsistent? [geschlossen]


17

Ich habe einige PHP-Funktionen durchgearbeitet und konnte nicht umhin, Folgendes zu bemerken:

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

Beachten Sie die array_key_exists()und property_exists()Funktion. Im ersten Fall ist der Eigenschaftsname (Schlüssel für ein Array) der erste Parameter, im zweiten Fall der zweite Parameter. Intuitionell würde man erwarten, dass sie eine ähnliche Signatur haben. Dies kann zu Verwirrung führen und die Entwicklungszeit kann durch Korrekturen dieses Typs verschwendet werden.

Sollte PHP oder eine andere Sprache nicht in Betracht ziehen, die Signaturen verwandter Funktionen konsistent zu machen?


2
+1 Bravo, dies ist eines der ersten Dinge, die mir an PHP aufgefallen sind und die ich immer als ärgerlich empfunden habe
Kevin

Meh. Verwenden Sie eine IDE.
Ben Dubuisson

Antworten:


10

Sie schlagen vor, im Wesentlichen die Signaturen für viele vorhandene Funktionen zu ändern. Überlegen Sie sich eine Minute, welche Auswirkungen dies auf den vorhandenen Code haben würde. Nehmen wir nun an, die PHP-Gruppe hat die PHP-Version N veröffentlicht, die die Signaturen von 30% der Funktionen ändert. Stellen Sie sich nun vor, Sie müssen Code schreiben, der sowohl auf PHP vN als auch auf PHP v. {N-1} läuft - wie viel Spaß würde das machen?

Stellen Sie sich vor, Sie sind Hoster oder Manager eines korporativen Rechenzentrums. Welchen Anreiz hätten Sie, PHP vN zu unterstützen, vorausgesetzt, dass nach dem Umstieg der gesamte Code kaputt ist und die Benutzer mit Heugabeln und Fackeln in Ihr Büro kommen?


4
+1 Es ist schwer, wenn Sie etwas falsch gestartet haben, aber eine so große Benutzerbasis hat, die es im aktuellen Zustand verwendet.
Andy Fleming

4
Das ist ein guter Punkt. Mir war das eigentlich bewusst, aber mein wichtigster Punkt ist, dass sie das überhaupt hätten wissen müssen.
Shamim Hafiz

7
@Shamim True, das ist ein Teil, warum PHP in erster Linie einen schlechten Ruf hat;)
Andy Fleming

1
PHP begann, wie so viele andere Dinge, als kleines Tool, um ein winziges Problem zu lösen. Wenn man es damals "richtig" entworfen hätte, wäre es vielleicht netter als, hätte aber vielleicht nicht die Traktion erreicht, also würde es niemand verwenden ... und ein anderes kleines tool hätte "gewonnen", ein tool mit unterschiedlichen inkonsistenzen ...
johannes

3
Deshalb gibt es so etwas wie Abwertung. Sie erstellen neue, standardisierte Namen und verwerfen die alte "Salatbar" von Funktionsnamen, belassen sie aber für einige Veröffentlichungen. Irgendwann kommt eine neue Hauptversion heraus, die diese Probleme beseitigt. So wird das gemacht. Es ist reine Feigheit der PHP-Entwickler, dass sie dies nicht getan haben. Sie überwinden die niedrige Markteintrittsbarriere, die PHP gegenüber anderen Web-Sprachen einen Vorteil verschafft, und sind daher erfolgreich, sodass sie die Kernsprache nicht weiter verbessern MÜSSEN.
Dan Ray

10

Weil PHP die Sprache ohne jegliche Spezifikation ist.

Und buchstäblich jeder konnte ein paar Funktionen hinzufügen, und von Konsistenz war am Anfang keine Rede. SO, die Sauerei.


Nicht jeder kann Funktionen hinzufügen
StasM

@StasM: Wer kann die DEV-Gruppe? Gibt es einen Link, auf dem ich finde, wie diese Gruppe funktioniert?
Shamim Hafiz

@StasM: ok, ich habe ein bisschen übertrieben. Das eigentliche Problem ist das Fehlen von Konventionen seit Beginn oder eine Person, die für den Zusammenhalt des Codes verantwortlich ist. Jetzt ist es zu spät. Ich bezweifle, dass dies geändert werden kann, ohne PHP als andere Sprache zu verbreiten.
Ts01

Die Funktionsprinzipien der @Shamim Dev-Gruppe sind zwei: Konsens und Vertrauen. Was cool ist, aber für eine gute Sprachentwicklung
leider

@Shamim: Beginne mit php.net und wiki.php.net.
StasM 30.12.10

4

Die meisten guten Sprachen sind und sind bestrebt, konsistent zu sein.

Es ist nur die Realität des Zustands von PHP. Wie StasM bereits sagte, wäre es ein Albtraum, solche Dinge nachträglich zu versuchen. Es würde sich auf zu viel vorhandenen Code auswirken. Oft missbilligt PHP einfach Funktionen und erstellt neuere, bessere Funktionen, die konsistenter sind, aber viel Zeit in Anspruch nehmen können.

Ich denke, erfolgreiche PHP-Programmierer erinnern sich entweder an die jeweilige Syntax oder verwenden eine Software, die ihnen die Syntax automatisch mitteilt.


Abwertungsfunktion ist eine Sache, die einfache. Die Reihenfolge der Argumente zu
ändern

@ ts01 nagelt das wesentliche Problem. Mit nur Positionsparametern gibt es keine Möglichkeit zu wissen, dass Ihre vorhandene foo(a,b)jetzt sein sollte, foo(b,a)weil jemand die Signatur von foo geändert hat.
Frank Shearar

@ TS01, @Frank: Sie müßten die Namen der Funktion ändern, auch ... keine besonders gute Idee für Sachen wie „property_exists“ , wo es ist keine andere anständigen Namen. Persönlich würde ich gerne sehen, dass Arrays zu tatsächlichen Objekten werden, also könnte man sagen $array->key_exists('whatever'), meh :-)
Dean Harding

Tatsächlich kann jeder PHP-Entwickler seine eigenen neuen Funktionen erstellen, um diese zu verpacken. Beachten Sie auch, dass isset () für beide genannten Beispiele eine universelle Syntax hat, diese jedoch nicht als Teil der kompilierten Spezifikation veraltet ist.
user1122069

3

Die Hauptursache für Inkonsistenzen ist, dass viele (die meisten?) Der PHP-Funktionen wirklich Wrapper um eine C-Bibliothek sind. Die anfängliche Überlegung lautete: "Ich binde die C-Funktion xxxx ein, daher sollte die Parameterreihenfolge gleich bleiben." Wenn es darum ging, eine "pure php" -Funktion zu schreiben, wurde dieses Denken auf "xxxx takes file and options" erweitert. Die neue Funktion verwendet einen Dateinamen und Optionen, so dass es sinnvoll ist, dass JJJJ dieselben Parameter in derselben Reihenfolge verwendet.

Der große Nachteil hierbei ist, dass die zugrunde liegenden C-Bibliotheken anfangs sehr inkonsistent waren.


Sie behielten auch die C-Funktionsnamen bei, die sie in einigen Fällen umbrochen hatten (insbesondere die str-Funktionen), während sie sich stark von den Namenskonventionen von C (wie sie sind) für andere Funktionsnamen unterschieden.
Dan Ray

2

Der (a?) Grund war, mit früheren PHP-Versionen kompatibel zu bleiben. Anstatt Funktionsnamen zu ändern, die viele Anwendungen beschädigen würden, bleiben die Funktionen erhalten. Intuitionell sollte jedoch eine konsistente Funktionsbenennung für neue Sprachen berücksichtigt werden.

Ich muss Ihnen widersprechen, dass Entwicklungszeit verschwendet wird. Das Erlernen von PHP kann länger dauern, um die Benennung bestimmter Funktionen zu verstehen, aber sobald es beherrscht ist (oder zumindest gewusst hat), ist es kein Problem mehr.

Kompatibilität> Konsistenz (zumindest zu PHP)


1
Andere Sprachen kann ich ohne ständigen Bezug zu den Dokumenten schreiben. PHP muss ich mir immer Sorgen machen ... wird diese Funktion "str_" oder nur "str" ​​geschrieben? Ist das "array _" - etwas oder erwähnen wir keine Arrays? Was macht "length ()", wenn ein String angegeben wird? Oh verdammt, nein, es ist "strlen ()", was ich wirklich wollte ... Ist es "Nadel, Heuhaufen" oder "Heuhaufen, Nadel"? Keine andere Sprache bringt mich durch all das.
Dan Ray

Wie Sie wurde ich ständig von diesem @DanRay belästigt. Ich habe jedoch angefangen, NetBeans PHP IDE zu verwenden, wodurch ich genau die Informationen bekomme, die ich direkt im Editor benötige.
deed02392
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.