摘要:接著上一篇文章,本文開始在擴展內實現(xiàn)類的定義和對象操作。因此定義類,需要在的回調中進行。使用類名方法名即可。連接成功連接失敗在中不僅可以創(chuàng)建擴展內置的類,還可以創(chuàng)建代碼定義的類。
接著上一篇文章,本文開始在擴展內實現(xiàn)類的定義和對象操作?;?b>PHP-X提供的封裝,使用C++語言可以輕松地實現(xiàn)一個PHP的類,還可以在C++代碼中創(chuàng)建任意PHP對象,調用對象方法、讀寫對象的屬性。
0x00 定義 PHP 類底層Zend API有一個限制,定義函數(shù)必須在模塊初始化之前,定義類必須在模塊初始化之后。因此定義類,需要在Extension的onStart回調中進行。
new Class 表示創(chuàng)建一個新的PHP類,參數(shù)為類的名稱
調用Class對象的addMethod來添加方法,其中PHPX_ME(CppClass, test2),這里PHPX_ME是一個宏,展開是方法的名稱和函數(shù)指針,第二個參數(shù)是方法的修飾符,可以是STATIC、PROTECTED、ABSTRACT等??梢允褂冒次换虿僮鞣O置多個修飾符,如STATIC | PUBLIC
調用Class對象的addProperty添加屬性
調用Class對象的addConstant添加類常量
PHPX_EXTENSION() { Extension *ext = new Extension("test", "0.0.1"); ext->onStart = [ext] { Class *c = new Class("CppClass"); //注冊構造方法 c->addMethod(PHPX_ME(CppClass, __construct), CONSTRUCT); //普通方法 c->addMethod(PHPX_ME(CppClass, test1)); //普通方法 c->addMethod(PHPX_ME(CppClass, test2), STATIC); //添加默認屬性 c->addProperty("age", 30); //添加常量 c->addConstant("VERSION", "1.9.0"); //注冊類 ext->registerClass(c); }; return ext; }0x01 實現(xiàn)類方法
方法與屬性、常量不同,屬性、常量添加后不需要再進行額外的操作。類方法,需要編寫實際的邏輯代碼。
使用PHPX_METHOD(類名, 方法名)即可。注意方法實現(xiàn)的代碼必須在addMethod之前。
與PHPX_FUNCTION函數(shù)相同,PHPX_METHOD也有args和retval兩個參數(shù),分別用于處理PHP方法調用的參數(shù)和返回值。不同的是PHPX_METHOD多了一個_this對象,相當于PHP代碼中的$this。注意如果是靜態(tài)方法_this為null
PHPX_METHOD(CppClass, __construct) { echo("%s _construct ", _this.getClassName().c_str()); Array array; array.append(1234); _this.set("name", array); } PHPX_METHOD(CppClass, test1) { //讀取全局變量 Variant server = global("_SERVER"); var_dump(server); if (server.isArray()) { Variant shell = Array(server)["SHELL"]; var_dump(shell); } auto name = _this.get("name"); var_dump(name); }0x02 讀寫屬性
調用_this.get(property_name)讀取對象屬性的值
調用_this.set(property_name, value)設置對象屬性的值
0x03 讀取類常量使用constant函數(shù)獲取類常量。
auto value = constant("CppClass::VERSION"); var_dump(value); //輸出 1.9.00x04 編譯
make install0x05 運行
$o = new CppClass(); $o->test1();0x06 創(chuàng)建 PHP 對象
在PHP-X的擴展中還可以創(chuàng)建PHP對象,與PHP交互操作。
Object redis = newObject("redis"); //連接 Redis auto ret1 = redis.exec("connect", "127.0.0.1", 6379); //Get Key auto ret2 = redis.exec("get", "key"); //打印字符串 echo ("value=%s ", ret2.toCString());
newObject函數(shù)相當于PHP的new語法,第一個參數(shù)為類名,從第二個參數(shù)開始為變長,是構造方法的參數(shù),如newObject("test", 123, 456, "hello"),相當于new test(123, 456, "hello")。創(chuàng)建的對象在C++里類型為Object。
調用exec函數(shù)可執(zhí)行對象的方法,如redis.exec("connect", "127.0.0.1", 6379),就相當于是$redis->connect("127.0.0.1", 6379)。執(zhí)行后返回方法調用的結果。
可以判斷結果是否為true,來驗證連接是否正確建立。
if (ret1.toBool()) { //連接成功 } else { //連接失敗 }
在PHP-X中不僅可以創(chuàng)建PHP擴展內置的類,還可以創(chuàng)建PHP代碼定義的類。
include("/data/webroot/Test.class.php"); Object testObj = newObject("Test", 123, 456, "hello");
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/25914.html
摘要:本文主要介紹內置函數(shù)的使用,在擴展開發(fā)中,會經(jīng)常用到這些內置函數(shù),的封裝,使得調用這些函數(shù)像代碼一樣簡單。的使用方法與語言的是完全一致的。包括的超全局變量和其他代碼使用關鍵詞聲明的全局變量。 本文主要介紹PHP-X內置函數(shù)的使用,在PHP擴展開發(fā)中,會經(jīng)常用到這些內置函數(shù),PHP-X的封裝,使得調用這些函數(shù)像PHP代碼一樣簡單。 echo 在擴展中需要輸出一些內容,可以使用echo函數(shù)...
摘要:四使用語言開發(fā)是我重點推薦的擴展開發(fā)框架,簡明易懂,功能強大,開發(fā)效率高,代碼易維護,執(zhí)行速度快。優(yōu)點三支持,的擴展開發(fā)有兩套擴展開發(fā)框架,分別支持,,雖然框架代碼有兩個,但是接口卻是一樣的。 PHP擴展是高級PHP程序員必須了解的技能之一,對于一個初入門的PHP擴展開發(fā)者,怎么才能開發(fā)一個成熟的擴展,進入PHP開發(fā)的高級領域呢?本系列開發(fā)教程將手把手帶您從入門進入高級階段。本教程系列...
摘要:這里看到,表明你的擴展已經(jīng)加載成功了,現(xiàn)在就可以調用這個擴展函數(shù)了。是不是很簡單更多上面的例子還比較簡單,只是編寫了一個擴展函數(shù)。 PHP-X是我在2017年年初創(chuàng)建的一個新項目。這個項目的目標就是讓有一定工作經(jīng)驗的PHP程序都能夠具備擴展開發(fā)的能力。 0x00 初衷 從2012年開始編寫swoole,現(xiàn)在算來已經(jīng)有5個年頭了。我發(fā)現(xiàn)編寫一個 PHP 擴展這個工作非常艱難。PHP 程序...
摘要:總得來說,從大三開始到入職奇虎這年,一直處于自己探索階段,各種折騰,浪費了不少青春,收獲總得來說不是很大。入職奇虎之后,有了一份穩(wěn)定的工作,從此一天當作兩天來用,惡補我之前浪費的青春。 經(jīng)過緊張的開發(fā),我終于費了九牛二虎之力將 zendAPI 的項目官網(wǎng)做好上線了,眨眼已經(jīng)入職奇虎一年了,我也走完了我的職業(yè)生涯規(guī)劃的第一年,別問我之前4年干啥去了,我去瀟灑了 (拉著幾個大學同學創(chuàng)業(yè)去了...
閱讀 2771·2021-11-24 09:39
閱讀 1659·2021-09-28 09:35
閱讀 1133·2021-09-06 15:02
閱讀 1333·2021-07-25 21:37
閱讀 2744·2019-08-30 15:53
閱讀 3659·2019-08-30 14:07
閱讀 727·2019-08-30 11:07
閱讀 3533·2019-08-29 18:36