PHP-CPP開發擴充套件(六)
阿新 • • 發佈:2018-12-10
PHP-CPP是一個用於開發PHP擴充套件的C++庫。本節講解在C++中PHP異常、變數、常量的實現相關知識。
異常
PHP和C++都支援異常,而PHP-CPP庫這兩種語言之間的異常處理是完全透明的。你在C++中丟擲的異常會自動傳遞給PHP指令碼,並且你的C++程式碼可以捕獲PHP指令碼丟擲的異常,就像它是普通的C++異常一樣。
遺憾的是,PHP-CPP目前僅支援PHP標準異常Exception
,還不支援自定義異常。
丟擲異常
示例:
#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
裡面的內容。
變數
Php :: Value類是對PHP變數zval的封裝,使用的時候可以無縫在C++變數與PHP變數裡自動轉換。
下面還列出一些特殊的PHP變數:
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});
常量
定義常量很簡單:
#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)