有人可以解释吗?我认为我正在做一些令人难以置信的事情,并热切地等待着启蒙。
<?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
到处都会爆炸,所以...到底发生了什么?
答案 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。” 看,当我看到一段看起来像是为为我写的内容时, 这就是我正在阅读的内容。