- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在分析一些在我没有完全访问权限的服务器上运行的 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/
echo "Language"; echo " Select... English(US) English(AU)
好吧,我真的不知道为什么会这样。我目前正在实现一个线程容器,它以分离的方式运行无限循环,限制在每次迭代之间的特定速度。 标题: class timeloop { public: std::th
我收到 System.InvalidOperationException: Collection was modified;枚举操作可能无法执行: ExceptionLoggingLibrary.Lo
我是一名优秀的程序员,十分优秀!