2013-06-13 74 views
-1

我正在開發一個php sdk重寫項目,客戶想要完成PSR標準。我期待在標準頁面在這裏php psr autoload ambiguity

https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md

一件事是什麼我不能夠理解,如果我使用的名稱空間在我的課我仍然需要使用包括或要求或使用。我的意思是autoload的全部理由勝過這個目的了嗎?

例如,說我有一類這種方式,

namespace Employee\Department; 

Class Department 
{ 
    //code 
} 

和我有另一類通過延長它使用這個類,

namespace Employee\community; 

Class Community extends Department 
{ 
    //code 
} 

所以沒有上述代碼使其psr-0標準考慮到我有一個autoload函數就是上面的鏈接。

回答

3

第二個示例將假定Department位於Community命名空間中,因此在這種情況下您需要一個use語句。還您的兩個例子將使用的命名空間EmployeeEmployee\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 { 

} 
0

類/命名空間。如果我讀了你的意圖正確的,你只需要以下命名空間在這兩個代碼片段:

namespace Employee; 

當然,這並不是一個PSR-0名稱空間,因爲沒有供應商名稱(除非您的供應商名稱是'Employee')。無論如何,在你的兩個代碼片段中使用這個命名空間可以正常工作。

但是,如果您打算將它們保留在單獨的名稱空間中,則自動裝帶器將不會在第二個片段中找出Departmentextends Department。你將不得不要麼import the namespace或明確指定爲這樣:

namespace Employee\community; 

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

我想,沒想到你從你的片段類的全名是Employee\Department\Department,這就是爲什麼我第一次建議保留了相同的命名空間你的目的。

1

爲了您的理解,自動加載通過在自動加載堆棧中註冊spl_autoload_register;這允許在執行new Class()語句時調用該函數(more info)。另一方面,用於自動加載的FIG標準PSR-0定義瞭如何通過PSR-0自動加載器功能將名稱空間轉換爲文件名。例如,給定的命名空間Vendor\Foo,自動裝載機將尋找具有以下代碼

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

因此文件Vendor/Foo.php,繼mandatory requirements,一個PSR-0標準的命名空間解析這本來可以正確的PHP文件包括使用requireinclude