2009-05-07 10 views
12

Qualcuno può spiegarmi cosa c'è di male nell'usare la barra rovesciata come operatore del namespace? Ho letto un sacco di commenti beffardi a riguardo. Uno StackOverflower ha anche detto di aver rinunciato a PHP per questo.L'operatore Namespace ... qual è il problema?

Sì lo so che ha un significato speciale barra inversa come carattere di escape all'interno delle stringhe, ma non è davvero peggio di utilizzare ->, oppure il punto . come in molte altre lingue.

Mi ricorda tutto il beffardo di Nintendo quando hanno annunciato il nome del Wii. Ognuno fa un gran clamore e poi una volta che è fuori e tu ci sei abituato, a nessuno importa e loro vanno avanti.

Quindi, per favore mi illumini. Cosa c'è di male in questo? Cosa avresti suggerito invece?

risposta

12

Cosa c'è di male in questo: Riesci a individuare l'errore nel seguente codice?

if(class_exists("namespace1\namespace2\myClass")) 
    echo "This will never be true"; 

cosa avrei suggerito: Purtroppo, '\' è l'unico personaggio single single disponibili. Se PHP6 fosse mio per progettare, sostituirei tutti gli operatori bit a bit (^, &, |, ~) con le parole chiave (visto che sono usate così poco) e usano '|' come separatore di spazi dei nomi. In effetti suggerirei molte più semplici modifiche alla sintassi per rendere il PHP più facile da leggere e scrivere, ma è più semplice usare Python invece ...

+0

so cosa stai dicendo, ma sta scrivendo class_exists ("namespace1 \\ namespace2 \\ myClass") molto più difficile? – nickf

+3

trovo il tasto "\" scomodo da raggiungere su una tastiera tedesca. inoltre, nessun'altra lingua (afaik) usa il backslash come ns-separator che porta a un altro modo di fare la stessa cosa leggermente diverso. – stefs

+0

Non capisco come sia l'unico personaggio disponibile? Perché non usare che non ha un significato speciale all'interno di una stringa (o sono errato) \ ha un significato speciale all'interno di una stringa ed è stato usato. –

3

Il problema è che è il carattere di escape in quasi ogni altro contesto. Ciò significa che la gente inavvertitamente lo incasina, ma rende anche difficile la lettura perché i tuoi occhi sono sintonizzati per leggere una barra rovesciata come un meta-personaggio, piuttosto che solo un altro simbolo.

Avrei preferito tre punti, che in realtà è stato suggerito ad un certo punto.

+0

Per "ogni altro contesto", intendi stringhe e regex? L'arresto completo ha significati diversi se usato come operatore (concatenazione di stringhe), in un'espressione regolare (corrisponde a qualsiasi carattere) o in una stringa (è completamente ferma). Questo non sembra causare alcuna confusione, quindi perché \? – nickf

+0

In realtà intendevo in senso lato. La maggior parte delle lingue usa il backslash come carattere di escape. Penso che \ sia diverso da a. in quanto aumenta i personaggi che lo seguono (Almeno quando è usato per fuggire). Sono d'accordo che * tecnicamente * non è un gran problema, ma i miei occhi sono addestrati ad assegnare un significato speciale a quel personaggio. – troelskn

3

Inoltre, se volessi un linguaggio che reinventasse la sintassi senza un motivo particolarmente valido, userei Ruby.

+0

non reinventa nulla, usa solo un personaggio diverso dalle altre lingue. – nickf

+3

Davvero? L'ultima volta che ho controllato PHP sembra piuttosto simile a C++. Questo è il motivo per cui l'ho preso, è stato un buon modo per trasferire le mie conoscenze di programmazione senza riadattare in modo significativo le mie aspettative. Su questo punto, è una decisione sbagliata ma è sopravvissuto. Ma non c'è modo che chiunque abbia chiesto a una considerevole popolazione di utenti PHP ciò che vorrebbero sarebbe giunto alla conclusione che "\" è in linea con ciò che gli utenti vogliono. In realtà è totalmente disallineato con le aspettative degli utenti, che è ciò di cui le persone sono pazze. Questa decisione sembra non riflettere alcun input da parte dei programmatori PHP. –

1

