我正在从事一个 php sdk 重写项目,客户希望完成 PSR 标准。我正在这里查看标准页面
https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
我无法理解的一件事是,如果我在类中使用名称空间,我是否仍然需要使用 include 或 require 或 use。我的意思是自动加载的全部原因超出了目的,对吗?
例如,假设我这样上课,
namespace Employee\Department;
Class Department
{
//code
}
我有另一个类通过扩展它来使用这个类,
namespace Employee\community;
Class Community extends Department
{
//code
}
考虑到我有一个自动加载功能,上述代码是否符合 psr-0 标准?
第二个示例假设 Department 位于 Community 命名空间中,因此在这种情况下您需要一个 use 语句。此外,您的两个示例都将使用名称空间
Employee
而不是 Employee\Whatever
。例如,我们假设以下布局:
Employee/
Community.php
Community/
Manager.php
Department.php
Department/
Manager.php
然后我们会看到如下所示的类/命名空间
namespace Employee;
class Department {
}
///////////
namespace Employee;
class Community extends Department {
}
/////////////
namespace Employee\Department;
class Manager {
}
/////////////
namespace Employee\Community;
use Employee\Department\Manager as BaseManager;
Class Manager extends BaseManager {
}
为了您的理解,自动加载的工作原理是通过 spl_autoload_register
在自动加载堆栈中注册
autoload 函数;这允许每当执行
new Class()
语句时调用该函数(更多信息)。
另一方面,FIG 自动加载标准 PSR-0 定义了 PSR-0 自动加载函数如何将命名空间转换为文件名。例如,给定命名空间
Vendor\Foo
,自动加载器将查找具有以下代码的文件
Vendor/Foo.php
namespace Vendor;
class Foo
{
public function do()
{
echo "Foo";
}
}
因此,遵循强制性要求,符合 PSR-0 的命名空间将解析为正确的 PHP 文件,否则该文件可能会使用
require
或 include
包含在内。
如果我正确地理解了你的意图,你只需要在两个代码片段中使用以下命名空间:
namespace Employee;
当然,这不是
PSR-0
命名空间,因为没有供应商名称(除非您的供应商名称是“Employee”)。不管怎样,在你的两个代码片段中使用这个命名空间就可以正常工作。
但是,如果您打算将它们保留在单独的命名空间中,则自动加载器将无法在第二个片段中的
Department
中找出 extends Department
。您必须导入名称空间或明确指定它:
namespace Employee\community;
class Community extends Employee\Department\Department
{
//code
}
我想您并不期望片段中的完整类名是
Employee\Department\Department
,这就是为什么我首先建议为您的目的保留相同的命名空间。