Получать переменные переменные входы от PHP в c ++

У меня есть программа, которая должна быть отправлена ​​следующие переменные:

Bool int string vector<int> vector<string>

Это будет вызвано PHP вызовом, поскольку я рассмотрел здесь и здесь .

Глядя на этот вопрос о (int argc, char** argv[]) , я знаю, что вы можете передавать различные аргументы программе, которую нужно выполнить, но все они представлены в виде последовательности символов .

Поэтому мой вопрос: если это возможно, как вы собираетесь отправлять через несколько переменных переменных при вызове PHP на C++ программу?

EDIT (Вопрос продолжен) … и как будет выглядеть вызов функции?

Это так просто, как не использовать (int argc, char** argv[]) и просто делать:

 int main(bool var1, int var2, std::vector<std::string> var3, std::string var4) { ... } 

Потому что это, кажется, делает (int argc, char** argv[]) немного избыточным?

Вы можете выполнить свою C ++-программу на PHP с помощью exec :

 exec("./your_program.exe $parameters", $output); 

Это передаст содержимое $parameters в качестве аргумента командной строки для вашей программы на C ++. Внутри main(int argc, char** argv) вы можете получить доступ к этим данным через argc и argv .

Чтобы передать сразу несколько переменных, вы должны использовать некоторую сериализацию . Это преобразует содержимое ваших переменных в одну строку, которую вы затем можете передать в качестве аргумента командной строки. Вам просто нужно убедиться, что сторона C ++ знает, как снова неэтериализовать эту строку в правильные переменные / типы данных.

Существует множество возможностей: от разработки собственного формата (не делайте этого) до использования одного из установленных (сделайте это).

Форматы, такие как JSON, XML, MessagePack и т. Д., Приходят на ум. Вы даже можете реализовать что-то, используя собственный метод serialize PHP .


Чтобы сделать все более понятным, предположим, что вы хотите передать эти данные с 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 .