Bene, ci sono altri problemi quando si utilizza "\" come spazio dei nomi.

  1. È il carattere di fuga. Se hai devi usare \ in "stringa" e \ in "stringa". Sento che qualcuno in qualche modo farà confusione con lo . Prima o poi. il char di escape ti prenderà.
  2. il '\' non è posizionato molto bene su ogni tastiera. Sulla mia tastiera devo usare una combinazione di tasti che non sono molto vicini l'uno all'altro e talvolta è solo un dolore. Mentre non è così male come '^'. In altre parole, non sarà possibile scrivere codice correntemente che deve accedere allo spazio dei nomi su una determinata mappa dei tasti.
  3. Ricordo quando hanno votato e quanto sono assurdi i risultati. L'hanno scelto perché era più semplice dell'altro char e aveva bisogno di meno digitazioni. Per essere onesti, tutto dipende dal layout della tastiera.

Questo è tutto il motivo per cui riesco a trovare il motivo per cui potrebbe essere una brutta cosa usare il carattere di escape. Ad essere onesto, sto ancora aspettando il linguaggio che creerà i suoi propri symbole Unicode. Quindi darebbe molta più flessibilità su quale operatore è possibile ignorare. Diciamo che in C++ potresti scrivere qualcosa di simile.

bool operator ≤ (Dog dog); 
//and then do this 
if(myDog ≤ thisDog){ 
} 
//Seems useful? 
bool operator ≅ thisDog){ 
    // this wouldn't check for equality 
    // but for something close to it 
} 

Essere in grado di utilizzare il nostro operatore arbitraria ha molto più senso che usando + per le cose di gruppo ... "∪" avrebbe molto più senso ... E se si desidera ottenere all'incrocio solo voi "∩ "e poi la gente potrebbe dire ..." e se non avessimo quei caratteri nel nostro font? " Posso solo rispondere con: "Trova un font che li abbia !!!!"

+0

Mentre sono d'accordo sul fatto che '∪' abbia più senso di' + 'in alcuni contesti, non è un carattere facile da inserire senza una tavolozza di caratteri, o una combinazione di tasti estensiva, ecc. Se vuoi formare un'unione di due set è probabilmente più veloce per digitare 'set1.union (set2);' piuttosto che inserire '∪', anche se' (set1 ∪ set2) 'sembra molto più bello. – dreamlax

0

supponiamo il seguente spazio:

jp\nintendo\rvl\testing

si nota gli errori?

l'attuale spazio dei nomi (interno) è più probabile che qualcosa di simile:

jp 
intendo 
vl esting

La soluzione a questo è di usare sempre due barre rovesciate come un separatore spazio dei nomi simile a come stiamo usando questa operazione in Windows i nomi dei file.

l'uso di due barre retroverse è completamente innocuo, in quanto è una sequenza di escape stessa, che si espande in 1 singola barra rovesciata letterale, che è il separatore spazio dei nomi effettivo.

ora, se usiamo

jp\\nintendo\\rvl\\testing
come uno spazio dei nomi (utilizzando 2 backslash come il separatore) l'attuale spazio dei nomi (interno) diventa:
jp\nintendo\rvl\testing

+3

Non ci sono errori nel tuo spazio dei nomi di esempio. Se quello fosse in una stringa doppia citata, sarebbe diverso, ma non lo è. – nickf

0

La vera domanda è, perché non hanno appena messo come /? Personalmente odio \ perché è un personaggio da sfuggire ... che mi rovina tutto!

+4

'/' è l'operatore di divisione. Come si fa a rovinare tutto? – nickf

1

I documenti ufficiali RFC e backing può essere trovato alla

Essi comprendono un IRC log about the decision process.

Citando Sezione "Problemi"

  • \ assomiglia molto / ed è facile per capovolgere accidentalmente, soprattutto per gli utenti UNIX
  • \ viene utilizzato per sfuggire
  • all'interno di una stringa un nome di namespace diventa \\like\\this oppure possiamo ottenere strani personaggi. All'inizio questo potrebbe confondere gli utenti.
  • tutti i codici dei nomi esistenti devono essere quasi riscritti, una semplice ricerca/sostituzione di :: non sarebbe possibile.
  • la patch tocca molto del motore e richiede rigorosi test di battaglia.
  • a molti, \this\way sembrerà strano all'inizio.

Qualsiasi della beffa Osservazioni È citati sono probabilmente a causa di quella di sopra o al parere personale per "motivi". Io, per esempio, li trovo abbastanza brutti da leggere e scomodi da scrivere, specialmente nelle stringhe in cui devo usare i doppi backslash. Ma poi di nuovo, mi ci abituo più spesso li uso.

Problemi correlati