I namespace sembrano rendere le cose più complicate. Mi sto perdendo qualcosa?

4

Ora che utilizzo i namespace nei miei file php che corrispondono al percorso del file, devo aggiungere uno spazio dei nomi praticamente ad ogni istanza di classe. Gli spazi dei nomi aiutano sicuramente il mio autoloader a trovare i file, ma il codice sta diventando più difficile da leggere / scrivere. non sono spazi dei nomi che dovrebbero semplificare il mio codice? perché rende le cose più complicate? Sto usando male? Non sono sicuro di vedere come usare uno spazio dei nomi è molto meglio che avere nomi di classi molto lunghi ...

Esempio:

file: /root_path/init.php

<?php
    namespace root_path;
    $foo = new \sub_path\bar();
?>

file: /root_path/sub_path/bar.php

<?php
    namespace root_path\sub_path;
    class bar {

    }
?>
    
posta dqhendricks 14.04.2011 - 21:09
fonte

2 risposte

6

Sembra che tu stia usando bene, ma potresti non averne bisogno.

Namespacing consente di utilizzare nomi di funzioni e simboli senza preoccuparsi se una libreria di terze parti dichiara la stessa cosa (il che causerebbe un errore fatale in PHP). Puoi trarre conforto nel sapere che, dato che hai assegnato un nome a tutto, non c'è possibilità di collisione.

Ma se sei in una posizione in cui hai intenzione di conoscere e tenere conto di tutti i possibili simboli, non otterrai molto valore dai namespace. Modifica: e come G3D menziona nei commenti, il tuo caso d'uso specifico è coperto da Convenzioni per la denominazione di PEAR .

Tuttavia, fare affidamento sui prefissi potrebbe non funzionare come ci si aspetterebbe se si introducessero molte incognite.

Questo è disponibile in Drupal : supponiamo tu abbia creato un modulo denominato visualizzazioni . Bene, Drupal fornisce un sistema di aggancio, quindi puoi fare cose come implementare la funzione hook_foo() sostituendo hook con il nome del tuo modulo.

Quindi ora hai un'implementazione di un hook chiamato views_foo() . Tutto va bene e va bene finché non hai bisogno di una funzione interna denominata views_foo() .

Ma diciamo che c'è un nuovo modulo che estende il tuo modulo e si autodefinisce views_awesome . Se views_awesome vuole implementare hook_foo() , creerebbe una nuova funzione denominata views_awesome_foo() .

Ah, ma non ti ho detto di un altro hook già definito: hook_awesome_foo() . Quindi, senza namespacing, hai una collisione: views_awesome_foo() può riferirsi all'implementazione di view_awesome dell'implementazione di hook_foo o views di hook_awesome_foo() .

In questo scenario, il namespace è davvero utile. Invece di aggiungere il prefisso alle implementazioni di hook, puoi fare:

\views\hook_foo()
\views_awesome\hook_foo()

ed evitare qualsiasi ambiguità.

    
risposta data 14.04.2011 - 21:14
fonte
0

Lo fanno, in un certo senso, ma sono critici per il riutilizzo del codice a lungo termine. Altrimenti, devi assicurarti che non ci siano collisioni di spazi dei nomi variabili, e questo diventa estremamente complicato.

La mancanza di spazi dei nomi è stata un problema molto grande con php, soprattutto dato il suo ambito molto debole.

    
risposta data 14.04.2011 - 21:14
fonte

Leggi altre domande sui tag