2014-07-10 11 views
10

Ich schreibe eine PHP-Erweiterung in C und möchte die Klassen, Funktionen und Variablen, die ich erstelle, in einen Namespace einfügen. Ich konnte in der Erweiterungsdokumentation zu Namespaces nichts finden. Um klar zu sein, ich möchte das Äquivalent vonKann ich PHP-Erweiterungsklassen, Funktionen usw. in einen Namespace einfügen?

namespace MyNamespace{ 
    class MyClass{ 
    } 
} 

aber in einer C-Erweiterung. Genauer gesagt suche ich nach einer Funktion oder einem Makro in der Zend C API, die es mir erlaubt, einen PHP-Namespace einer Klasse oder Funktion zuzuordnen, die ich in C geschrieben habe. Ist das möglich?

+0

Ja, das ist völlig in Ordnung, ich benutze es normalerweise nicht, weil ich bei der 1 Klasse pro Datei bleibe. An, egal, ich habe deinen anderen Kommentar gesehen, du möchtest vielleicht den Titel hinzufügen, damit er besser sichtbar ist. – ArtisticPhoenix

+0

@ArtisiticPhoenix Ich glaube nicht, dass du meine Frage verstanden hast. Ich weiß, dass ich es in PHP machen kann. Ich möchte wissen * wie * es in einer C-Erweiterung zu tun. – murgatroid99

+0

@ murgatroid99 Tut ich jetzt, tut mir leid. Gibt es ein Tag für C? das könnte auch helfen. – ArtisticPhoenix

Antwort

6

Das Einfügen einer Klasse in einen Namespace ist sehr einfach. Wo normalerweise würden Sie eine Klasse mit

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

initialisieren, anstatt der zweiten Zeile schreiben, wie

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

Der Namespace ist nicht Bedarf in den Verfahren Erklärungen oder in den Mitgliedern des my_class_methods Array aufgenommen werden um sie mit der Klasse zu verbinden.

+0

Danke für die Rückmeldung, um die Frage zu beantworten. Ich bin sicher, Sie haben mich gerade viel Zeit auf der Suche nach dieser Antwort gespeichert. – ksclarke

7

Um Namespaces in PHP-Erweiterungen zu verwenden, setzen Sie im Grunde nur ein Präfix vor den Klassen- oder Funktionsnamen.

Ich bin nicht wirklich ein Interner Entwickler von PHP, so dass die Details nicht ganz klar sind, wie das funktioniert, leider gibt es sehr, sehr wenige Informationen online, die ich auch finden konnte (ich habe Google wirklich durchgestellt) es sind Schritte), und der Artikel unten ist der beste, den ich finden konnte.

Es scheint jedoch, dieser Artikel weist auf die richtige Lösung, die zu sein scheint, dass, wenn Sie die Funktion mit dem Motor/PHP-Interna Zend registrieren, Sie tun so wie "myNS\\MyFunc" und es sollte dann zugänglich sein, von der myNS definiert Dort. Ich würde damit ein paar verschiedene Varianten ausprobieren und sehen, wie weit dich das bringt.

Ihre beste Option wäre, in # php-internals auf Freenode (wenn Sie eine Einladung erhalten) oder auf der PHP Mailing-Liste zu fragen.

Wenn Sie es schaffen, eine Lösung zu finden, scheint das Internet einen guten Artikel darüber zu benötigen, wie man dies erreichen könnte.

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

Ein Namensraum ist nichts anderes als eine Klasse oder Funktion Präfix. Wenn Sie möchten, dass Ihre Klassen oder Funktionen in einem bestimmten Namespace angezeigt werden, müssen Sie dem Klassen- oder Funktionsnamen einfach ein Präfix hinzufügen ....

Update: Ich habe meine Antwort aktualisiert, um mehr zu sein klar. Es tut mir leid, dass es so lange gedauert hat. Ich antwortete ursprünglich während meiner Reise von meinem Telefon aus, mit der Absicht, zurück zu kommen und auf Ihren ursprünglichen Kommentar zu antworten, aber ich habe es wirklich vergessen, bis ich eine Benachrichtigung von SO über Kommentare bekam. Entschuldigen Sie.

+0

Können Sie eine Beschreibung/ein Beispiel dafür geben, wie Sie dies nur mit C tun? Ich bin nicht wirklich sicher, wie ich den Code in dieser Verbindung zur C API übersetzen würde. – murgatroid99

+0

Das beantwortet meine Frage überhaupt nicht. Es schlägt vor, eine zusätzliche Bibliothek in einer anderen Sprache zu verwenden, die offensichtlich eine größere Umschreibung meines Erweiterungscodes erfordert. Und die Antwort erklärt nicht einmal, wie ich mit dieser Bibliothek erreichen kann, was ich will. – murgatroid99

+0

Das könnte eigentlich richtig sein ... Ich denke, es heißt, dass Sie nur den Namespace und den Backslash in den Namen der Funktion/Klasse/was auch immer definieren? Nicht sicher, dass das für normale PHP-Erweiterungen gilt. – duskwuff

Verwandte Themen