Hướng dẫn namespace vs use php - không gian tên so với sử dụng php

Từ PHP 5.3 namespaces được giới thiệu để đóng gói các item và làm cho script dễ quản lý hơn.

Khi một trang web trở nên lớn hơn, việc giữ tất cả các file class trong cùng một thư mục sẽ khó hơn. Ngoài ra, chúng ta phải sử dụng tên rất dài cho các file và class, Đó là một trở ngại trong quản lý mã nguồn. Namespaces được giới thiệu để ngăn chặn vấn đề này. Chúng ta hãy xem nó hoạt động như thế nào!

 Giả sử chúng ta có cấu trúc file như sau:

class
	animals
		Dog.php
		Cat.php
		Goat.php
	birds
		Owl.php
		Peacock.php
	pets
		Dog.php
		Cat.php
	MainClass1.php
	MainClass2.php
	MainClass3.php

 Trong cấu trúc thư mục trên bạn thấy có file Dog.php và Cat.php được lưu trong các thư mục khác nhau, chúng là các class khác nhau hoàn toàn nhưng lại trùng tên,vậy làm sao để PHP biết bạn đang muốn gọi class nào khi thực hiện autoload, do đó chúng ta sử dụng thêm namespace để PHP có thể hiểu 2 file Dog và Cat trên là 2 file khác nhau hoàn toàn.

 Đoạn code trên hoạt động như thế nào?

Đầu tiên chúng ta định nghĩa autoload để load các file trong thư mục class khi được gọi đến. Trong hàm này chúng ta định nghĩa hàm str_replace thay thế tất cả dấu \ bằng DIRECTORY_SEPARATOR - 1 hằng số được định nghĩa trước đại diện cho dấu ngăn cách thư mục trong PHP ("\" cho Windows và "/" cho Linux). Tiếp theo nó sẽ include_once để nạp các class khi được gọi đến. $_SERVER['DOCUMENT_ROOT'] chính là đường dẫn đến thư mục gốc của ứng dụng web.

Do class dog và cat tồn tại 2 file giống nhau nên khi gọi bạn cần phải truyền namespace để PHP phân biệt chúng.

Khai báo namespace

Cú pháp:

Trong đó: Name là tên của namespace Khi khai báo namespace thì chúng ta phải đặt nó ở phía trên cùng của file. Khi đã thiết lập namespace chúng ta cần sử dụng namespace để lấy ra class như ví dụ trên: new Animal\Dog()Name là tên của namespace Khi khai báo namespace thì chúng ta phải đặt nó ở phía trên cùng của file. Khi đã thiết lập namespace chúng ta cần sử dụng namespace để lấy ra class như ví dụ trên: new Animal\Dog()

name;
    }
}

 Nạp namespace bằng từ khóa use

Đôi khi trong những ứng dụng lớn, nhất là khi bạn sử dụng framework cấu trúc thư mục sẽ rất phức tạp và do đó namespace sẽ rất dài. Việc truyền full namespace khi gọi ra mỗi class sẽ làm cho code rất khó bảo trì và dài dòng do đó chúng ta sẽ sử dụng từ khóa use để nạp namespace trước hoặc định danh cho namespace, giúp cho code trở nên gọn gàng hơn.

getName();
//kết quả: Tom

 Ở đây thay vì phải truyền đầy đủ namespace vào từ khóa new khi khởi tạo đối tượng, bạn chỉ cần gõ tên class, PHP sẽ tự biết chỗ nhờ lệnh use phía trên để nạp class Dog trong thư mục animal.

Định danh cho namespace

Khi namespace quá dài bạn cũng có thể đặt tên lại cho nó ngắn gọi hơn bằng từ khóa as theo cú pháp sau:

use name_space_name as alias; 

getName();

11 năm trước

