Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time

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.