避免重新声明界面一次

时间:2014-04-21 00:11:45

标签: php

我有一个名为Manager的接口,以及两个类UtilisateurManagerStageManager,它们都实现了Manager接口。

在每个课程中,我都包含了Manager接口,如下所示:

require '../helpers/Manager.class.php';

然后我需要在php脚本中一次使用这两个类,但我收到错误I can't redeclare class Manager

我尝试使用函数class_exists(),但在我的情况下它没用。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

也许您可以使用require_once代替require

require_once '../helpers/Manager.class.php';

答案 1 :(得分:0)

你需要实现一个简单的自动加载器,只有在尚未加载时才会尝试加载类/接口,然后忘记直接require / include。将文件系统详细信息保留在类文件之外被认为是一种好习惯:您可以在目录系统可能更改的其他项目中重复使用它,因此您需要再次编辑该类。

一个简单的例子:

class Autoloader
{
    protected $directories = array();
    public function register()
    {
        // register 'loadClass' method as an autoloader
        spl_autoload_register(array($this, 'loadClass'));
    }
    public function addSource($dir)
    {
        $this->directories[] = $dir;
    }
    public function loadClass($className)
    {
        foreach ($this->directories as $dir) { // search in every registered sources root
            $fileName = $dir.DIRECTORY_SEPARATOR.$className.'.class.php';
            if (file_exists($fileName) {
                include($fileName);
                return; // halt when file was found
            }
        }
    }
}
// bootstrap file
$autoloader = new Autoloader;
$autoloader->register();

spl_autoload_register documentation

请注意,此实现将在文件夹中循环,这肯定不是理想的解决方案。今天最好的选择是根据PSR-4 spec构建项目 - 自动加载器实现必须只检查单个文件的存在。在没有任何准备的情况下深入了解命名空间可能有点困难,但是一旦熟悉了这种编码风格,就会忘记直接文件加载。

最后一件事,我想警告你关于你的命名惯例 - 你的Interface存储在.class.php文件中,这很令人困惑。