php - PHP 代码中莫名其妙的类型提示

标签 php type-hinting

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

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

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

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

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

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

最佳答案

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

这里有两个可能的问题:

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

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

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

显然无法阻止致命的解析错误,但事实证明,如果错误处理程序返回 true,则可以忽略可捕获的错误。这就是我在您的案例中投入的资金。

此外,非常重要的是要注意,正如一位用户指出的那样,无法对标量进行类型提示。

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

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

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

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

关于php - PHP 代码中莫名其妙的类型提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22956369/

相关文章:

php - 有没有办法从 PHP 中的 boolean 值中获取 "true"/"false"字符串值?

php - 尝试插入负数时 drupal db_query 不起作用

python - Python3 类型和 mypy 的意外可选行为

python - 是否可以仅键入提示一个类对象但排除子类对象?

Python 类型提示,可索引对象

Python 类型提示和 `*args`

python - 绕过 "typing.Union is not a generic class"

php - mysql 中的 Rails 多数组格式

PHP 代码将空记录插入 MySQL 数据库

php - 使用php使用jquery和mysql更新表记录