PHP 7.2.25否!=假?

时间:2019-12-05 01:43:18

标签: 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()成功了,即使它肯定失败了。

我的朋友正在运行其他版本(在Ubuntu上为PHP 7.2.24),在那里,FALSE === false。我假设FALSE != false到处都会爆炸,所以...到底发生了什么?

1 个答案:

答案 0 :(得分:5)

为了上帝的爱,否决了我,我的问题以及我曾经做过的一切。我还没有找到原因,但是这是我自己构建的两个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扩展中重新定义 FALSE 的详细信息;取决于他们有多尴尬。

编辑:我仍在查看详细信息,但简短的版本是,我使用SWIG在libmodbus周围构建了一个包装器,其src/modbus.h具有:

#ifndef FALSE
#define FALSE 0
#endif

...这不是没有道理的,但是我懒洋洋地将libmodbus中的“所有内容”包括在内,而不是指定我想公开的单个功能,我猜测这就是FALSE进入的方式。 (但是,作为PHP扩展部署的结果.so似乎不包含名称中带有FALSE的符号,所以...我仍在寻找。)

编辑2:是的,仅在SWIG .i中包含#define就足以让SWIG将其定义为PHP中的常量。 (这有道理。)

顺便说一句,{em> 可能会误导我的SWIG documentation部分(让我告诉SWIG包括所有libmodbus头文件,而不是指定每个函数)是“真正懒惰的SWIG。” 看,当我看到一段看起来像是为为我写的内容时, 这就是我正在阅读的内容。