PHP预定义接口& SPL - 版本检查足够吗?

时间:2011-04-05 08:50:50

标签: php interface spl predefined-variables

这可能是一个显而易见的问题,但我想确定。

我正在努力研究PHP中出现的“Predefined Interfaces”版本。我的假设是5.0.0,因为这是根据文档添加SPL接口的时候。

此外,是否可以通过配置或重新编译来禁用它们,还是可以安全地假设版本检查满足它们的存在?为什么他们甚至与SPL分离,只是这些不能被关闭的区分因素,而SPL可以? (至少在5.3.0之前)

3 个答案:

答案 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),关于在类(因此也是界面)概述/概要页面上提供版本信息。感谢您提醒我它存在且有用!