PHP预定义的接口和SPL - 版本检查是否足够?

问题描述:

这可能是一个明显的问题,但我想确定。PHP预定义的接口和SPL - 版本检查是否足够?

我试图弄清楚在哪个版本中出现“Predefined Interfaces”。我的假设是5.0.0,因为这是根据文档添加SPL接口的时候。

此外,可以通过配置或重新编译禁用这些功能,还是可以安全地假定版本检查是否满足其存在?为什么他们甚至与SPL分开,是区别对手,只是这些不能关闭,而SPL可以呢? (至少在5.3.0之前)

你可以找到每个SPL接口可用的版本here。有些是在5.0之后添加的。并且根据the manual从PHP 5.3.0起SPL不能被禁用。

+0

辉煌。我之前正在查看该网站,但没有意识到那里也有版本信息。 喜欢文档的那一部分只是坐在别人的主目录中:p – pospi 2011-04-05 09:40:32

我没有比你添加接口的时候的假设更好的答案,或者差异是什么(在PHP CVS中挖掘5分钟没有产生一个) 。

但是,有一个防弹的方法来检查它们的存在,而不是依靠版本检查: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'); 
    } 
} 

不是最漂亮的,但它肯定涵盖了所有的基地。

+0

我会投你的评论,如果我不只是困扰,使一个帐户,并没有代表这样做!尽管它不像其他一些人那样直接回答,但A +为了透彻:D – pospi 2011-04-05 09:42:51

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

因此,请点击方法说明并查看列出的内容。

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

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


对于什么是值得的,我开了一个功能请求(#49927)前一段时间有关使可用的版本信息类(因此也接口)概述/概要页。感谢提醒我,它存在并且会有用!