-1

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

4

3 回答 3

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 {

}
于 2013-06-13T04:28:35.390 回答
1

为了您的理解,自动加载通过在自动加载堆栈中注册自动加载函数spl_autoload_register来工作;new Class()这允许在执行语句时调用函数(更多信息)。

另一方面,用于自动加载的 FIG 标准 PSR-0 定义了名称空间将如何通过 PSR-0 自动加载函数转换为文件名。例如,给定命名空间Vendor\Foo,自动加载器将查找Vendor/Foo.php具有以下代码的文件

namespace Vendor;
class Foo
{
    public function do()
    {
        echo "Foo";
    }
}

因此,遵循强制性要求,符合 PSR-0 的命名空间会解析为正确的 PHP 文件,否则该文件可以使用requireinclude.

于 2013-06-13T06:13:51.903 回答
0

如果我正确阅读了您的意图,您只需要在两个代码片段中使用以下命名空间:

namespace Employee;

当然,这不是PSR-0名称空间,因为没有供应商名称(除非您的供应商名称是“员工”)。无论如何,在你的两个代码片段中使用这个命名空间就可以了。

但是,如果您打算将它们保存在单独的名称空间中,那么自动加载器将不会Departmentextends Department第二个片段中找到。您将必须导入命名空间或显式指定它:

namespace Employee\community;

class Community extends Employee\Department\Department
{
  //code
}

我想您没想到片段中的完整类名是Employee\Department\Department,这就是为什么我首先建议为您的目的保留相同的命名空间。

于 2013-06-13T04:29:10.750 回答