php psr autoload ambiguity

时间:2013-06-13 04:17:17

标签: php psr-0

我正在开发一个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标准。

3 个答案:

答案 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文件,否则可能使用requireinclude包含该文件。

答案 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,这就是为什么我首先建议为你的目的保留相同的命名空间。