Русская документация PHP-CPP

Пространства имен

Хотя пространства имен имеют очень богатую реализации в PHP, с особыми ключевыми словами, такими как как use и namespace и специальные константы вроде __NAMESPACE__, внутренне они устроены черезвычайно просто.

В ядре PHP пространства имен не определяются ни какой внутренней структурой. Они имеют значение только для синтаксического анализатора (парсера) PHP, который просто добавляет префиксы вида TestNamespace\ к именам классов и функций.

Когда мы пишем

<?php namespace TestNamespace;
class Foo {}
?>
PHP-парсер просто добавит TestNamespace\ в качестве префикса к имени класса Foo. Однако мы не можем использовать префикс с символом \ в своем PHP-коде. Следующий PHP-код
<?php
class TestNamespace\Foo {}
?>
Приведет к ошибке анализатора
Parse error: syntax error, unexpected '\'
Когда мы пишем расширение на C или C++, мы минуем слой синтаксического анализатора PHP. Поэтому, для использования пространства имен в наших расширениях, нам нужно просто добавить префикс TestNamespace\ К имени определяемого класса или функции и это будет работатьЖ
#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", "0.1");
        
        // add the myFunction function to the extension, 
        // and put it in namespace "myNamespace"
        extension.add("myNamespace\\myFunction", myFunction);
        
        // return the extension
        return extension;
    }
}

Возможно, кому то будет удобнее использовать специальный класс Php::Namespace для определения пространства имен. Класс Php::Namespace имеет точно такую же сигнатуру, что и Php::Extension и может использоваться для регистрации в классов и функций в пространстве имен. Следующий пример демонстрирует работу Php::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");
        
        // 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;
    }
}

Php::Namespace — это просто контейнер, который автоматически добавляет префикс ко всем размещенным в нем классам, функциям и другим пространствам имен. Как видно из приведенного выше примера, с помощью Php::Namespace можно так же осуществить вложенность пространств имен.

В примере мы использовали функцию std::move() для перемещения вложенных пространств имен в родительское пространстве имен, и для перемещения первого пространства имен в расширение extension. Перемещение является более эффективным способом добавления, но регулярный вызов extension.add(myNamespace) также будет работать.

Установка PHP-CPP Загрузка расширений Ваше первое расширение Вывода и ошибок Функции Параметры Вызов функций и методов Классы и объекты Конструкторы и деструкторы Наследование Магические методы Магические интерфейсы Генерация исключений Специальные возможности Поля классов Работа с переменными ini записи Extension callbacks Пространства имен