我有一个名为Manager
的接口,以及两个类UtilisateurManager
和StageManager
,它们都实现了Manager
接口。
在每个课程中,我都包含了Manager
接口,如下所示:
require '../helpers/Manager.class.php';
然后我需要在php
脚本中一次使用这两个类,但我收到错误I can't redeclare class Manager
。
我尝试使用函数class_exists()
,但在我的情况下它没用。
我该如何解决这个问题?
答案 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
文件中,这很令人困惑。