2009-02-27 39 views

Trả lời

24

Không gian tên là cơ chế ngôn ngữ lập trình để tổ chức các biến, chức năng và lớp học. PHP 5.3 thêm hỗ trợ cho không gian tên, mà tôi sẽ chứng minh trong ví dụ sau:

Giả sử bạn muốn kết hợp hai dự án sử dụng tên lớp cùng tài, nhưng có việc thực hiện khác nhau của mỗi:

// Code for Project One (proj1.php) 
<?php 
    class User { 
    protected $userId; 
    public function getUserId() { 
     return $this->userId; 
    } 
    } 
    $user = new User; 
    echo $user->getUserId(); 
?> 

// Code for Project Two (proj2.php) 
<?php 
    class User { 
    public $user_id; 
    } 
    $user = new User; 
    echo $user->user_id; 
?> 

<?php 
    // Combine the two projects 
    require 'proj1.php'; 
    require 'proj2.php'; // Naming collision! 
    $myUser = new User; // Which class to use? 
?> 

Đối với các phiên bản của PHP nhỏ hơn 5.3, bạn sẽ phải đi qua những rắc rối của việc thay đổi tên lớp cho tất cả các trường của lớp tài được sử dụng bởi một trong những dự án để ngăn chặn một vụ va chạm đặt tên:

<?php 
    class ProjectOne_User { 
    // ... 
    } 
    $user = new ProjectOne_User; // Code in Project One has to be changed too 
?> 

Đối với các phiên bản của PHP lớn hơn hoặc tương đương với 5.3, bạn có thể sử dụng không gian tên khi tạo một dự án, bằng cách thêm một bản tuyên bố không gian tên:

<?php 
    // Code for Project One (proj1.php) 
    namespace ProjectOne; 
    class User { 
    // ... 
    } 
    $user = new User; 
?> 

<?php 
    // Combine the two projects 
    require 'proj1.php'; 

    use ProjectOne as One; // Declare namespace to use 

    require 'proj2.php' // No collision! 

    $user = new \One\User; // State which version of User class to use (using fully qualified namespace) 

    echo $user->user_id; // Use ProjectOne implementation 
?> 

để biết thêm thông tin:

+0

được minh họa rất tốt, với nhận xét và mã. +1 –

+0

Đồng ý. Rất tốt. Tôi chỉ muốn họ đi với một dấu phân cách khác nhau giữa không gian tên và lớp. :( –

+0

Với toàn bộ dấu phân cách: nó sẽ hoạt động hoàn hảo nếu bạn chỉ sử dụng chuỗi trích dẫn đơn mà tôi thực hiện cho mọi chuỗi trong php ngoại trừ các dòng mới –

1

Không gian tên thường được sử dụng với các thư viện, khả năng tham chiếu mã thư viện với 1 không gian tên giúp không thêm những người khác đã được sử dụng.

3

A namespace cho phép bạn sắp xếp mã và cung cấp cho bạn cách đóng gói các mục của bạn.

Bạn có thể hình dung không gian tên dưới dạng hệ thống tệp sử dụng thư mục để nhóm các tệp có liên quan.

Về cơ bản, không gian tên cung cấp cho bạn cách thức để nhóm các lớp, hàm và hằng số liên quan.

Chúng cũng giúp tránh xung đột tên giữa các lớp/hàm/hằng số PHP của bạn và cải thiện khả năng đọc mã, tránh các tên lớp quá dài.

Ví dụ khai namespace:

<?php 
namespace MyProject; 

const CONNECT_OK = 1; 
class Connection { /* ... */ } 
function connect() { /* ... */ } 

?> 
+0

Vì vậy, đối với một loạt các chức năng chuỗi helper, tôi sẽ nhận được họ ra khỏi chức năng tĩnh trong một lớp học và làm namespace String; function match() {} etc? – alex

3

Namespaces giải quyết vấn đề đặt tên va chạm khi nhập lớp học và chức năng từ các thư viện.

Nếu không có không gian tên, nếu bạn bao gồm hai thư viện để xác định hàm/lớp có cùng tên (nghĩa là hai thư viện có cả lớp được gọi là 'người dùng') thì sẽ không thành công.

Không có hỗ trợ không gian tên trong PHP, hầu hết các thư viện đã được đặt trước tên hàm/lớp của chúng với tên có khả năng là duy nhất, nhằm tránh xung đột tên. Vấn đề là, điều này tạo ra các chức năng hoặc tên lớp dài hơn.

Ví dụ được đưa here là của lớp ngoại lệ:

PEAR_Form_Loader_Validate_Table_Element_Validator_Exception. 

Bạn có thể nhập từ một không gian tên dài vào phạm vi địa phương mình, như một bí danh bằng cách sử dụng 'AS' từ khóa - một tên mà bạn chọn. Vì vậy, bạn vẫn có thể có một tên lớp ngắn của sự lựa chọn của bạn trong phạm vi địa phương của bạn.

Sau đây áp dụng 'bí danh' được gọi là DbConnection thành Zend :: DB :: Connection.

use Zend::DB::Connection as DbConnection 
Các vấn đề liên quan