【问题标题】:PHP internals - getting a boolean argumentPHP 内部 - 获取布尔参数
【发布时间】:2016-01-07 15:54:41
【问题描述】:

在编写和查看一些 PHP 扩展的源代码时,我注意到有些使用 LONG 类型标志来解析布尔参数:

bool new_map_embed;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &new_map_embed) == FAILURE) {
    RETURN_FALSE;
}

这是为什么呢?为什么不使用b 标志呢?

【问题讨论】:

    标签: php php-internals


    【解决方案1】:

    很可能是程序员犯了一个错误(也许他们不知道b 的存在?),或者参数实际上不是布尔值(可能接受其他值)。这不是常见的做法。

    在 PHP 5 中,IS_BOOL 将其值存储在与 IS_LONG 相同的位置,因此您可能会认为应该在此处使用 l

    【讨论】:

      【解决方案2】:

      你可以使用类似的东西:

      zend_bool new_map_embed;
      
      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &new_map_embed) == FAILURE) {
          RETURN_FALSE;
      }
      

      请查看zend_builtin_functions.c文件中的实例,然后搜索zend_bool,你会看到PHP是如何使用它的。

      【讨论】:

      • 我知道我可以使用b 我的问题是为什么解析只要l 是一种常见的做法
      • @ShlomiHassid 为什么你认为这是常见的做法?不是。
      • @Nikic 我看到它越来越多,只是想知道为什么,这是一个好习惯
      • zend_bool 是 unsigned char (zend_types.h: typedef unsigned char zend_bool;) 当你使用 long 时,你无意中传递了 4 个连续字符的地址。在 api 内部,这被视为连续字符,而不失一般性。您可以通过更改 new_map_embed=0xffffff0 的值(假设 long=4 字节)进行验证,您会发现在调用 zend_parse_parameters 后,只有 lsb 的值发生变化,其余值保持不变。而且如果 php core 没有使用它,所以我认为它不是正确的做法。
      猜你喜欢
      • 2013-03-11
      • 2023-03-13
      • 2013-07-19
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多