namespace 1 (ok)

https://www.brainbell.com/php/namespaces.html#creating

Creating a namespace

Để tạo một namespace trong PHP, hãy sử dụng từ khóa namespace theo sau là tên namespace. Khai báo namespace phải là dòng đầu tiên sau khi mở thẻ <? Php:

<?php
namespace brainbell;
function aFunction() {
  return true;
}
function bFunction(){
  return false;
}

Khi namespace được khai báo ở đầu tệp PHP, tất cả mã trong tệp đó thuộc về namespace đó. Trong ví dụ trên, các chức năng aFunciton và bFactor thuộc về brainbell.

Cũng có thể có hai hoặc nhiều namespace trong một tệp bằng cách gói mã cho namespace trong dấu ngoặc nhọn:

<?php
namespace first {
  // ...
 }
namespace second {
  // ...
 }
namespace {
  // the global namespace
 }

Lưu ý: Cách sử dụng này không phải là tiêu chuẩn thực hành. Mặc dù bạn có thể khai báo nhiều namespace trong một tệp PHP, nhưng đây không phải là cách thực hành mã hóa tốt.

Một tệp không khai báo từ khóa namespace ở trên cùng; thuộc về namespace toàn cầu. Ví dụ:

Global namespace

//Global namespace
<?php
 function aFunction(){
  return true;
 }

namespace example

Khi bạn đã khai báo một namespace ở đầu tệp PHP, tất cả mã trong tệp đó thuộc về namespace đó. Để sử dụng một lớp, hàm hoặc hằng được khai báo trong cùng một namespace, chỉ cần viết tên của nó như bình thường, ví dụ: $var = aFunction ();

<?php
namespace brainbell;
 //a.php
 function aFunction() {
  return true;
 }
 $var = aFunction(); //true

Để sử dụng một lớp được đặt tên, hàm hoặc hằng từ bên ngoài một namespace hãy viết tênnamespace, theo sau là dấu gạch chéo ngược \, theo sau là lớp, hàm hoặc tên hằng, ví dụ:

<?php
 //global namespace
 //b.php
 require ( 'a.php' );
 $var = brainbell\aFunction(); //true

Hãy để cùng nhau tạo ra tên hàm aFactor bên trong b.php:

<?php
 //global namespace
 //b.php
 require ( 'a.php' );
 function aFunction() {
  return 'hello world';
 } 
 $var1 = aFunction(); // hello world
 $var  = brainbell\aFunction(); // true

Ví dụ trên sẽ tạo ra lỗi sau nếu bạn loại bỏ namespace brainbell; từ đầu tệp a.php:

Nhờ namespace PHP, tên của cả hai hàm aFunction () không còn xung đột.

Sub-namespaces

Bạn cũng có thể tạo các namespacephụ, giống như các thư mục con (hoặc thư mục con) trong một hệ thống tệp. Điều này cho phép bạn tạo một hệ thống phân cấp namespace. Bạn tách từng cấp độ namespace bằng một backslash \ character:

<?php
namespace brainbell\template

Đoạn mã trên khai báo namespace template bên trong namespace của brainbell . Hãy để khai báo hàm cùng tên aFactor bên trong tệp tên không gian con sub-namespaced và lưu nó dưới dạng c.php.

<?php
namespace brainbell\template
//c.php
function aFunction(){
 return 100;
}

Tiếp theo, chỉnh sửa b.php (mà chúng tôi đã tạo trong ví dụ trước) và bao gồm tệp c.php. Bây giờ bạn có thể thấy rằng tất cả các tệp a.php, b.php và c.php đã khai báo hàm aFactor () nhưng chúng không xung đột với nhau cũng như không tạo ra bất kỳ lỗi nào vì tất cả chúng đều ở các namespace khác nhau:

<?php
 //b.php
 require ( 'a.php' ); // brainbell
 require ( 'c.php' ); // brainbell\template
 function aFunction() {
  return 'hello world';
 }
 $var  = aFunction(); // hello world
 $var1 = brainbell\aFunction(); // true
 $var2 = brainbell\template\aFunction(); //100
 //Print information
 echo '<pre>';
 var_dump($var);
 var_dump($var1);
 var_dump($var2);

Hãy để cùng nhau tạo một tập tin d.php khác và viết đoạn mã sau để gọi brainbell\template\aFunction() từ mã nằm trong namespace của brainbell :

<?php
namespace brainbell;
//d.php
require ('c.php'); 
//brainbell\template
$var = template\aFunction(); //100
var_dump($var);

Bạn có thể chỉ định các namespace bằng cách sử dụng ký hiệu tương đối, giống như làm việc với các đường dẫn tương đối.

Namespace aliases

Nếu bạn làm việc với một hệ thống phân cấpnamespace lớn, việc chỉ định tên namespace đầy đủ mỗi lần có thể gây mệt mỏi:

<?php
require 'c.php';
$var = brainbell\template\db\views\aFunction();

Để giải quyết vấn đề này, bạn có thể sử dụng bí danh namespace, hoạt động giống như một liên kết tượng trưng trong các hệ thống tệp UNIX. Để tạo bí danh bạn viết:

use namespace as alias;

Khi bạn đã tạo một bí danh, bạn có thể sử dụng nó thay cho tênnamespaceđầy đủ:

<?php
require 'c.php';
use brainbell\template\db\views as dbviews;
$var = dbviews\aFunction();

Bạn có thể bỏ qua câu lệnh as (và tên theo sau), trong trường hợp đó, câu lệnh use sử dụng phần cuối của tên namespace làm bí danh. Vì vậy, hai dòng mã sau đây là tương đương:

use brainbell\template\db\views as views;
use brainbell\template\db\views;

Summary

namespace giúp bạn tránh đặt tên xung đột giữa các thư viện hoặc mã chia sẻ khác.

Cũng như các hàm, bạn cũng có thể sử dụng các namespace với các lớp và hằng (nhưng bạn phải khai báo chúng bằng từ khóa const chứ không phải với định nghĩa ()).

Có thể có nhiều namespace trong một tệp, nhưng không được khuyến khích.

Nếu bạn đang làm việc trong một namespace, thì trình thông dịch sẽ cho rằng các tên đó có liên quan đến namespace hiện tại.

Bạn có thể sử dụng từ khóa use để nhập hoặc bí danh một namespace, lớp, hàm hoặc hằng số:

<?php
require 'c.php';
//namespace aliasing
use brainbell\template as tpl;
//function aliasing, since PHP 5.6
use function brainbell\template\aFunction as myfnc;
//constant aliasing, since PHP 5.6
use const name\space\constName as cnst;

Last updated