PHP 7.2.25 错误!= 错误?

标签 php swig

谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。

<?php
echo "phpversion() == " . phpversion() . "\n\n";

var_dump(FALSE);
var_dump(False);
var_dump(false);

echo "\n";
echo "(FALSE === false) == " . ((FALSE === false) ? "true" : "false") . "\n";
echo "(((bool)FALSE) === false) == " . ((((bool)FALSE) === false) ? "true" : "false") . "\n";
?>

我得到这个输出:
phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108445

int(0)
bool(false)
bool(false)

(FALSE === false) == false
(((bool)FALSE) === false) == true

我关心的原因是 fopen() 的文档说它返回 FALSE失败。但是,至少在这个 PHP 版本中,它返回了 false ,所以我的 if ($fh === FALSE)检查失败,让我觉得 fopen()成功了,即使它肯定失败了。

我的 friend 正在运行一个不同的版本(Ubuntu 上的 PHP 7.2.24),在那里,FALSE === false。如果 FALSE != false,我认为任何地方的一切都会爆炸,所以……到底是怎么回事?

最佳答案

为了上帝的爱,对我、我的问题以及我做过的一切投反对票。我还没有找出原因,但它在我自己构建的两个 PHP 扩展之一中:删除它们,它按预期工作:

phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108445

bool(false)
bool(false)
bool(false)

(FALSE === false) == true
(((bool)FALSE) === false) == true

我可能会添加有关我如何设法重新定义 的详细信息错误 在 PHP 扩展中;取决于他们有多尴尬。

编辑:我仍在查看细节,但简短的版本是,我使用 SWIG 在 libmodbus 周围构建了一个包装器,及其 src/modbus.h已:
#ifndef FALSE
#define FALSE 0
#endif

...这并非不合理,但我懒惰地包含了 libmodbus 中的“所有内容”,而不是指定我想公开的单个函数,我猜这就是 FALSE 进入那里的原因。 (但是,作为 PHP 扩展部署的结果 .so 似乎不包含名称中带有 FALSE 的符号,所以......我仍在寻找。)

编辑 2:是的,只要有一个 #define在您的 SWIG .i 中足以让 SWIG 将其定义为在 PHP 中使用的常量。 (这是有道理的。)

顺便说一下SWIG documentation的部分这可能让我有点错误(让我告诉 SWIG 包含所有 libmodbus 的头文件而不是指定每个函数)是 “真正懒惰的人的 SWIG。” 看,当我看到一个看起来像这样写的部分时 对我来说,这就是我正在阅读的内容。

关于PHP 7.2.25 错误!= 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59187021/

相关文章:

php - 无法连接到 MySql 服务器(错误)

php - 制作讨论区,如何让更多人回答

来自 C++ 的 Python 回调

php - 使用 SWIG 创建 PHP C/C++ 扩展模块

php - FedEx express 网络服务 (SOAP) : Pickup Service

php - 使用 $_POST 时服务器响应为空

php - 如何从 ODBC 查询中转义单引号

c++ - 痛饮 : How to typemap two fields of a struct?

ruby - 如何在 GDAL ruby​​ 绑定(bind)中显式关闭数据集?

c++ - SWIG接口(interface)文件怎么写?