【问题标题】:Inexplicable type hinting in PHP codePHP代码中莫名其妙的类型提示
【发布时间】:2014-05-22 06:58:10
【问题描述】:

我正在分析一些在我没有完全访问权限的服务器上运行的 PHP 代码。我可以阅读phpinfo。代码似乎在服务器上运行良好。在我的本地环境中,我无法让代码运行,因为在使用类型提示调用某个方法时出现“可捕获的致命错误”。

someMethod(string $str) {
  // Do something...
}

错误内容如下:“传递给 ... 的参数 1 必须是 path\of\namespace\string 的实例,给定字符串 ...”。

字符串类没有 use 关键字,我也无法通过 grep 命令在开发环境的文件夹中找到任何内容。

是否有任何 PHP 模块、扩展可以使这种类型提示起作用?服务器和我的开发环境使用的是 PHP 5.4.25。

实时系统可能提供什么来使此类代码运行?它可能会使用其他一些基于 PHP 的编程语言,比如 Hack?其余的代码是相当直接的 PHP!

【问题讨论】:

  • PHP 不支持标量的类型提示,仅支持数组和对象....虽然 nikic 确实为此提供了代码作为 RFC 的一部分(因此有一个可用的补丁支持它) , 并且得到 Hack 的支持
  • @MarkBaker 他提到字符串来自命名空间。所以在这种情况下一般是可以的。
  • 我不相信保留字可以用作类名,即使有命名空间
  • @MarkBaker 我也没有,但显然它有效,很奇怪:codexon.codepad.org/fewDbnLN
  • 这里在黑暗中拍摄,但您可能在另一个命名空间中吗?通过尝试抛出异常,我经历了类似的事情。添加一个 \ 解决了这个问题: throw new \Exception(..);

标签: php type-hinting


【解决方案1】:

您提到代码中没有暗示“字符串”类的 use 语句或命名空间声明。代码是否使用自动加载器?

这里有两个可能的问题:

路径 - 实时环境可能设置了另一个路径,和/或正在通过此“其他路径”加载/搜索文件/类(在您的代码之外)可能正在看)。

错误处理 - 另一个可能的原因是生产环境中是否存在始终返回 true 的错误处理程序。

我遇到了这个确切的问题,其中类型提示在开发中没有得到解决,但直到我们将其推送到现场并且不再注册错误处理程序时我才意识到。

显然,一个致命的解析错误是无法停止的,但如果错误处理程序返回 true,则可以忽略一个可捕获的错误。这就是我在你的案子上投入的资金。

此外,请务必注意,正如一位用户指出的那样,无法对标量进行类型提示。

一个更简单的说法是 “不可能对任何可以用字符串表示的东西进行类型提示。” 这是由于 PHP 处理它的方式是更原始的变量,它们都可以相互转换,因此(因为 1"1"true 都可以是 == 1== '1'== true)解释器实际上不可能因为它是为了实际捕获和执行标量类型提示而编写的。

回答这个问题:该变量应该是$str = "something"; 还是$str = new string();(即字符串或对象)?

如果它应该是一个字符串,请删除类型提示,因为 PHP 中没有任何东西允许这种支持(除了 HHVM,但如果你使用它就会知道这一点)。

既然您说您无权访问代码,我建议通知有权限的人。

【讨论】:

  • 由于我永远无法访问实时系统,因此我将您的答案标记为正确。我们将很快将代码推送到实时系统,我们几乎按照您所说的做了。我们刚刚删除了类型提示。我会报告发生的情况。
猜你喜欢
  • 1970-01-01
  • 2019-03-12
  • 2012-05-19
  • 1970-01-01
  • 2012-03-12
  • 2019-02-04
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多