PHP-CPP是一个用于开发PHP扩展的C++库。本节讲解在C++中PHP异常、变量、常量的实现相关知识。php
PHP和C++都支持异常,而PHP-CPP库这两种语言之间的异常处理是彻底透明的。你在C++中抛出的异常会自动传递给PHP脚本,而且你的C++代码能够捕获PHP脚本抛出的异常,就像它是普通的C++异常同样。数组
遗憾的是,PHP-CPP目前仅支持PHP标准异常Exception
,还不支持自定义异常。app
示例:函数
#include <phpcpp.h> Php::Value myDiv(Php::Parameters ¶ms) { if (params[1] == 0) throw Php::Exception("Division by zero"); return params[0] / params[1]; } extern "C" { PHPCPP_EXPORT void *get_module() { static Php::Extension extension("helloworld", "1.0.0"); extension.add<myDiv>("myDiv", { Php::ByVal("a", Php::Type::Numeric, true), Php::ByVal("b", Php::Type::Numeric, true) }); return extension; } }
测试:测试
echo myDiv(3,2); echo myDiv(3,0);
void myDivTest(){ try{ Php::call("myDiv", 3,2); Php::call("myDiv", 3,0); }catch(Php::Exception &e){ Php::out << "Division by zero" << std::endl; } }
和PHP里的捕获异常很相似。可是目前还不知道怎么打印输出e
里面的内容。spa
Php :: Value类是对PHP变量zval的封装,使用的时候能够无缝在C++变量与PHP变量里自动转换。code
下面还列出一些特殊的PHP变量:orm
Php::Value 申明数组 Php::Object 申明对象 Php::GLOBALS PHP全局变量
示例:对象
// create a regular array Php::Value array; array[0] = "apple"; array[1] = "banana"; array[2] = "tomato"; // create empty object of type stdClass Php::Object object; object = Php::Object("DateTime", "now"); // methods can be called with the call() method Php::out << object.call("format", "Y-m-d H:i:s") << std::endl; // set a global PHP variable Php::GLOBALS["a"] = 12345; // global variables can be of any type Php::GLOBALS["b"] = Php::Array({1,2,3,4});
定义常量很简单:blog
#include <phpcpp.h> extern "C" { PHPCPP_EXPORT void *get_module() { static Php::Extension myExtension("helloworld", "1.0"); // add integer constants myExtension.add(Php::Constant("MY_CONSTANT_1", 1)); myExtension.add(Php::Constant("MY_CONSTANT_2", 2)); // floating point constants myExtension.add(Php::Constant("MY_CONSTANT_3", 3.1415927)); myExtension.add(Php::Constant("MY_CONSTANT_4", 4.932843)); // string constants myExtension.add(Php::Constant("MY_CONSTANT_5", "This is a constant value")); myExtension.add(Php::Constant("MY_CONSTANT_6", "Another constant value")); // null constants myExtension.add(Php::Constant("MY_CONSTANT_7", nullptr)); // return the extension return myExtension; } }
在PHP脚本中使用常量一样简单:
<?php echo(MY_CONSTANT_1."\n"); echo(MY_CONSTANT_2."\n"); echo(MY_CONSTANT_3."\n"); echo(MY_CONSTANT_4."\n"); echo(MY_CONSTANT_5."\n"); echo(MY_CONSTANT_6."\n"); echo(MY_CONSTANT_7."\n");
#include <phpcpp.h> class Dummy : public Php::Base { }; extern "C" { PHPCPP_EXPORT void *get_module() { static Php::Extension myExtension("helloworld", "1.0"); // create a class objects Php::Class<Dummy> dummy("Dummy"); // 有不少种方式添加类常量,但实现效果同样 dummy.property("MY_CONSTANT_1", 1, Php::Const); dummy.property("MY_CONSTANT_2", "abcd", Php::Const); dummy.constant("MY_CONSTANT_3", "xyz"); dummy.constant("MY_CONSTANT_4", 3.1415); dummy.add(Php::Constant("MY_CONSTANT_5", "constant string")); dummy.add(Php::Constant("MY_CONSTANT_5", true)); // add the class to the extension myExtension.add(std::move(dummy)); // return the extension return myExtension; } }
若是要在运行时从C++代码中找出用户空间常量的值,或者想要知道是否认义了常量,能够简单地使用Php::constant()
或Php::defined()
函数。
要在运行时定义常量,请使用Php::define()
。
#include <phpcpp.h> void example_function() { // check if a certain user space constant is defined if (Php::defined("USER_SPACE_CONSTANT")) { // retrieve the value of a constant Php::Value constant = Php::constant("ANOTHER_CONSTANT"); // define other constants at runtime Php::define("DYNAMIC_CONSTANT", 12345); } } extern "C" { PHPCPP_EXPORT void *get_module() { static Php::Extension myExtension("helloworld", "1.0"); // add a function to the extension extension.add("example_function", example_function); // return the extension return myExtension; } }
(未完待续~fhyblog)