我正在分析一些在我无法完全访问的服务器上运行的PHP代码。我可以阅读phpinfo。代码似乎在服务器上正常运行。在我的本地环境中,我无法获得运行代码,因为在使用类型提示的某个方法的调用中我得到了“可捕获的致命错误”。
someMethod(string $str) {
// Do something...
}
错误说明如下:“传递给...的参数1必须是路径\的\ namespace \ string的实例,给定的字符串......”。
没有带字符串类的use关键字,也无法通过开发环境的文件夹中的grep命令找到任何内容。
是否有任何PHP模块,扩展可以使这种类型的提示工作?服务器和我的开发环境使用的是PHP 5.4.25。
实时系统可能提供什么来运行此类代码?它可能会使用其他一些基于PHP的编程语言,比如Hack吗?其余代码非常直接PHP!
答案 0 :(得分:1)
您提到没有使用声明或命名空间声明来暗示'字符串'代码中的类。代码是否使用自动加载器?
这里有两个可能的问题:
路径 - 实时环境可能设置了另一个路径,和/或正在通过此其他路径加载/搜索文件/类。 (在您可能正在查看的代码之外)。
错误处理 - 另一个可能的原因是生产环境中的错误处理程序始终返回true。
我有确切的问题,其中类型提示未在开发中解析,但在我们将其推送并且错误处理程序不再注册之前我没有意识到
显然,无法停止致命的解析错误,但事实证明,如果错误处理程序返回true,则可以忽略可捕获的错误。这就是我在你的案子中投入的钱。
此外,非常重要的是要注意,没有办法输入提示标量,正如一位用户所指出的那样。
更简单的说法是"不能输入任何可以用字符串表示的东西。" 这是由于其中的方式PHP处理它更原始的变量,它们都可以相互进行类型转换,因此(因为1
,"1"
和true
都可以{{1} },== 1
和== '1'
)解释器实际上是不可能的,因为它被编写为实际捕获并强制执行标量类型提示。
回答这个问题:该变量应该是== true
还是$str = "something";
(即字符串或对象)?
如果它应该是一个字符串,请删除type-hint,因为PHP中的任何内容都不允许这种支持(除了HHVM,但如果你使用它,你会知道这一点。)
由于您说您无权访问该代码,我建议您通知某人。