我正在开发一个php sdk重写项目,客户希望完成PSR标准。我在这里看标准页面
https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
我无法理解的一件事,如果我在课堂上使用名称空间,我仍然需要使用包含或要求或使用。我的意思是自动加载的全部原因都胜过了目的吗?
例如,假设我有这样的课程,
namespace Employee\Department;
Class Department
{
//code
}
我有另一个通过扩展它来使用这个类的类,
namespace Employee\community;
Class Community extends Department
{
//code
}
考虑到我在上面的链接上有一个自动加载功能,所以上面的代码使它成为psr-0标准。
答案 0 :(得分:3)
第二个例子假设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 {
}
答案 1 :(得分:1)
为了您的理解,自动加载的工作原理是通过spl_autoload_register
在自动加载堆栈中注册autoload function;这允许在执行new Class()
语句时调用函数(more info)。
另一方面,用于自动加载的FIG标准PSR-0定义了如何通过PSR-0自动加载器功能将命名空间转换为文件名。例如,给定名称空间Vendor\Foo
,自动加载器将查找具有以下代码的文件Vendor/Foo.php
namespace Vendor;
class Foo
{
public function do()
{
echo "Foo";
}
}
因此,在mandatory requirements之后,符合PSR-0的命名空间会解析为正确的PHP文件,否则可能使用require
或include
包含该文件。
答案 2 :(得分:0)
如果我正确地读了你的意图,你只需要在两个代码片段中都有以下命名空间:
namespace Employee;
当然,这不是PSR-0
命名空间,因为没有供应商名称(除非您的供应商名称是'Employee')。无论如何,在两个代码片段中使用此命名空间将正常工作。
但是,如果您打算将它们保存在不同的名称空间中,那么自动加载器将无法在第二个代码段中的Department
中找出extends Department
。您必须import the namespace或明确指定它:
namespace Employee\community;
class Community extends Employee\Department\Department
{
//code
}
我想你不希望你的代码片段中的完整类名是Employee\Department\Department
,这就是为什么我首先建议为你的目的保留相同的命名空间。