【问题标题】:PHP 7.2 strange in_array behaviourPHP 7.2 奇怪的 in_array 行为
【发布时间】:2018-09-27 08:28:09
【问题描述】:

我从php 5升级到7.2,本地没有问题(需要一些更改,但已经解决了)。

我的一个功能在生产服务器中不起作用。 代码如下所示:

$someBool = in_array($some, array("asd", "fgh", "etc"));

如果我对此进行 var_dump,结果为 UNKNOWN:0,但如果我在此下方进行 var_dump(在转储之前没有任何 if 站),则该函数正常工作,结束转储结果将为 bool (true) 或 bool (false)。

(我没有覆盖这个变量)

如果我再次注释 var_dump 行,该函数将无法正常工作。

有人知道什么会导致这种行为吗? 谢谢你的帮助。

在原函数中:

$needCmdText = in_array($fieldName,array(
        'cmdpreid','cmdpostid','cmdskipid',
        'cmdfixid','cmdexpid','cmdsysid'
    ));

$fieldName 总是来自客户端的“cmdexpid”。 (在我的测试用例中) 还有一个有趣的消息,一个简单的 echo 也解决了这个问题,但应该是在这个下。

【问题讨论】:

  • 该问题缺少如何产生“结果”的代码。您是否希望我们在您不分享的情况下知道您的代码?我们不知道 UNKNOWN:0 可能来自什么。还说 var_dump() 改变了你其他代码的行为是 99.9999% 错误
  • 代码很简单,没有什么神奇之处。我简单地调用了 in_array,它不返回 bool。
  • 它对我有用:3v4l.org/NhnQH [no $some] 3v4l.org/HCKoQ [with $some] 所以肯定有一些不同的东西。
  • 如果我没有看到,我也不会相信,但我只是取消注释并评论 var_dump,这会使结果有所不同。如果在 var_dump 和 in_array 之间有更多行(如果),则 var_dump 结果 UNKNOWN:0,这是 in_array 的结果。由于 var 转储,某些行为会发生变化,这是肯定的。
  • 那么您最终会展示您的代码有效和无效的代码吗? 如果我们不知道您写了什么,我们应该如何帮助您?

标签: php php-7.2


【解决方案1】:

我将 php 7.2 更改为 7.1,无需更改任何代码即可解决问题。 (无需转储,自行解决)。

我认为php 7.2 中有一个奇怪的错误,在windows 环境中不会发生。

【讨论】:

  • 我怀疑是否存在错误。您没有发布任何相关代码 - 即,您如何获得 $fieldName 的值。降级不是解决办法。认为它不会发生@Windows 不是解决方案。你有一个小鬼潜伏,它会再次咬你。
  • $fieldName 是来自数组的字符串,为什么仅仅因为我取消注释 var_dump 就改变它?废话,我写了所有需要的信息, in_array 不应该返回 UNKNOWN:0 (所以它没有按预期返回 bool ,也没有引发任何异常或错误/警告。但可以肯定的是,没有任何错误php7.2.我在任何开发环境都无法重现这个问题,这就是为什么你也无法重现。生产使用debian,开发是在windows下使用xampp,第二个工作正常。我能想象的是这是一个奇怪的编码错误。
  • 可悲的是,在 windows 上开发然后在 debian 上部署必然会产生生产错误。最好的做法是让你的开发人员。环境等于部署环境,这就是存在vagrant 之类的工具的原因。我不会试图猜测发生了什么,错误看起来像是来自xdebug。你是在 Debian 上编译 php 还是从 repo 安装它?
  • 我从 repo 安装,xdebug 没有运行。
猜你喜欢
  • 2011-02-13
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 2013-08-09
  • 2021-11-21
  • 2018-05-20
  • 2012-01-07
相关资源
最近更新 更多