本篇文章給大家分享的內容是PHP擴充開發之開發我們自己的介面類,有著一定的參考價值,有需要的朋友可以參考一下
PHP擴充是進階PHP程式員必須瞭解的技能之一,對於一個初入門的PHP擴充開發人員,怎麼才能開發一個成熟的擴充,進入PHP開發的進階領域呢?本系列開發教程將手把手帶您從入門進入進階階段。
本教程系列在linux下面開發(推薦使用centos),php版本用的是5.6,並假設您有一定的linux操作經驗和c/c++基礎。
有問題需要溝通的朋友請加QQ技術交流群32550793和我溝通。
上一章示範了如何在PHP擴充中匯出普通函數,本章介紹怎麼樣在擴充中匯出類。使得PHP能夠在指令碼中直接存取擴充中的C++類。
一、如何在PHP擴充中匯出C++類
下面是使用PHP-CPP開發的一個擴充骨架代碼,編譯可以匯出一個示範C++類。
工程的源碼見github,可以用git用戶端下或者開啟網址打包下載。
# git clone https://github.com/elvisszhang/phpcpp_counter.git
現在我們的類名是 Counter, 擴充裡面註冊類的文法是這樣子的
Php::Class<Counter> counter("Counter");
Counter類裡面有個函數叫 increment,通過下面文法告訴擴充讓php指令碼能訪問這個函數。
counter.method<&Counter::increment> ("increment");
main.cpp 的C++源碼如下。
#include <phpcpp.h>#include <time.h>//擴充的匯出類 Counterclass Counter : public Php::Base{private: int _value = 0;public: Counter() = default; virtual ~Counter() = default; //類的普通成員函數 Php::Value increment() { return ++_value; } Php::Value decrement() { return --_value; } Php::Value value() const { return _value; } //類的靜態成員函數 static Php::Value gettime() {return time();}};//告訴編譯器get_module是個純C函數extern "C" { //get_module是擴充的入口函數 PHPCPP_EXPORT void *get_module() { static Php::Extension myExtension("counter", "1.0.0"); //初始化匯出類 Php::Class<Counter> counter("Counter"); //註冊匯出類的可訪問普通函數 counter.method<&Counter::increment> ("increment"); counter.method<&Counter::decrement> ("decrement"); counter.method<&Counter::value> ("value"); //註冊匯出類的可訪問靜態函數 counter.method<&Counter::gettime>("gettime"); //註冊匯出類,使用右值引用方式,最佳化資源使用 myExtension.add(std::move(counter)); //返回擴充項物件指標 return myExtension; }}
對應上述例子的php測試代碼如下。
<?php$counter = new Counter;echo 'result of increment() = '. $counter->increment() . PHP_EOL;echo 'result of increment() = '. $counter->increment() . PHP_EOL;echo 'result of decrement() = '. $counter->decrement() . PHP_EOL;echo 'result of value() = '. $counter->value() . PHP_EOL;echo 'result of gettime() = '. Counter::gettime() . PHP_EOL;?>
上述php代碼運行後的輸出資訊如下。
result of increment() = 1result of increment() = 2result of decrement() = 1result of value() = 1result of gettime() = 1523363778
二、擴充類的普通函數支援的樣式
擴充類的函數,必須按照一定的規範來寫,傳回值和參數的名稱、類型都是有規定。否則就不能被PHP指令碼認識。
最常見的是下面4種函數樣式,跟上一章的普通函數的樣式其實差不多,傳回值和參數的用法也完全一樣,所以就不再多說。
// signatures of supported regular methodsvoid YourClass::example1();void YourClass::example2(Php::Parameters ¶ms);Php::Value YourClass::example3();Php::Value YourClass::example4(Php::Parameters ¶ms);
另外函數如果帶上修飾符 const。還有下面4種變化的樣式。
void YourClass::example5() const;void YourClass::example6(Php::Parameters ¶ms) const;Php::Value YourClass::example7() const;Php::Value YourClass::example8(Php::Parameters ¶ms) const;
三、參考文獻
PHP-CPP協助:classes-and-objects
PHP擴充是進階PHP程式員必須瞭解的技能之一,對於一個初入門的PHP擴充開發人員,怎麼才能開發一個成熟的擴充,進入PHP開發的進階領域呢?本系列開發教程將手把手帶您從入門進入進階階段。
本教程系列在linux下面開發(推薦使用centos),php版本用的是5.6,並假設您有一定的linux操作經驗和c/c++基礎。
有問題需要溝通的朋友請加QQ技術交流群32550793和我溝通。
上一章示範了如何在PHP擴充中匯出普通函數,本章介紹怎麼樣在擴充中匯出類。使得PHP能夠在指令碼中直接存取擴充中的C++類。