Namespaces
Although namespaces have a very rich implementation in PHP scripts, with special keyswords like 'use' and 'namespace' and special constants like '__NAMESPACE__'
, they are internally very simple.
A namespace is nothing else than a class or function prefix. If you want your classes or functions to appear in a specific namespace, you simply have to add a prefix to the class or function name. The following code creates a function "myFunction" in the "myNamespace" namespace.
#include <phpcpp.h>
// function that we're going to export
void myFunction()
{
}
extern "C" {
PHPCPP_EXPORT void *get_module() {
// create extension object
static Php::Extension extension("my_extension", "1.0");
// add the myFunction function to the extension,
// and put it in namespace "myNamespace"
extension.add("myNamespace\\myFunction", myFunction);
// return the extension
return extension;
}
}
If you like, you can use the Php::Namespace
utility class for this. This is a class with exactly the same signature as the Php::Extension
class, and that you can use to register classes and functions too.
#include <phpcpp.h>
// function that we're going to export
void myFunction()
{
}
extern "C" {
PHPCPP_EXPORT void *get_module() {
// create extension object
static Php::Extension extension("my_extension", "1.0");
// create a namespace
Php::Namespace myNamespace("myNamespace");
// add the myFunction function to the namespace
myNamespace.add("myFunction", myFunction);
// @todo add more functions and classes to the namespace
// create a nested namespace
Php::Namespace nestedNamespace("nestedNamespace");
// @todo add functions and classes to the nested namespace
// add the nested namespace to the first namespace
myNamespace.add(std::move(nestedNamespace));
// add the namespace to the extension
extension.add(std::move(myNamespace));
// return the extension
return extension;
}
}
The Php::Namespace
class is just a container that automatically adds a prefix to all classes and functions that you add to it. Nesting namespaces is possible too, as you saw in the example.
In the example we used the std::move()
function to move the nested namespace into the parent namespace, and to move the first namespace into the extension. Moving is more efficient that adding, although a regular extension.add(myNamespace) would have been valid too.