Uno dei progetti più complicati che ho intrapreso consisteva nell'incorporare la libreria PHP nel v8 di Google per consentire a javascript di creare e accedere in altro modo direttamente agli oggetti PHP, senza una forma di bridge e senza alcuna forma di interpretazione (al di fuori di javascirpt che è). Ciò richiedeva l'accesso alle tabelle zend di un oggetto PHP e tutte le proprietà e i metodi di un oggetto PHP erano accessibili direttamente in questo modo da javascript.
Da questa esperienza ho anche avuto un assaggio della sfida di gestire i tipi di dati PHP all'interno di C (le strutture di livello inferiore) in un modo che è utile in un livello più dinamico e astratto sopra. Questo era all'interno di javascript a questo punto, non in PHP, ma era ancora il valore della vera rappresentazione interna di un oggetto PHP.
Ci sono molte sfide in queste situazioni, anche quando si tratta di confronti. Alla fine però, almeno nella mia opinione , era più importante rispettare e aderire alla natura dinamica di PHP. Era una questione di funzione, non di interpretazione logica o percezione intuitiva ecc.
La discussione sul fatto che "0" == true deve essere basata su cosa sia realmente "0". Come tipo numerico, 0 è il valore binario per falso. Tuttavia, come stringa, "0" è valido, non nullo e non vuoto. Quindi, alla fine, è una questione di pensare che "0" debba essere visto come una stringa, un tipo numerico o come terza opzione, se dovresti provare a gestirlo come entrambi in situazioni diverse. Ogni punto di vista ha valide ragioni empiriche per cui una via è più o meno utile dell'altra, ma alla fine non c'è una risposta reale o "fattuale" a questa, e sempre si discuterà di come tu, io e l'altro ragazzo valori "0".
Modifica: tieni presente che i confronti sono una delle operazioni di base di una lingua. Mentre è possibile rendere i confronti più "intelligenti", ciò richiede più logica all'interno dell'effettiva operazione di confronto stessa. Con la frequenza con cui vengono utilizzati i confronti, ciò può causare un effetto negativo sulle prestazioni, in particolare con il tipo di stringa. Quindi anche questo lato della discussione potrebbe diventare una questione di preferenza e / o priorità.
Modifica 2: per rispondere in modo più completo alla radice della domanda, i tipi dinamici necessitano di una forma di confronto dinamico o di una più ampia varietà di operatori di confronto.
- '==' solo è sufficiente solo se l'operazione '==' è sufficientemente intelligente da sapere come gestire ciascun tipo in tutti gli scenari di utilizzo, in particolare se l'operando di sinistra e l'operando destro sono tipi diversi. Il rovescio della medaglia per l'operazione più dinamica è un probabile colpo di prestazioni. Più intelligente è l'operazione, più evidente sarà il costo.
- più forme di operatori (come l'aggiunta di "===") possono sembrare estranee alle persone nuove nella tua lingua e probabilmente riceveranno critiche.
- la terza opzione costringerebbe i confronti appropriati per ogni tipo in ogni momento, ma questo sacrificherà il dinamismo e andrà contro gli obiettivi di un linguaggio dinamico (almeno nella mia opinione ).
PHP tenta di gestire i confronti dinamicamente, ma include '===' per consentire anche confronti rigorosi. L'unica altra opzione sarebbe quella di rendere i confronti di default più "intelligenti" che costano le prestazioni.
Anche se è vero che gli operatori addizionali aggiungono complicazioni e confronti dinamici lasciano spazio a errori, uno studente di scuola media dovrebbe essere in grado di cogliere il concetto ( e molti lo fanno ). '==' significa che gli operandi sinistro e destro possono essere di tipi diversi, ma possono portare a risultati diversi in situazioni specifiche definite. '===' significa che sinistra e destra devono essere gli stessi tipi. Per quanto riguarda la pratica, è meglio usare '===' quando si controlla il valore di ritorno di una funzione, come pure is_string, is_int, is_bool, ecc. Questo è lo svantaggio di un linguaggio dinamico, e non farlo probabilmente porterà a risultati di confronto imprevisti, a volte.
Ma alla fine, un confronto "buono" seguirà sempre un comportamento definito e documentato. Una lingua può usare Klingon per i confronti a condizione che i risultati siano ben definiti.