2

这也许是一个显而易见的问题,但我想确定一下。

我正在尝试找出“预定义接口”出现在 PHP 中的哪个版本。我的假设是 5.0.0,因为这是根据文档添加 SPL 接口的时候。

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

4

3 回答 3

1

您可以在此处找到每个 SPL 接口可用的版本。一些是在 5.0 之后添加的。并且根据PHP 5.3.0 SPL的手册不能被禁用。

于 2011-04-05T09:19:45.493 回答
1

目前,手册只显示属于每个接口的方法的版本信息。此版本信息可以在方法原型(info)上方的页面顶部找到。

因此,单击方法描述并查看其中列出的内容。

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

这些接口根本不是 SPL 扩展的一部分,并且没有启用或禁用它们。它们需要在 Zend 引擎中实现;不可能在扩展中做他们在 SPL 中所做的事情。


值得一提的是,我不久前打开了一个功能请求(#49927),关于在类(因此也是接口)概述/概要页面上提供版本信息。感谢您提醒我它存在并且很有用!

于 2011-04-06T20:10:12.950 回答
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');
    }
}

不是最漂亮的,但它绝对涵盖了所有基础。

于 2011-04-05T09:10:46.897 回答