Вызов функций PHP

Давайте сначала проясним одну вещь. Выполнение машинного кода намного быстрее, чем выполнение кода PHP. Итак, как только ваша функция C++ или ваш метод C++, наконец, будет вызван, вы обычно приведете параметры к собственным переменным, и вы начнете запускать свой собственный быстрый алгоритм. И вы не хотите вызывать другие функции PHP с этого момента.

Если, однако, вы хотите сделать вызов функции PHP - независимо от того, является ли это функцией, встроенной в движок Zend, которая определена в расширении или даже функцией, которая исходит из пользовательского пространства PHP - вы может это сделать.

#include <phpcpp.h>
#include <iostream>

/**
 *  Собственная функция, вызываемая из PHP
 *
 *  Эта функция получает два параметра: ассоциативный массив и обратный вызов.
 *  Она не делает ничего значимого, это просто демонстрационная функция.
 *
 *  @param  params      Параметры, передаваемые функции
 */
void example_function(Php::Parameters &params)
{
    // первый параметр-массив
    Php::Value array = params[0];

    // вызов РНР array_keys() функция для получения ключей параметров 
    std::vector<std::string> keys = Php::array_keys(array);

    // петля через ключи
    for (auto &key : keys) 
    {
        // вывод ключа
        Php::out << "key: " << key << std::endl;
    }

    // вызов функции из пользовательского пространства
    Php::Value data = Php::call("some_function", "some_parameter");

    // создать объект (это также вызовет __ construct())
    Php::Object time("DateTime", "now");

    // вызов метода для объекта datetime
    Php::out << time.call("format", "Y-m-d H:i:s") << std::endl;

    // второй параметр-функция обратного вызова
    Php::Value callback = params[1];

    // вызов функции обратного вызова
    callback("some","parameter");

    // в PHP можно создать массив с двумя параметрами, первый параметр является объектом,
    // а второй параметр должен быть именем метода,
    // мы можем сделать это и в PHP-CPP тоже
    Php::Array time_format({time, "format"});

    // вызов метода, хранящегося в массиве
    Php::out << time_format("Y-m-d H:i:s") << std::endl;
}

/**
 *  Переключитесь в контекст C, потому что движок Zend ожидает,
 *  to have a C style function signature
 */
extern "C" {
    /**
     *  Startup function that is automatically called by the Zend engine
     *  что get_module () получит подпись функции стиля C
     *  @return void*
     */
    PHPCPP_EXPORT void *get_module() 
    {
        // объект расширения
        static Php::Extension extension("my_extension", "1.0");

        // добавить функцию примера, чтобы ее можно было вызвать из PHP-скриптов
        extension.add("example_function", example_function);

        // вернуть детали расширения
        return extension;
    }
}

В приведенном выше примере вы можете увидеть несколько разных способов вызова функций PHP из C ++. Первый - вызов Php::array_keys(). PHP-CPP внутренне имеет длинный список всех важных функций PHP, и вы можете вызывать эти функции непосредственно из вашего расширения. Php::array_keys() является одним из них.

Многие из встроенных функциональных функций (например, Php::array_keys()) возвращают объект Php::Value. В примере, однако, вы видели, что мы присвоили возвращаемое значение непосредственно std::vector. Это работает, потому что объект Php::Value имеет неявный оператор приведения для автоматического преобразования объекта в вектор.

Разумеется, не каждая функция PHP может быть вызвана, как встроенные функции. Функции пользовательского пространства или функции из дополнительных расширений PHP не пересылаются автоматически библиотекой PHP-CPP. Такие функции еще можно вызвать с помощью функции Php::call (). Вы должны указать имя вызываемой функции и необязательный список аргументов.

Класс Php::Object (который получен из Php::Value) может использоваться для создания объектов и неявно вызвать метод __construct (). Чтобы вызвать метод для объекта, вы можете использовать метод Php::Value::call (), который используется в примере для вызова метода PHP DateTime::format ().

В PHP-скриптах вы можете создать массив с двумя членами: объект и имя метода. Затем этот массив можно использовать так, как если бы он был обычной функцией. Вы можете делать подобные вещи в C ++, как мы показали в примере с переменной «time_format».

Пример приведен ниже.

<?php
    // определить функцию пользовательского пространства
    function some_function($param)
    {
        echo("userspace function called with $param\n");
    }

    // пример ввода
    $input = array(
        'x' =>  10,
        'y' =>  20,
        'z' =>  30
    );

    example_function($input, function($param1, $param2) {
        echo("lambda function called with param $param1 $param2\n");
    });
?>

Этот сценарий будет генерировать вывод, похожий на этот:

key: x
key: y
key: z
userspace function called with some_parameter
2014-03-08 13:55:54
lambda function called with param some parameter
2014-03-08 13:55:54

Если вы вызовете функцию или метод, который не существует, будет вызван Php::Exception. Если вы не поймаете это исключение в своем коде на C ++, оно всплывет и появится в пространстве пользователя PHP.

Далее.