🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## 概述 PHP中的变量是非类型化的。因此,变量可以包含任何可能的类型:整数,字符串,浮点数,甚至是对象或数组。另一方面,C ++是一种类型化的语言。在C ++中,整数变量始终具有数字值,而字符串变量始终具有字符串值 **Php :: Value对象是zval变量的包装,但是它完全隐藏了zval处理的复杂性** ## 标量变量 ``` Php::Value value1 = 1234; Php::Value value2 = "this is a string"; Php::Value value3 = std::string("another string"); Php::Value value4 = nullptr; Php::Value value5 = 123.45; Php::Value value6 = true; ``` Php :: Value类具有强制转换运算符,用于将对象强制转换为几乎所有可想到的本机类型 ``` void myFunction(const Php::Value &value) { int value1 = value; std::string value2 = value; double value3 = value; bool value4 = value; } ``` 许多不同的运算符也被重载,因此您可以**直接在算术运算中使用Php :: Value对象**,将其与其他变量进行比较,或将其发送到输出流 ``` void myFunction(Php::Value &value) { value += 10; Php::out << value << std::endl; if (value == "some string") { } int result = value - 8; } ``` Php :: Value对象具有大多数类型的隐式构造函数。这意味着也可以使用本机类型调用每个接受Php :: Value作为参数的函数 ``` #include <phpcpp.h> Php::Value myFunction(Php::Parameters &paramas) { Php::Value value =paramas[0]; if (value == 12) { return "abc"; } else if (value > 100) { paramas.insert(paramas.begin(),12); return myFunction(paramas); } return nullptr; } extern "C" { PHPCPP_EXPORT void *get_module() { static Php::Extension extension("my_extension", "1.0"); extension.add<myFunction>("myFunction", { Php::ByVal("a", Php::Type::Numeric, true) }); return extension; } } ``` ## Php::Value 可转字符串 ``` void myFunction(Php::Parameters &params) { // 方式一 std::string var1 = params[0]; // 方式二: Php :: Value超出范围,就不再保证指向缓冲区的指针是有效的 const char *var2 = params[0]; size_t var2size = params[0].size(); } ``` ## Php::Value 可读缓存区 <details> <summary>main.php</summary> ``` // 第一个示例函数更易于阅读。 // read()系统调用用于用字节填充本地缓冲区。 // 然后将该本地缓冲区转换为Php::Value对象并返回 Php::Value readExample1(int fd) { char buffer[4096]; ssize_t bytes = read(fd, buffer, 4096); if (bytes < 0) bytes = 0; return Php::Value(buffer, bytes); } //第二个示例函数效率更高, // 因为read()系统调用现在立即将字节读取到Php :: Value对象的缓冲区中,而不是临时缓冲区中 Php::Value readExample2(int fd) { // result variable Php::Value result; // 将缓冲区大小调整为4096字节,reserve()方法将调整大小 // 将内部缓冲区调整到适当大小,并返回一个指针 // 到缓冲区 char *buffer = result.reserve(4096); ssize_t bytes = read(fd, buffer, 4096); if (bytes < 0) bytes = 0; //将缓冲区的大小调整为实际字节数(this //是必需的,否则PHP strlen()将返回4096偶数 //可用字节更少时 result.reserve(bytes); return result; } ``` </details> <br /> ## Php::Value 可数组 <details> <summary>main.cpp</summary> ``` Php::Value array; array[0] = "apple"; array[1] = "banana"; array[2] = "tomato"; // //初始化器列表可用于创建填充数组 Php::Value filled({"a", "b", "c", "d"}); std::vector<std::string> fruit = array; Php::Value assoc; assoc["apple"] = "green"; assoc["banana"] = "yellow"; assoc["tomato"] = "green"; Php::Value assoc2; assoc2["x"] = "info@example.com"; assoc2["y"] = nullptr; assoc2["z"] = 123; Php::Value assoc2; assoc2["x"] = "info@example.com"; assoc2["y"] = nullptr; assoc2["z"][0] = "a"; assoc2["z"][1] = "b"; assoc2["z"][2] = "c"; std::map<std::string, std::string> map = assoc2; // 访问 Php::out << array["x"] << std::endl; Php::out << array["y"] << std::endl; // 创建空数组 Php::Array array1; // 赋值 Php::Value array2 = array1; // 不可赋值 array1 = 100; ``` </details> <br /> ## Php::Value 可对象 就像Php :: Array类是扩展为初始化为空数组的扩展Php :: Value一样,也有一个Php :: Object类在构造时成为对象 ``` //创建stdClass类型的空对象 Php::Object object; // Value是基类,所以你可以给Php::Object对象赋值 Php::Value value = object; // 不可,必须是对象 object = "test"; //对象属性可以用方括号访问 object["property1"] = "value1"; object["property2"] = "value2"; // 要创建不同类型的对象,请传入类名 // 指向带有可选构造函数参数的构造函数 object = Php::Object("DateTime", "now"); Php::out << object.call("format", "Y-m-d H:i:s") << std::endl; // 所有这些方法都可以在Php::Value对象上调用 Php::Value value = Php::Object("DateTime", "now"); Php::out << value.call("format", "Y-m-d H:i:s") << std::endl; ``` ## Php::Value 可迭代 ``` void myFunction(const Php::Value &value) { //值变量保存一个数组或对象,然后 //可以遍历值或属性 for (auto &iter : value) { Php::out << iter.first << ": " << iter.second << std::endl; } } ``` ## Php::Value 可函数 ``` // 创建一个带有函数名的字符串 Php::Value date = "date"; // “date”是一个内置的PHP函数,因此可以调用它 Php::out << date("Y-m-d H:i:s") << std::endl; //创建日期-时间对象 Php::Object now = Php::Object("DateTime","now"); // 创建一个有两个成员的数组 // 即datetime对象和方法的名称 Php::Array array(); array[0] = now; array[1] = "format"; //第一个成员被看作是对象,第二个成员被看作是方法的名称 Php::out << array("Y-m-d H:i:s") << std::endl; ``` ## 全局变量(Php:GLOBALS,Php::GET 等) Php :: GET,Php :: POST,Php :: COOKIE,Php :: FILES,Php :: SERVER,Php :: REQUEST和Php :: ENV ``` Php::GLOBALS["a"] = 12345; // //全局变量可以是任何类型 Php::GLOBALS["b"] = Php::Array({1,2,3,4}); //当然支持嵌套调用 Php::GLOBALS["b"][4] = 5; //和全局变量也可以读取 Php::out << Php::GLOBALS["b"] << std::endl; ``` ## 小心全局C ++变量 与仅处理单个网页浏览量的PHP脚本不同,扩展名用于依次处理多个网页浏览量。这意味着当您在扩展程序中使用全局C ++(!)变量时,这些变量不会在两次网页浏览之间设置回其初始值。 但是,Php :: GLOBALS变量始终在每个新的综合浏览量的开始处重新初始化。