C++ 開發 PHP 7 擴充套件之原生常量定義

zendapi發表於2019-02-16

大家如果經常閱讀 PHP 官方手冊的話會發現,在擴充套件那一章裡面的每個擴充套件的介紹的時候,都有一節是 Predefined Constants 預定義常量,這些常量是不需要您在 PHP 裡面進行定義就可以使用的。

比如 Mysqli 擴充套件的 Predefined Constants http://php.net/manual/en/mysqli.constants.php

那麼我們必須也在我們 hellozapi 擴充套件中也定義幾個常量玩玩啊,其實真的很簡單,不信?那我們們走著看。

回到我們上節介紹的定義專案入口程式碼:

#include "zapi/ZendApi.h"

extern "C" {

ZAPI_DECL_EXPORT void *get_module() 
{
   static zapi::lang::Extension hellozapi("hellozapi", "1.0");
   return hellozapi;
}

}

我們們定義如下幾個常量:(不要太糾結實際意義,哈哈,本身我們的這個擴充套件都是臆想出來的)

  1. HELLO_ZAPI_VERSION (int)
  2. HELLO_ZAPI_NAME (string)
  3. HELLO_DEBUG_MODE (bool)
  4. HELLO_ZAPI_PI (double)

zendAPI 常量描述類簡單介紹

zendAPI 裡面我們使用 zapi::lang::Constant 來描述一個常量的元資訊,使用起來很簡單,他的建構函式接受兩個引數,第一個引數是常量名稱,第二個引數是常量的值。例如我們使用下面程式碼去定義一個 ROOT_DIR 常量, 常量值是 /srv/www

using zapi::lang::Constant;
Constant dirConst("ROOT_DIR", "/srv/www");

zapi::lang::Constant API 手冊參考

現在大家學習完背景知識,讓我們擼起袖子寫程式碼吧。

C++ Code
#include "zapi/ZendApi.h"

using zapi::lang::Constant;

extern "C" {

ZAPI_DECL_EXPORT void *get_module() 
{
   static zapi::lang::Extension hellozapi("hellozapi", "1.0");
   Constant hellozapiVersionConst("HELLO_ZAPI_VERSION", 0x010002);
   Constant hellozapiNameConst("HELLO_ZAPI_NAME", "Hello zendAPI!");
   Constant helloDebugModeConst("HELLO_DEBUG_MODE", true);
   Constant helloPiConst("HELLO_ZAPI_PI", 3.14);
   hellozapi.registerConstant(std::move(hellozapiVersionConst));
   hellozapi.registerConstant(std::move(hellozapiNameConst));
   hellozapi.registerConstant(std::move(helloDebugModeConst));
   hellozapi.registerConstant(std::move(helloPiConst));
   return hellozapi;
}

}

如果您對 std::move 感到陌生,您可以閱讀 cpp reference 手冊

std::move 使用者手冊

怎麼樣,就這麼幾行,我們們的預定義常量就算定義好了,現在當執行我們 PHP 指令碼的時候就可以直接使用了。

PHP Code
if (defined("HELLO_ZAPI_VERSION")) {
    echo HELLO_ZAPI_VERSION;
}
echo "
";
if (defined("HELLO_ZAPI_NAME")) {
    echo HELLO_ZAPI_NAME;
}
echo "
";
if (defined("HELLO_DEBUG_MODE")) {
    if (HELLO_DEBUG_MODE) {
        echo "true";
    } else {
        echo "false";
    }
}
echo "
";
if (defined("HELLO_ZAPI_PI")) {
    echo HELLO_ZAPI_PI;
}
// you will get
// 65538
// Hello zendAPI!
// true
// 3.14

好了,到這裡我們就把預定義常量就講完了,我沒有騙您吧,真的很簡單,稍作調整讓我們繼續前進!

原文閱讀:聽說每個擴充套件都會定義自己常量,不要擔心我們也行

相關文章