07 Вызов функций.
Вызов функций PHP
Давайте сначала проясним одну вещь. Выполнение машинного кода намного быстрее, чем выполнение кода PHP. Итак, как только ваша функция C++ или ваш метод C++, наконец, будет вызван, вы обычно приведете параметры к собственным переменным, и вы начнете запускать свой собственный быстрый алгоритм. И вы не хотите вызывать другие функции PHP с этого момента.
Если, однако, вы хотите сделать вызов функции PHP - независимо от того, является ли это функцией, встроенной в движок Zend, которая определена в расширении или даже функцией, которая исходит из пользовательского пространства PHP - вы может это сделать.
#include <phpcpp.h> #include <iostream> /** * Собственная функция, вызываемая из PHP * * Эта функция получает два параметра: ассоциативный массив и обратный вызов. * Она не делает ничего значимого, это просто демонстрационная функция. * * @param params Параметры, передаваемые функции */ void example_function(Php::Parameters ¶ms) { // первый параметр-массив 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.