【问题标题】:PHP AutoloadingPHP 自动加载
【发布时间】:2013-07-07 21:22:53
【问题描述】:

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

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

【问题讨论】:

    标签: php autoload


    【解决方案1】:

    你应该总是像这样添加命名空间:

    class Event_Instructed extends Event_Event
    

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

    【讨论】:

    • 其实不是namespace,而是pseudo-namespace。必须有一行。
    • 嗯,是的,整个 PEAR 库都需要大修,因为不再支持 PHP 5.2,但这是另一个问题。
    • 谢谢你——还有一件事。之后,你会如何修改自动加载功能?
    【解决方案2】:

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

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

    这与您的自动加载功能配合得很好。

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

    function Autoload ( $Subject )
    { /* ... */ }
    
    spl_autoload_register('Autoload');
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2012-12-06
      • 2012-11-06
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多