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

17

Stavo passando alcune funzioni PHP e non ho potuto 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ò portare a confusione e il tempo di sviluppo può essere sprecato apportando correzioni di questo tipo.

Non dovresti usare PHP o qualsiasi altra lingua per rendere coerenti le firme delle funzioni correlate?

    
posta Shamim Hafiz 30.12.2010 - 10:29
fonte

5 risposte

10

Ciò che proponi essenzialmente cambia le firme in molte funzioni esistenti. Pensa per un minuto quale effetto avrebbe sul codice esistente. Ora supponiamo 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 gira sia su PHP v.N che su PHP v. {N-1} - quanto sarebbe divertente?

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

    
risposta data 30.12.2010 - 10:50
fonte
10

Perché PHP è la lingua senza alcuna specifica.

E letteralmente tutti potevano aggiungere un paio di funzioni, e non c'era alcuna questione di coerenza all'inizio. COSÌ, il pasticcio.

    
risposta data 30.12.2010 - 10:43
fonte
4

La maggior parte delle buone lingue sono e si sforzano di essere coerenti.

È solo la realtà dello stato di PHP. Come menzionato StasM, sarebbe un incubo provare a cambiare le cose in quel modo dopo il fatto. Influenzerebbe troppo il codice esistente. Spesso PHP semplicemente depreca le funzioni e crea nuove funzioni migliori che sono più coerenti, ma ciò può richiedere molto tempo.

Penso che i programmatori PHP di successo ricordino la particolare sintassi o usino un software che indichi automaticamente la sintassi.

    
risposta data 30.12.2010 - 10:55
fonte
3

La principale fonte di incoerenza è che molte (la maggior parte?) del PHP nelle funzioni create sono in realtà dei wrapper attorno ad una libreria 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 "php puro", questo modo di pensare è stato esteso a "xxxx accetta file e opzioni la nuova funzione accetta un nome file e opzioni, quindi ha senso avere yyyy gli stessi parametri nello stesso ordine.

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

    
risposta data 01.12.2011 - 07:45
fonte
2

La (a?) ragione era di rimanere compatibile con le versioni precedenti di PHP. Invece di cambiare i nomi delle funzioni che potrebbero rompere molte applicazioni, le funzioni rimangono. Tuttavia, per intuizione, si dovrebbe prendere in considerazione la costante denominazione 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 alcune funzioni, ma una volta acquisita (o almeno consciamente) diventa un problema.

Compatibilità > Coerenza (almeno in PHP)

    
risposta data 30.12.2010 - 11:00
fonte

Leggi altre domande sui tag