php psr 自动加载歧义

问题描述 投票:0回答:3

我正在从事一个 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 标准?

php psr-0
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 {

}

1
投票

为了您的理解,自动加载的工作原理是通过 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
包含在内。


0
投票

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

namespace Employee;

当然,这不是

PSR-0
命名空间,因为没有供应商名称(除非您的供应商名称是“Employee”)。不管怎样,在你的两个代码片段中使用这个命名空间就可以正常工作。

但是,如果您打算将它们保留在单独的命名空间中,则自动加载器将无法在第二个片段中的

Department
中找出
extends Department
。您必须导入名称空间或明确指定它:

namespace Employee\community;

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

我想您并不期望片段中的完整类名是

Employee\Department\Department
,这就是为什么我首先建议为您的目的保留相同的命名空间。

© www.soinside.com 2019 - 2024. All rights reserved.