0

我一直在环顾四周,在任何地方都找不到这个问题的简明答案——也许那些比我有更多自动加载经验的人可以解释一下。很简单的问题:

我写了一个简单的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);
}
4

2 回答 2

1

您应该始终像这样添加命名空间:

class Event_Instructed extends Event_Event

Instructed.php在这种情况下,文件名应该是。

于 2013-07-07T21:34:34.587 回答
0

你应该指定一个namespace......像这样:

namespace Event
{
    abstract class Event {}
    class Lesson extends Event {}
}

这适用于您的自动加载功能。

PS:__autoload功能已弃用。试着做这个:

function Autoload ( $Subject )
{ /* ... */ }

spl_autoload_register('Autoload');

这样你就不需要str_replace在你的Autoload功能...

您还可以在其他命名空间中扩展..

namespace OtherNamespace
{
    class AnotherEvent extends Event\Event {}
}
于 2017-03-22T03:18:19.320 回答