Perché le firme delle funzioni PHP sono così incoerenti? [chiuso]


17

Stavo attraversando alcune funzioni di PHP e non potevo fare a meno di notare quanto segue:

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

Notare la funzione array_key_exists()e property_exists(). Nel primo, il nome della proprietà (chiave per un array) è il primo parametro mentre nel secondo è il secondo parametro. Per intuizione, ci si aspetterebbe che avessero una firma simile. Ciò può causare confusione e il tempo di sviluppo può essere sprecato apportando correzioni di questo tipo.

PHP, o qualsiasi altra lingua per quella materia, non dovrebbe considerare di rendere coerenti le firme delle funzioni correlate?


2
+1 bravo, questa è una delle prime cose che ho notato di php e che ho sempre trovato fastidioso
Kevin,

Meh. Usa un IDE.
Ben Dubuisson,

Risposte:


10

Quello che proponi è essenzialmente cambiare le firme in molte funzioni esistenti. Pensa per un minuto quale effetto avrebbe sul codice esistente. Supponiamo ora che il gruppo PHP abbia rilasciato la versione N di PHP che modifica le firme del 30% delle funzioni. Ora immagina di dover scrivere codice che funziona sia su PHP vN che su PHP v. {N-1} - quanto sarebbe divertente?

Ora immagina di essere un hoster o un gestore di data center corporativo: quale incentivo dovresti supportare PHP vN, a condizione che una volta che cambi, tutto il codice si spezzerebbe e gli utenti verranno nel tuo ufficio con forconi e torce?


4
+1 È difficile una volta che hai iniziato qualcosa nel modo sbagliato, ma hai una base di utenti così ampia che la utilizza nel suo stato attuale.
Andy Fleming il

4
È un buon punto. In realtà ne ero a conoscenza, ma il mio punto principale è che avrebbero dovuto esserne consapevoli in primo luogo.
Shamim Hafiz,

7
@Shamim True, che è parte del motivo per cui PHP ha una cattiva reputazione in primo luogo;)
Andy Fleming

1
PHP, come tante altre cose, è iniziato come un piccolo strumento per risolvere un piccolo problema, se uno l'avesse progettato "correttamente" allora potrebbe essere più bello di, ma forse non avrebbe raggiunto la trazione, quindi nessuno lo userebbe ... e un altro piccolo strumento avrebbe "vinto", uno strumento con incoerenze diverse ...
johannes

3
Ecco perché esiste una cosa come la deprecazione. È possibile creare nomi nuovi e standardizzati e deprecare la vecchia "barra delle insegne" dei nomi delle funzioni, ma lasciarli in giro per alcune versioni. Ad un certo punto ben pubblicizzato esci con una nuova versione della versione principale che li elimina. Questo è come è fatto. È pura codardia da parte degli sviluppatori PHP che non lo hanno fatto. Stanno cavalcando la bassa barriera all'ingresso che offre a PHP un vantaggio rispetto ad altre lingue web e hanno successo a causa di ciò, quindi NON DEVONO continuare a migliorare il linguaggio principale.
Dan Ray,

10

Perché PHP è la lingua senza alcuna specifica.

E letteralmente tutti potevano aggiungere un paio di funzioni, e all'inizio non c'erano dubbi sulla coerenza. Quindi, il casino.


non tutti possono aggiungere funzioni
StasM il

@StasM: chi può, il gruppo DEV? Qualche link dove posso trovare come funziona quel gruppo?
Shamim Hafiz,

@StasM: ok, ho esagerato un po '. il vero problema è la mancanza di convenzioni dall'inizio o una persona responsabile della coesione del codice. Adesso è troppo tardi Dubito che ciò possa essere cambiato senza letteralmente biforcare PHP come un'altra lingua.
ts01,

I principi di funzionamento del gruppo @Shamim Dev sono due: consenso e confidenza. Il che è bello, ma temo che non sia sufficiente per un buon sviluppo del linguaggio
ts01

