查看: 373|回复: 0

[PHP学习] C++ 开发 PHP 7 扩展之原生常量定义

发表于 2017-10-11 08:00:05
尚学堂AD

大家如果经常阅读 PHP 官方手册的话会发现,在扩展那一章里面的每个扩展的介绍的时候,都有一节是 Predefined Constants 预定义常量,这些常量是不需要您在 PHP 里面进行定义就可以使用的。

比如 Mysqli 扩展的 Predefined Constants http://php.net/manual/en/mysqli.constants.php

那么我们必须也在我们 hellozapi 扩展中也定义几个常量玩玩啊,其实真的很简单,不信?那咱们走着看。

回到我们上节介绍的定义项目入口代码:

  1. #include "zapi/ZendApi.h"
  2. extern "C" {
  3. ZAPI_DECL_EXPORT void *get_module()
  4. {
  5. static zapi::lang::Extension hellozapi("hellozapi", "1.0");
  6. return hellozapi;
  7. }
  8. }
复制代码

咱们定义如下几个常量:(不要太纠结实际意义,哈哈,本身我们的这个扩展都是臆想出来的)

HELLO_ZAPI_VERSION (int) HELLO_ZAPI_NAME (string) HELLO_DEBUG_MODE (bool) HELLO_ZAPI_PI (double) zendAPI 常量描述类简单介绍

在 zendAPI 里面我们使用 zapi::lang::Constant 来描述一个常量的元信息,使用起来很简单,他的构造函数接受两个参数,第一个参数是常量名称,第二个参数是常量的值。例如我们使用下面代码去定义一个 ROOT_DIR 常量, 常量值是 /srv/www。

  1. using zapi::lang::Constant;
  2. Constant dirConst("ROOT_DIR", "/srv/www");
复制代码

zapi::lang::Constant API 手册参考

现在大家学习完背景知识,让我们撸起袖子写代码吧。

C++ Code
  1. #include "zapi/ZendApi.h"
  2. ?using zapi::lang::Constant;
  3. extern "C" {
  4. ZAPI_DECL_EXPORT void *get_module()
  5. {
  6. static zapi::lang::Extension hellozapi("hellozapi", "1.0");
  7. ?Constant hellozapiVersionConst("HELLO_ZAPI_VERSION", 0x010002);
  8. Constant hellozapiNameConst("HELLO_ZAPI_NAME", "Hello zendAPI!");
  9. Constant helloDebugModeConst("HELLO_DEBUG_MODE", true);
  10. Constant helloPiConst("HELLO_ZAPI_PI", 3.14);
  11. hellozapi.registerConstant(std::move(hellozapiVersionConst));
  12. hellozapi.registerConstant(std::move(hellozapiNameConst));
  13. hellozapi.registerConstant(std::move(helloDebugModeConst));
  14. hellozapi.registerConstant(std::move(helloPiConst));
  15. return hellozapi;
  16. }
  17. }
复制代码

如果您对 std::move 感到陌生,您可以阅读 cpp reference 手册

std::move 用户手册

怎么样,就这么几行,咱们的预定义常量就算定义好了,现在当执行我们 PHP 脚本的时候就可以直接使用了。

PHP Code
  1. if (defined("HELLO_ZAPI_VERSION")) {
  2. echo HELLO_ZAPI_VERSION;
  3. }
  4. echo "\n";
  5. if (defined("HELLO_ZAPI_NAME")) {
  6. echo HELLO_ZAPI_NAME;
  7. }
  8. echo "\n";
  9. if (defined("HELLO_DEBUG_MODE")) {
  10. if (HELLO_DEBUG_MODE) {
  11. echo "true";
  12. } else {
  13. echo "false";
  14. }
  15. }
  16. echo "\n";
  17. if (defined("HELLO_ZAPI_PI")) {
  18. echo HELLO_ZAPI_PI;
  19. }
  20. // you will get
  21. // ?65538
  22. // Hello zendAPI!
  23. // true
  24. // 3.14
复制代码

好了,到这里我们就把预定义常量就讲完了,我没有骗您吧,真的很简单,稍作调整让我们继续前进!

原文阅读:听说每个扩展都会定义自己常量,不要担心我们也行



回复

使用道具 举报