2012-11-12 22 views
7

Khi sử dụng mô hình giả lập không gian tên của PEAR và Zend, người ta thường đi qua heirarchies lớp trông như thế này:Điều gì xảy ra khi một không gian tên và lớp chia sẻ một tên trong PHP?

Zend/ 
    Db.php 
    Db/ 
     Expr.php 

đâu db.php chứa một lớp có tên Zend_Db và Expr.php chứa một lớp có tên Zend_Db_Expr. Tuy nhiên, khi bạn cố gắng chuyển đổi không gian tên psuedo 5.2 cũ thành không gian tên PHP 5.3, bạn được trình bày với một trường hợp không gian tên và một lớp chia sẻ một tên. Vì toán tử sử dụng có thể nhập một vùng tên hoặc một tên lớp, điều này dẫn đến sự mơ hồ.

Dưới đây là một ví dụ về một ứng dụng tôi đang làm việc trên chuyển đổi:

App/ 
    Core.php 
    Core/ 
     Autoloader.php 

Đây là thư mục cơ sở và không gian tên là App. Ở cấp cao nhất của không gian tên là một lớp Core:

namespace App; 
class Core { } 

trong thư mục cốt lõi là khác nhau lớp lõi khác, một số trong đó sử dụng chính Core. Theo mẫu không gian tên giả, đây không phải là vấn đề. Nhưng trong mẫu không gian tên thật, nó tạo ra tình huống này:

namespace App\Core; 
use App\Core as Core; // What is this importing? Namespace or class? 

class Autoloader { 
    public function __construct(Core $core) {} 
} 

Điều này có được xác định không? Điều gì thực sự được nhập ở đây?

+0

Vấn đề là gì? Tôi không nghĩ rằng bạn có thể nhập một không gian tên. Bạn luôn nhập một lớp và chỉ cho nó một bí danh. –

+2

http://php.net/manual/en/language.namespaces.importing.php Sử dụng có thể nhập một lớp hoặc một vùng tên. –

Trả lời

1

Chỉ cần cả hai. Nó không phải là nhập thực sự, chỉ là một gợi ý cho trình biên dịch, rằng mọi cuộc gặp gỡ của bí danh này trong các hoạt động liên quan đến lớp nên được mở rộng đến khai báo này. Trong không gian tên php chỉ là một phần của lớp học vì vậy hãy nghĩ về nó như thế này

$alias = 'Zend_Db'; 
$zendDB = new $alias; 
$aliasExpr = $alias . '_Expr'; 
$expr = new $aliasExpr; 
Các vấn đề liên quan