(Php 5> = 5.3.0, Php 7, Php 8)

  1. Trước khi thảo luận về việc sử dụng các không gian tên, điều quan trọng là phải hiểu làm thế nào PHP biết phần tử tên nào được yêu cầu. Một sự tương tự đơn giản có thể được thực hiện giữa các không gian tên PHP và hệ thống tập tin. Có ba cách để truy cập một tệp trong hệ thống tệp:
  2. Tên tệp tương đối như foo.txt. Điều này giải quyết cho currentdirectory/foo.txt nơi hiện tại là thư mục hiện đang bị chiếm. Vì vậy, nếu thư mục hiện tại là /home/foo, tên được giải quyết thành /home/foo/foo.txt.
  3. Tên đường dẫn tương đối như
    0. Điều này giải quyết đến 
    1.

Tên đường dẫn tuyệt đối như

2. Điều này giải quyết thành 
2.

  1. Nguyên tắc tương tự có thể được áp dụng cho các yếu tố đặt tên trong PHP. Ví dụ, một tên lớp có thể được đề cập theo ba cách: One caveat: unqualified names for functions and constants will resolve to global functions and constants if the namespaced function or constant is not defined. See Using namespaces: fallback to global function/constant for details.
  2. Tên không đủ tiêu chuẩn, hoặc một tên lớp không bị hủy bỏ như
    4 hoặc 
    5. Nếu không gian tên hiện tại là 
    6, điều này sẽ giải quyết thành 
    7. Nếu mã là mã toàn cầu, không được ký tên, thì điều này sẽ giải quyết thành 
    8. Một cảnh báo: Tên không đủ tiêu chuẩn cho các hàm và hằng số sẽ giải quyết cho các chức năng và hằng số toàn cầu nếu hàm tên hoặc hằng số không được xác định. Xem bằng cách sử dụng không gian tên: dự phòng vào chức năng/hằng số toàn cầu để biết chi tiết.
  3. Tên đủ điều kiện hoặc tên lớp có tiền tố như
    9 hoặc 
    name;
        }
    }
    0. Nếu không gian tên hiện tại là
    6, điều này sẽ giải quyết thành 
    name;
        }
    }
    2. Nếu mã là mã toàn cầu, không được ký tên, thì điều này sẽ giải quyết thành
    name;
        }
    }
    3.

Tên đủ điều kiện hoặc tên tiền tố với toán tử tiền tố toàn cầu như

name;
    }
}
4 hoặc
name;
    }
}
5. Điều này luôn giải quyết cho tên theo nghĩa đen được chỉ định trong mã,
7.

file1.php

name;
    }
}
7

name;
    }
}
8

name;
    }
}
9

file2.php

getName();
//kết quả: Tom
0

name;
    }
}
8

getName();
//kết quả: Tom
2

Dưới đây là một ví dụ về ba loại cú pháp trong mã thực tế:\strlen() or \Exception or

getName();
//kết quả: Tom
3.

Ví dụ #1 truy cập các lớp, chức năng và hằng số toàn cầu từ trong không gian tên

getName();
//kết quả: Tom
4

getName();
//kết quả: Tom
5

getName();
//kết quả: Tom
6

Richard tại Richard-sumilang dot com

14 năm trước

getName();
//kết quả: Tom
7

getName();
//kết quả: Tom
8

getName();
//kết quả: Tom
9

use name_space_name as alias; 
0

use name_space_name as alias; 
1

Ẩn danh ¶

7 năm trước

use name_space_name as alias; 
2

use name_space_name as alias; 
3

use name_space_name as alias; 
4

Lukas Z

10 năm trước

use name_space_name as alias; 
5

use name_space_name as alias; 
6

use name_space_name as alias; 
7

Tom tại Tomwardrop Dot Com ¶

10 năm trước

use name_space_name as alias; 
8

use name_space_name as alias; 
9

getName();
0

getName();
1

Tom tại Tomwardrop Dot Com ¶

Philip Dot Preisser tại Arcor Dot de ¶

getName();
2

getName();
3

getName();
4

getName();
5