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

接着上一篇文章,本文開始在擴展內實現類的定義和對象操做。基於PHP-X提供的封裝,使用C++語言能夠輕鬆地實現一個PHP的類,還能夠在C++代碼中建立任意PHP對象,調用對象方法、讀寫對象的屬性。php

0x00 定義 PHP 類

底層Zend API有一個限制,定義函數必須在模塊初始化以前,定義類必須在模塊初始化以後。所以定義類,須要在ExtensiononStart回調中進行。web

  • 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 實現類方法

方法與屬性、常量不一樣,屬性、常量添加後不須要再進行額外的操做。類方法,須要編寫實際的邏輯代碼。redis

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

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

PHPX_METHOD(CppClass, __construct)
{
    echo("%s _construct\n", _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交互操做。this

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\n", 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)。執行後返回方法調用的結果。code

能夠判斷結果是否爲true,來驗證鏈接是否正確創建。server

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

PHP-X中不只能夠建立PHP擴展內置的類,還能夠建立PHP代碼定義的類。

include("/data/webroot/Test.class.php");
Object testObj = newObject("Test", 123, 456, "hello");
相關文章
相關標籤/搜索