我一直在环顾四周,在任何地方都找不到这个问题的简明答案——也许那些比我有更多自动加载经验的人可以解释一下。很简单的问题:
我写了一个简单的autoloader
:
function __autoload($className){
$className = BASEDIR . "include/class/" . str_replace("_", "/", $className) . ".php";
require_once($className);
}
BASEDIR
基础项目目录在哪里。包括课程在内的作品很棒 - 去图。但是,当我去包含扩展其他类的类时,它开始中断。
根据本网站上的建议,我正在PEAR
为我的课程使用命名约定。所以我的“事件”类(描述像派对这样的实际事件)住在这里:
include/class/Event/Event.php
实际的类名是“Event”。
自动加载类时,我像这样引用它:
new Event_Event();
自动加载器将其变成:
"include/class/Event/Event.php";
Event
当其他类使用此命名约定进行扩展时,问题就出现了。我正在使用,例如:
class EventInstructed extends Event_Event
自动加载器知道去哪里找,但由于我的事件类名是“Event”而不是“Event_Event”,它试图寻找错误的类并且找不到它。
因此,问题是,我如何正确使用梨命名约定,或者我应该在我的自动加载器中进行额外的解析来解决我的问题?分解下划线的字符串,获取类名并使用它来代替?
命名约定在这里: http: //pear.php.net/manual/en/standards.naming.php
谢谢!!
编辑
我的最终解决方案如接受的答案中所述。类在层次结构中是这样的:
include/class/Event/Event.php
include/class/Event/Lesson.php // <-- extends Event
在事件文件中:
abstract class Event_Event{
//Class code....
}
在课程文件中:
class Event_Lesson extends Event_Event{
//Class code....
}
最后,__autoload 函数:
define("BASEDIR", __DIR__ . "/");
function __autoload($className){
$className = BASEDIR . "include/class/" . str_replace("_", "/", $className) . ".php";
echo $className . "<br / >";
require_once($className);
}