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 namespace
phụ, 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 đếnnamespace
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
Was this helpful?