变量
最后更新于:2022-04-02 02:33:04
[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
Php::Value myFunction(Php::Parameters ¶mas)
{
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", {
Php::ByVal("a", Php::Type::Numeric, true)
});
return extension;
}
}
```
## Php::Value 可转字符串
```
void myFunction(Php::Parameters ¶ms)
{
// 方式一
std::string var1 = params[0];
// 方式二: Php :: Value超出范围,就不再保证指向缓冲区的指针是有效的
const char *var2 = params[0];
size_t var2size = params[0].size();
}
```
## Php::Value 可读缓存区
## Php::Value 可数组
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 map = assoc2;
// 访问
Php::out << array["x"] << std::endl;
Php::out << array["y"] << std::endl;
// 创建空数组
Php::Array array1;
// 赋值
Php::Value array2 = array1;
// 不可赋值
array1 = 100;
```
## 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变量始终在每个新的综合浏览量的开始处重新初始化。
';
main.php
``` // 第一个示例函数更易于阅读。 // 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; } ```## Php::Value 可数组
main.cpp
``` Php::Value array; array[0] = "apple"; array[1] = "banana"; array[2] = "tomato"; // //初始化器列表可用于创建填充数组 Php::Value filled({"a", "b", "c", "d"}); std::vector## 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变量始终在每个新的综合浏览量的开始处重新初始化。