定义命名空间前缀
组件
在开发Joomla扩展时,您在清单文件中定义要使用的命名空间,例如com_example
。
<namespace path="src">Mycompany\Component\Example</namespace>
让我们看看这其中的各个部分。
-
Mycompany – 您可以随意在此处放置任何内容 – 通常设置为指示开发扩展的公司名称。
-
Component – 如果您的Joomla扩展是组件,则必须将其设置为Component。
-
Example – 这应该与您正在开发的组件名称相匹配。
-
src – 这是您存储类文件的子文件夹。您不必将其命名为src,但这是常见做法。
根据此清单文件,Joomla将创建2个命名空间前缀。
- 'Mycompany\Component\Example\Site' 将指向 components/com_example/src
- 'Mycompany\Component\Example\Administrator' 将指向 administrator/components/com_example/src
(假设您的组件同时具有站点和管理员方面)。
模块
您将对模块执行类似的操作。
<namespace path="src">Mycompany\Module\Example</namespace>
<files>
<filename module="mod_example">mod_example.php</filename>
<folder>src</folder>
<folder>tmpl</folder>
</files>
命名空间中的“Example”不必与模块名称“mod_example”完全匹配,但您可能会发现这样做更容易。
如果这是一个站点模块,则Joomla将创建命名空间前缀:'Mycompany\Module\Example\Site' 将指向 modules/mod_example/src
如果这是一个管理模块,则Joomla将创建命名空间前缀:'Mycompany\Module\Example\Administrator' 将指向 administrator/modules/mod_example/src
插件
对于插件。
<namespace path="src">Mycompany\Plugin\Content\Example</namespace>
<files>
<filename plugin="example">example.php</filename>
<folder>src</folder>
</files>
这里命名空间有一个额外的部分,它必须设置为插件类型 – 上述示例中的“Content”。
同样,命名空间中的“Example”部分不必与插件名称“plugin="example"”完全匹配。
对于上述情况,Joomla将创建命名空间前缀。
'Mycompany\Plugin\Content\Example' 将指向 plugins/content/example/src
大小写
请注意确保完全限定类名各个部分中的大小写与目录和文件名称中的大小写匹配!如果您在Windows上开发,但目标系统是Linux,您可能会发现您的扩展在开发机器上可以工作,但在目标系统上却不能工作。这是因为Windows在文件名或目录名称的大小写错误时会宽容一些 – 它仍然会为您打开文件 – 但Linux不会。
查找您的类
一旦您确定了命名空间,您就可以确定类文件将位于何处。Joomla组件在src
下使用相当扁平的目录结构,但您不必坚持使用它。只要您遵守PSR4关于将完全限定类名与文件路径匹配的建议,Joomla就会找到您的类的源文件。您不必再猜测将帮助程序文件存储在哪个目录中,以及要为文件指定什么名称!
但是,有一种情况您需要帮助Joomla – 在您的表单XML文件中。
- 如果您定义了一个自定义字段,则需要告诉Joomla在哪里可以找到定义该自定义字段的类。
- 如果您定义了一个自定义验证规则,则需要告诉Joomla在哪里可以找到定义该规则的类。
由于XML文件没有PHP <namespace>
语句,因此您必须提供等效项,最简单的方法是在包含使用这些语句的XML元素中包含addfieldprefix
或addruleprefix
属性,例如
<?xml version="1.0" encoding="utf-8"?>
<form
addruleprefix="Mycompany\Component\Example\Administrator\Rule"
addfieldprefix="Mycompany\Component\Example\Administrator\Field"
>
PHP全局命名空间
如果您的PHP源文件中包含<namespace>
语句,则PHP默认会假设您在代码中引用的任何类名都位于该命名空间下。因此,如果您使用任何标准PHP类,例如Exception
,则必须在前面加上反斜杠\Exception
。开头的反斜杠指示PHP这是一个完全限定的类名,并且由于此FQN只有一个段,因此它将在全局命名空间中找到。
类似地,如果您使用某个函数,则PHP将尝试在您的命名空间下查找该函数。但与类不同,如果它在您的命名空间下找不到该函数,它将恢复到在全局命名空间下查找它。因此,如果您告诉PHP不要费心在您的命名空间中查找,而是在函数名前加上反斜杠,例如\strlen(...)
,则效率会略高一些。您将在Joomla PHP代码中看到这种情况。