2014-07-10 22 views
10

Sto scrivendo un'estensione PHP in C, e vorrei mettere le classi, le funzioni e le variabili che sto creando in un namespace. Non sono stato in grado di trovare nulla nella documentazione di estensione relativa agli spazi dei nomi. Per essere chiari, voglio l'equivalente diPosso inserire classi di estensione PHP, funzioni, ecc. In un namespace?

namespace MyNamespace{ 
    class MyClass{ 
    } 
} 

ma in un'estensione C. Nello specifico, sto cercando una funzione o una macro nell'API di Zend C che mi permetta di assegnare uno spazio dei nomi PHP a una classe o funzione che ho scritto in C. È possibile?

+0

Sì, è perfettamente normale, in genere non lo uso perché mi atteno alla classe 1 per file. On, non importa se ho visto il tuo altro commento potresti voler aggiungere il titolo in modo che sia più visibile. – ArtisticPhoenix

+0

@ArtisiticPhoenix Non penso che tu abbia capito la mia domanda. So che * posso * farlo in PHP. Voglio sapere * come * farlo in un'estensione C. – murgatroid99

+0

@ murgatroid99 Lo faccio ora, mi dispiace. C'è un tag per C? aggiungendo che potrebbe aiutare anche. – ArtisticPhoenix

risposta

6

Inserire una classe in uno spazio dei nomi è molto semplice. Dove normalmente si dovrebbe inizializzare una classe con

zend_class_entry ce; 
INIT_CLASS_ENTRY(ce, "MyClass", my_class_methods); 

invece scrivere la seconda linea, come

INIT_CLASS_ENTRY(ce, "MyNamespace\\MyClass", my_class_methods); 

Lo spazio dei nomi non non bisogno di essere incluso nelle dichiarazioni di metodo o nei membri della matrice my_class_methods per abbinarli correttamente alla classe.

+0

Grazie per averlo fatto tornare indietro per rispondere alla domanda. Sono sicuro che mi hai appena salvato un sacco di tempo alla ricerca di questa risposta. – ksclarke

7

Per utilizzare Namespace nelle estensioni PHP, in pratica stai semplicemente mettendo un prefisso davanti al nome della classe o della funzione.

Non sono uno sviluppatore di internals PHP, quindi le specifiche non mi sono del tutto chiare su come funzioni, purtroppo ci sono davvero poche informazioni online che potrei trovare su questo (ho davvero messo Google in è un passo avanti) e l'articolo qui sotto è il migliore che ho trovato.

Tuttavia, sembra che questo articolo suggerisce la soluzione corretta, che sembra essere, che quando si registra la funzione con le parti interne del motore/PHP Zend, si fa così simile "myNS\\MyFunc" e dovrebbe quindi essere accessibile dalla myNS definito Là. Proverò alcune varianti diverse con questo, e vedrò fino a che punto si ottiene.

L'opzione migliore sarebbe chiedere in # php-internals su Freenode (se è possibile ottenere un invito) o sulla mailing list di PHP.

Se riesci a trovare una soluzione, Internet sembra aver bisogno di un buon articolo su come realizzare ciò.

Fonte http://www.php-cpp.com/documentation/namespaces

Uno spazio dei nomi non è altro che un prefisso di classe o funzione. Se si desidera che le classi o funzioni ad apparire in uno spazio dei nomi specifici, è sufficiente aggiungere un prefisso al nome della classe o funzione ....

Aggiornamento: Ho aggiornato la mia risposta per cercare di essere più chiaro. Mi dispiace che ci sia voluto così tanto tempo, all'inizio ho risposto dal mio telefono mentre ero in viaggio, con tutte le intenzioni di tornare indietro e rispondere al tuo commento originale, ma l'ho dimenticato sinceramente fino a quando non ho ricevuto una notifica da SO sui commenti. Mie scuse.

+0

Puoi dare una descrizione/esempio di come farlo usando C? Non sono sicuro di come tradurrei il codice in quel collegamento all'API C. – murgatroid99

+0

Questo non risponde alla mia domanda. Propone di utilizzare una libreria aggiuntiva in una lingua diversa che a quanto pare richiederebbe una grande riscrittura del mio codice di estensione per funzionare. E la risposta non spiega nemmeno come ottenere ciò che voglio usando quella libreria. – murgatroid99

+0

Questo potrebbe effettivamente essere corretto ... Penso che stia dicendo che avresti messo lo spazio dei nomi e il backslash nel nome della funzione/classe/qualunque cosa tu stia definendo? Non sono sicuro che ciò si applichi alle normali estensioni PHP. – duskwuff