类和接口共享相同的命名空间!
class k{}
interface k {} // 致命错误:无法重新声明类 k
(PHP 5 >= 5.0.2, PHP 7, PHP 8)
interface_exists — 检查接口是否已定义
示例 #1 interface_exists() 示例
<?php
// 在尝试使用接口之前检查接口是否存在
if (interface_exists('MyInterface')) {
class MyClass implements MyInterface
{
// 方法
}
}
?>
关于命名空间的一点说明,对某些人来说可能显而易见,但对我来说并不明显。
当语句与接口/类声明 MyInterface 位于同一命名空间时,您可以编写下面的语句……
<?php
$foo instanceof MyInterface
?>
使用 interface_exists 或 class_exists 函数时,您必须输入完整的命名空间接口名称,如下所示(即使函数调用来自同一命名空间)。
<?php
interface_exists(__NAMESPACE__ . '\MyInterface', false);
?>
据我记得,interface_exists() 是在 5.0.2 中添加的。在 5.0.0 和 5.0.1 中,class_exists() 用于在请求现有接口时返回 TRUE。从 5.0.2 开始,class_exists() 不再这样做。
如果您想检查已包含的接口,并且您已经注册了 spl 自动加载器 - 它会崩溃。因为自动加载器试图加载`字符串`,它并不关心它是类还是不是。
我找到了几种方法
1 - 注销 AL - -> 检查接口 - -> 注册自动加载器
2 - $ifaces = array_flip(get_declared_interfaces());
if($ifaces["MyIface"]) // 空 // isset .
接口并没有不好,您可以构建正确的系统几何结构,并通过函数/变量/常量进行验证。
它们也适合存储变量 <?php
ROOT::THEMES ; ROOT::LOC ; ?> 。比 Define 快得多,但您不能在其中放入算法,只能放入完整的字符串/__file__/等。