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.