谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。
<?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/