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