类和接口php之间的自动加载差异

时间:2011-10-28 03:19:35

标签: php class interface include autoload

我正在寻找以下问题。 我们项目的类文件名称为logon.class.php 但该类的接口文件名为logon.interface.php

我的问题是,当自动加载方法运行时,我应该能够检测它是类调用还是接口调用。

<?php 
function __autoload($name){
    if($name === is_class){
        include_once($name.'class.php');
    }elseif ($name === is_interface){
         include_once($name.'interface.php');
    }
}
?>

3 个答案:

答案 0 :(得分:3)

您可以使用ReflectionClass::isInterface来确定该类是否为接口。

$reflection = new ReflectionClass($name);

if ($reflection->isInterface()){
  //Is an interface
}else{
  //Not an interface
}

在您的情况下,您可能必须先在file_exist$name.interface.php上使用$name.class.php来确定它们是否存在,是否需要存在,然后检查它是否是接口。

但是,我认为这可能会导致问题。如果您有MyClass.class.phpMyClass.interface.php

,该怎么办?

答案 1 :(得分:0)

您的类和接口应该有一些命名约定,例如您的班级名称为logon,界面名称为logon_interface,您可以轻松区分这两者。例如,通过下划线爆炸$name并检查最后一个元素是否为interface

答案 2 :(得分:0)

为避免类名冲突,您可以使用名称空间。检查PSR-0规格。

同时检查此post。如果在包含文件之前读取文件的内容,则可以对其进行标记,并确定文件是否包含接口或类,而不实际加载类/接口。请记住,接口和类不能具有相同的名称

注意:使用此方法,您实际上可以在运行时更改接口的名称(在加载类之前,虽然这似乎是非常好的做法)