这也许是一个显而易见的问题,但我想确定一下。
我正在尝试找出“预定义接口”出现在 PHP 中的哪个版本。我的假设是 5.0.0,因为这是根据文档添加 SPL 接口的时候。
此外,这些是否可以通过配置或重新编译来禁用,或者可以安全地假设版本检查满足它们的存在?为什么它们甚至与 SPL 分开,区别只是这些不能被关闭,而 SPL 可以吗?(至少在 5.3.0 之前)
这也许是一个显而易见的问题,但我想确定一下。
我正在尝试找出“预定义接口”出现在 PHP 中的哪个版本。我的假设是 5.0.0,因为这是根据文档添加 SPL 接口的时候。
此外,这些是否可以通过配置或重新编译来禁用,或者可以安全地假设版本检查满足它们的存在?为什么它们甚至与 SPL 分开,区别只是这些不能被关闭,而 SPL 可以吗?(至少在 5.3.0 之前)
目前,手册只显示属于每个接口的方法的版本信息。此版本信息可以在方法原型(info)上方的页面顶部找到。
因此,单击方法描述并查看其中列出的内容。
这些是否可以通过配置或重新编译来禁用,或者可以安全地假设版本检查满足它们的存在?为什么它们甚至与 SPL 分开,区别只是这些不能被关闭,而 SPL 可以吗?(至少在 5.3.0 之前)
这些接口根本不是 SPL 扩展的一部分,并且没有启用或禁用它们。它们需要在 Zend 引擎中实现;不可能在扩展中做他们在 SPL 中所做的事情。
值得一提的是,我不久前打开了一个功能请求(#49927),关于在类(因此也是接口)概述/概要页面上提供版本信息。感谢您提醒我它存在并且很有用!
对于添加接口的时间或区别是什么(在 PHP CVS 中挖掘五分钟并没有产生),我没有比您的假设更好的答案了。
但是,有一种防弹方法可以检查它们的存在,而不是依赖于版本检查:interface_exists
. 对于 PHP 版本 5.0.0 和 5.0.1,您将不得不这样做class_exists
。
所以:
function interfaces_defined() {
// Most likely case first
if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
return true;
}
else if (version_compare(PHP_VERSION, '5.0.0', '<')) {
return false;
}
else if (version_compare(PHP_VERSION, '5.0.1', '<=')) {
return class_exists('Iterator');
}
else {
return interface_exists('Iterator');
}
}
不是最漂亮的,但它绝对涵盖了所有基础。