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.