使用JLoader :: registerPrefix自动加载类时出现问题


8

这可能是一个非常愚蠢的问题,但是我找不到答案,反复试验失败了。

我正在为Joomla 3.x开发组件,并且有许多我想使用的类。我正在尝试实现该JLoader::registerPrefix()方法。可以说我有两个班HelperNotHelpfulHelper是一个静态类,存储在:

JPATH_LIBRARIES。'/foo/bar/Helper.php'

并且NotHelpful是存储在以下位置的非静态类:

JPATH_LIBRARIES。'/foo/baz/NotHelpful.php'

如果我想注册这些信息,请致电:

JLoader::registerPrefix('Foo', JPATH_LIBRARIES . '/foo'); 

我正在从入口点到应用程序。

然后调用Helper,我只想用FooBarHelper::method1();或实例化一个新的NotHelpful$Class = new FooBazNotHelpful();

对我来说不清楚的是,Helper.phpNotHelpful.php中的实际类名称应该是什么。它应该是FooBarHelperHelperBarHelper,或别的东西完全?

当我尝试致电时,FooBarHelper::method1();无论我的班级是什么名字,我都会收到错误消息:

PHP致命错误:找不到类'FooBarHelper'

我显然至少在做错一件事。谁能告诉我其中一个或多个?

Answers:


1

我对前缀加载器的理解是,您的文件名始终都是小写。

这很好: JLoader::registerPrefix('Foo', JPATH_LIBRARIES . '/foo');

但是随后,您的类名将转换为不同的类路径。

FooBarHelper => JPATH_LIBRARIES . '/foo/bar/helper.php'

FooBazNotHelpful => JPATH_LIBRARIES . '/foo/baz/not/helpful.php'

前缀系统始终遵循此约定,基于此处的文档

类名称必须为驼峰式,并且名称的每个部分都将代表一个文件夹路径,其中名称的最后一个部分是类文件的名称。

要回答您的最后一个问题,类名称应为CamelCase,并且必须在具有小写字母名称的文件中,并且在所有小写字母的文件夹中。


因此,在此示例中,helpful.php中的类定义是class Helpful { ...or class FooBazNotHelpful { ...还是其他?
安迪

FooBazNotHelpful类@andy
David Fritsch

4

您要查找的架构实际上是[ComponentName] [Directory] ​​[Name]。组件通常至少具有以下目录:控制器,模型,视图,助手。对于具有辅助文件helper.php的名为com_mycomponent的组件,它将为MycomponentHelperHelper。驼峰格式在正确识别类中特别重要。

除非您的组件提供了您希望对其他组件可用的类,否则您无需使用JLoader :: registerPrefix()。您可以改为使用JLoader :: discover(),并将这些类提供给组件。对于com_mycomponent / helpers,这意味着

JLoader :: discover('Helpers',JPATH_COMPONENT。'/ helpers');

您也可以使用JLoader :: registerNamespace()使用PHP名称空间。

有关这些方法的更多详细信息,请参见http://docs.joomla.org/Using_own_library_in_your_extensions

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.