我有一个程序需要发送以下变量:
Bool
int
string
vector<int>
vector<string>
这将来自PHP
调用,因为我已经研究了此处和这里。
看看这个关于(int argc, char** argv[])
的问题,我知道您可以向程序传递运行所需的各种参数,但这些参数都是字符序列的形式。
所以我的问题是:如果可能的话,如何在PHP
调用中跨多个不同的变量发送到C++
程序?
编辑(问题继续)。。。函数调用会是什么样子?
它是不是像不使用(int argc, char** argv[])
而只做一样简单
int main(bool var1, int var2, std::vector<std::string> var3, std::string var4)
{
...
}
因为这似乎让(int argc, char** argv[])
有点多余?
您可以使用exec
:在PHP中执行C++程序
exec("./your_program.exe $parameters", $output);
这将把$parameters
的内容作为命令行参数传递给C++程序。在main(int argc, char** argv)
中,您可以通过argc
和argv
访问这些数据。
为了一次传递多个变量,您应该使用某种序列化。这将把变量的内容转换为一个单独的字符串,然后您可以再次将其作为命令行参数传递。您只需要确保C++端知道如何再次将此字符串取消序列化为正确的变量/数据类型。
有很多可能性,从发明自己的格式(不要这样做)到使用一种既定的格式(这样做)。
脑海中浮现出JSON、XML、MessagePack等格式。您甚至可以使用PHP自己的serialize
方法来实现一些东西。
为了使事情更加清楚,让我们假设您希望将这些数据从PHP传递给C++:
$var1 = false;
$var2 = 123;
$var3 = array("some","string","data");
$var4 = "anotherstring";
让我们进一步假设您有一个PHP函数my_serialize()
,它将array($var1, $var2, $var3, $var4)
转换为虚构的序列化格式false|123|<some,string,data>|anotherstring
:
$serialized_data = my_serialize(array($var1, $var2, $var3, $var4));
// $serialized_data == "false|123|<some,string,data>|anotherstring"
// invoke your program and pass the data
exec("./your_program.exe '$serialized_data'", $output);
在您的程序中,序列化的数据现在位于argv[1]
中。您现在需要一个函数my_deserialize()
来解析输入数据并将其转换为相应的数据格式。
int main(int argc, char** argv)
{
std::cout << argv[1] << std::endl;
MyData data = my_deserialize(argv[1]);
std::cout << data.var4 << std::endl; // outputs "another string"
}
使用我上面列出的序列化方法之一,您就不必关心my_serialize
和my_deserialize
的实现细节。