@Shamim: inizia con php.net e wiki.php.net.
StasM il

4

Le lingue più buone sono e si sforzano di essere coerenti.

È solo la realtà dello stato di PHP. Come ha detto StasM, sarebbe un incubo provare a cambiare cose del genere dopo il fatto. Interesserebbe troppo il codice esistente. Spesso PHP depreca semplicemente le funzioni e crea nuove funzioni migliori che sono più coerenti, ma che possono richiedere molto tempo.

Penso che i programmatori PHP di successo ricordino la particolare sintassi o utilizzino un software che dice loro automaticamente la sintassi.


la funzione deprecante è una cosa, quella facile. Cambiare l'ordine degli argomenti è più, più difficile
ts01

@ ts01 risolve il problema essenziale. Con solo parametri posizionali non c'è modo di sapere che il tuo attuale foo(a,b)dovrebbe essere foo(b,a)perché qualcuno ha cambiato la firma di foo.
Frank Shearar,

@ ts01, @Frank: dovresti cambiare anche il nome della funzione ... non è una buona idea per cose come "property_exists" dove non esiste un altro nome decente. Personalmente, mi piacerebbe vedere le matrici diventare oggetti reali, quindi si potrebbe dire $array->key_exists('whatever')ma, meh :-)
Dean Harding,

In realtà, ciò che qualsiasi sviluppatore di PHP può fare è creare le proprie nuove funzioni per racchiuderle. Si noti inoltre che isset () ha una sintassi universale per entrambi gli esempi citati, ma non sono deprecati come parte delle specifiche compilate.
user1122069

3

La principale fonte di incoerenza è che molte (la maggior parte?) Del php nelle funzioni integrate sono in realtà avvolgenti attorno ad alcune librerie C. Il pensiero iniziale era "Sto avvolgendo la funzione C xxxx quindi dovrei mantenere lo stesso ordine dei parametri". Quando si trattava di scrivere una funzione "pure php" questo pensiero è stato esteso a "xxxx accetta il file e le opzioni, la nuova funzione prende un nome e le opzioni del file, quindi ha senso che yyyy prenda gli stessi parametri nello stesso ordine.

Il grande difetto qui è che le librerie C sottostanti erano molto incoerenti all'inizio.


Hanno anche mantenuto i nomi delle funzioni C che stavano racchiudendo in alcuni casi (le funzioni str in particolare) mentre divergevano selvaggiamente dalle convenzioni di denominazione di C (come sono) per altri nomi di funzioni.
Dan Ray,

2

Il motivo (a?) Doveva rimanere compatibile con le versioni precedenti di PHP. Invece di cambiare i nomi delle funzioni che rompono molte applicazioni, le funzioni rimangono. Tuttavia, per intuizione, si dovrebbe prendere in considerazione una denominazione coerente delle funzioni per le nuove lingue.

Non sono d'accordo con te sul fatto che il tempo di sviluppo è sprecato. L'apprendimento di PHP potrebbe richiedere più tempo per comprendere la denominazione di determinate funzioni, ma una volta padroneggiato (o almeno a conoscenza di) diventa un problema.

Compatibilità> Coerenza (almeno a PHP)


1
Altre lingue, posso scrivere senza costante riferimento ai documenti. PHP Mi devo sempre preoccupare ... questa funzione è scritta "str_" o semplicemente "str"? Questo "array _" è qualcosa o non menzioniamo gli array? Che cosa fa "length ()" quando viene data una stringa? Oh diavolo, no, è "strlen ()" Volevo davvero ... È "ago, pagliaio" o "pagliaio, ago"? Nessun'altra lingua mi mette alla prova.
Dan Ray,

Come te sono stato costantemente infastidito da questo @DanRay. Ho iniziato a utilizzare NetBeans PHP IDE ora, il che mi dà le informazioni esatte di cui ho bisogno proprio nell'editor.
deed02392,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.