这可能是一个显而易见的问题,但我想确定。
我正在努力研究PHP中出现的“Predefined Interfaces”版本。我的假设是5.0.0,因为这是根据文档添加SPL接口的时候。
此外,是否可以通过配置或重新编译来禁用它们,还是可以安全地假设版本检查满足它们的存在?为什么他们甚至与SPL分离,只是这些不能被关闭的区分因素,而SPL可以? (至少在5.3.0之前)
答案 0 :(得分:1)
我没有比你对添加接口的假设更好的答案,或者差异化是什么(在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');
}
}
不是最漂亮的,但绝对涵盖所有基础。
答案 1 :(得分:1)
您可以找到每个SPL界面可用的版本here。有些是在5.0之后添加的。根据PHP {5.3}的the manual,无法禁用SPL。
答案 2 :(得分:1)
目前,手册仅显示属于每个接口的方法的版本信息。可以在方法原型(info)上方的页面顶部找到此版本信息。
因此,请点击方法说明,查看其中列出的内容。
是否可以通过配置或重新编译来禁用它们,还是可以安全地假设版本检查满足它们的存在?为什么他们甚至与SPL分离,只是这些不能被关闭的区分因素,而SPL可以? (至少在5.3.0之前)
这些接口根本不是SPL扩展的一部分,并且没有启用或禁用它们。它们需要在Zend引擎中实现;他们不可能在SPL的扩展中做他们所做的事。
为了它的价值,我前段时间开了一个功能请求(#49927),关于在类(因此也是界面)概述/概要页面上提供版本信息。感谢您提醒我它存在且有用!