类和接口共享同一个命名空间!
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 自动加载器 - 它会崩溃。因为自动加载器试图加载 `string`,它并不关心它是否是类。
我找到了几种方法
1 - 取消注册 AL -> 检查 Ifaces -> 注册自动加载器
2 - $ifaces = array_flip(get_declared_interfaces());
if($ifaces["MyIface"]) // 空 // isset .
接口并不差,你可以构建系统的正确几何结构,并通过函数/变量/常量进行验证。
它们也适合存储变量 <?php
ROOT::THEMES ; ROOT::LOC ; ?> . 比 Define 快得多,但你不能在里面放算法,只能放完整的字符串/__file__/等等。