国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP-X 系列教程:擴展內定義類和對象

cpupro / 1161人閱讀

摘要:接著上一篇文章,本文開始在擴展內實現類的定義和對象操作。因此定義類,需要在的回調中進行。使用類名方法名即可。連接成功連接失敗在中不僅可以創建擴展內置的類,還可以創建代碼定義的類。

接著上一篇文章,本文開始在擴展內實現類的定義和對象操作。基于PHP-X提供的封裝,使用C++語言可以輕松地實現一個PHP的類,還可以在C++代碼中創建任意PHP對象,調用對象方法、讀寫對象的屬性。

0x00 定義 PHP 類

底層Zend API有一個限制,定義函數必須在模塊初始化之前,定義類必須在模塊初始化之后。因此定義類,需要在ExtensiononStart回調中進行。

new Class 表示創建一個新的PHP類,參數為類的名稱

調用Class對象的addMethod來添加方法,其中PHPX_ME(CppClass, test2),這里PHPX_ME是一個宏,展開是方法的名稱和函數指針,第二個參數是方法的修飾符,可以是STATICPROTECTEDABSTRACT等。可以使用按位或操作符設置多個修飾符,如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 實現類方法

方法與屬性、常量不同,屬性、常量添加后不需要再進行額外的操作。類方法,需要編寫實際的邏輯代碼。

使用PHPX_METHOD(類名, 方法名)即可。注意方法實現的代碼必須在addMethod之前。

PHPX_FUNCTION函數相同,PHPX_METHOD也有argsretval兩個參數,分別用于處理PHP方法調用的參數和返回值。不同的是PHPX_METHOD多了一個_this對象,相當于PHP代碼中的$this注意如果是靜態方法_thisnull

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函數獲取類常量。

auto value = constant("CppClass::VERSION");
var_dump(value); //輸出 1.9.0
0x04 編譯
make install
0x05 運行
$o = new CppClass();
$o->test1();
0x06 創建 PHP 對象

PHP-X的擴展中還可以創建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函數相當于PHPnew語法,第一個參數為類名,從第二個參數開始為變長,是構造方法的參數,如newObject("test", 123, 456, "hello"),相當于new test(123, 456, "hello")。創建的對象在C++里類型為Object

調用exec函數可執行對象的方法,如redis.exec("connect", "127.0.0.1", 6379),就相當于是$redis->connect("127.0.0.1", 6379)。執行后返回方法調用的結果。

可以判斷結果是否為true,來驗證連接是否正確建立。

if (ret1.toBool()) {
    //連接成功
} else {
    //連接失敗
}

PHP-X中不僅可以創建PHP擴展內置的類,還可以創建PHP代碼定義的類。

include("/data/webroot/Test.class.php");
Object testObj = newObject("Test", 123, 456, "hello");

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25914.html

相關文章

  • PHP-X 系列教程:內置函數的使用

    摘要:本文主要介紹內置函數的使用,在擴展開發中,會經常用到這些內置函數,的封裝,使得調用這些函數像代碼一樣簡單。的使用方法與語言的是完全一致的。包括的超全局變量和其他代碼使用關鍵詞聲明的全局變量。 本文主要介紹PHP-X內置函數的使用,在PHP擴展開發中,會經常用到這些內置函數,PHP-X的封裝,使得調用這些函數像PHP代碼一樣簡單。 echo 在擴展中需要輸出一些內容,可以使用echo函數...

    _Zhao 評論0 收藏0
  • PHP擴展開發教程1 - 相關開發技術對比及介紹

    摘要:四使用語言開發是我重點推薦的擴展開發框架,簡明易懂,功能強大,開發效率高,代碼易維護,執行速度快。優點三支持,的擴展開發有兩套擴展開發框架,分別支持,,雖然框架代碼有兩個,但是接口卻是一樣的。 PHP擴展是高級PHP程序員必須了解的技能之一,對于一個初入門的PHP擴展開發者,怎么才能開發一個成熟的擴展,進入PHP開發的高級領域呢?本系列開發教程將手把手帶您從入門進入高級階段。本教程系列...

    alaege 評論0 收藏0
  • 如何基于 PHP-X 快速開發一個 PHP 擴展

    摘要:這里看到,表明你的擴展已經加載成功了,現在就可以調用這個擴展函數了。是不是很簡單更多上面的例子還比較簡單,只是編寫了一個擴展函數。 PHP-X是我在2017年年初創建的一個新項目。這個項目的目標就是讓有一定工作經驗的PHP程序都能夠具備擴展開發的能力。 0x00 初衷 從2012年開始編寫swoole,現在算來已經有5個年頭了。我發現編寫一個 PHP 擴展這個工作非常艱難。PHP 程序...

    callmewhy 評論0 收藏0
  • 我為什么要做 zendAPI 項目

    摘要:總得來說,從大三開始到入職奇虎這年,一直處于自己探索階段,各種折騰,浪費了不少青春,收獲總得來說不是很大。入職奇虎之后,有了一份穩定的工作,從此一天當作兩天來用,惡補我之前浪費的青春。 經過緊張的開發,我終于費了九牛二虎之力將 zendAPI 的項目官網做好上線了,眨眼已經入職奇虎一年了,我也走完了我的職業生涯規劃的第一年,別問我之前4年干啥去了,我去瀟灑了 (拉著幾個大學同學創業去了...

    MyFaith 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<