PHP自动加载

时间:2013-07-07 21:22:53

标签: php autoload

我一直在四处寻找并且无法在任何地方找到这个问题的简明答案 - 或许那些拥有更多自动驾驶经验的人可能会有所帮助。非常简单的问题:

我写了一个简单的autoloader

function __autoload($className){
    $className = BASEDIR . "include/class/" . str_replace("_", "/", $className) . ".php";
    require_once($className);
}

其中BASEDIR是基础项目目录。工作很棒,包括课程 - 去图。 但是,当我去包含扩展其他类的类时,它开始破坏。

根据本网站上的建议,我正在为我的课程使用PEAR命名约定。因此,我的“活动”课程(描述像派对这样的实际活动)就住在这里:

include/class/Event/Event.php

实际的班级名称是“事件”。

在自动加载课程时,我会像这样引用它:

new Event_Event();

自动加载器将其转换为:

"include/class/Event/Event.php";

当使用此命名约定的其他类扩展Event时出现问题。 我正在使用,例如:

class EventInstructed extends Event_Event

自动加载器知道要查找的位置,但由于我的Event类名称是“Event”而不是“Event_Event”,它正在尝试查找错误的类而无法找到它。

问题是,如何正确使用pear命名约定,还是应该在自动加载器中进行额外的解析来解决我的问题?在下划线上分解字符串,获取类名并改为使用它?

命名约定在这里: 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);
}

2 个答案:

答案 0 :(得分:1)

您应该始终添加如下命名空间:

class Event_Instructed extends Event_Event

在这种情况下,文件名应为Instructed.php

答案 1 :(得分:0)

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

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

这个shold与你的自动加载功能一起工作正常。

P.S。:__autoload函数已弃用。试着这样做:

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

spl_autoload_register('Autoload');

这样您就不需要str_replace函数中的Autoload ...

您还可以在其他名称空间中进行扩展..

namespace OtherNamespace
{
    class AnotherEvent extends Event\Event {}
}