Namespace trong PHP

Namespace trong PHP hướng dẫn dùng không gian tên. Namespace giúp nhóm các class, function, hằng vào một nhóm để dễ lập trình hơn.


Giới thiệu namespace trong php

Namespace nghĩa là không gian tên. Sử dụng namespace để nhóm các class, function, hằng vào trong một vùng không gian để dễ hình dung, dễ lập trình hơn.

Dùng namepace là cần thiết khi bạn code dự án có nghiệp vụ phức tạp. Mà ở đó bạn sẽ cần định nghĩa các class, các hằng giống tên nhưng khác chức năng, đặt trong namespace khác nhau.

Tạo namespace trong php

Cách 1: để tạo namespace , bạn dùng lệnh namespace tênNS; . Rồi sau đó cứ định nghĩa các class, function , các hằng ở phía dưới lệnh namespace như bình thường. Những gì định nghĩa ở dưới lệnh namespace sẽ nằm trong namespace đó cho đến khi hết file hoặc đến khi gặp namespace khác.

namespace tênNS1;
  …
  …
namespace tênNS2;
  …
  …

Cách 2: dùng cú pháp như trên nhưng dấu ngoặc {} để bao bọc những gì thuộc namespace đó.

namespace tên {
  …
  …
  …
}

Ví dụ tạo namespace trong php

<?php //ns.php
namespace SITE;
   class sanpham{
      public $id;
      function __construct(){ echo "<h4>Construct class sanpham</h4>";}
   }
   const PAGE_SIZE = 6;
   function chuhoa($str) { return mb_convert_case($str,0); }
////////////////////////////////////////////////////////////////
namespace ADMIN;
  class sanpham {
    function __construct(){echo "Construct quản trị sản phẩm<br>"; }
    function add(){ echo "<h4>Form thêm sản phẩm</h4>"; }
  }
  const PAGE_SIZE=20;
?>

Sử dụng namespace

<?php //ns_using.php
require_once "ns.php";
$sp = new SITE\sanpham; //Construct class sanpham
echo $sp = SITE\PAGE_SIZE;  //6
echo $ch = SITE\chuhoa("biết đủ"); //BIẾT ĐỦ
echo "<hr>";
$sp = new ADMIN\sanpham; //Construct quản trị sản phẩm
echo ADMIN\PAGE_SIZE; //20
echo $sp->add(); //Form thêm sản phẩm

Dùng tài nguyên từ namespace khác

Cách 1: ghi cụ thể đường dẫn theo kiểu \namespace\tainguyen

<?php //ns2.php
namespace SP {
   const PAGE_SIZE = 20;
}
namespace  BV {
    const PAGE_NUM = 5;
    echo $sodong = \SP\PAGE_SIZE + 1; //21
}
?>

Cách 2: dùng các lệnh  use const … as , use function … as ,  use ..as để đặt alias (tên mới) thay vì dùng đường path dài.

<?php //ns3.php
namespace SP {
    const PAGE_SIZE=10;
    function demSoSanPham() { return 100; }
    class sanpham {
       function __construct() { echo "<h4>class sanpham</h4>"; }
    }
}
namespace BV {
    const PAGE_NUM = 5; 
    use const \SP\PAGE_SIZE AS PS;
    use function \SP\demSoSanPham as demSP;
    use \SP\sanpham as LT;
    echo $sodong = PS +1; //11
    echo $sosp= demSP() - 1; //99
    $t = new LT; //class sanpham
}
?>

Chú ý khi dùng namespace

Khai báo namespace phải đặt ở đầu tiên trong file php. Code như sau sẽ bị lõi

<?php //ns4.php
 $x=1;
 namespace SITE;
 //...
?>

Từ khóa __NAMESPACE__

Từ khóa __NAMESPACE__ là từ khóa có sẵn, nó trả về 1 chuỗi cho biết tên của namespace hiện hành. Ví dụ:

<?php //ns4.php
namespace DIENTHOAI;
echo __NAMESPACE__ ,    "<br>"; //DIENTHOAI
function detail() { echo "<br>Func detail in ". __NAMESPACE__; }

namespace LAPTOP;
 echo __NAMESPACE__  ,  "<br>";  //LAPTOP
 function detail() { echo "<br>Func detail in ". __NAMESPACE__; }
?>
<?php //ns4_using.php
require 'ns4.php';
DIENTHOAI\detail(); //Func detail in DIENTHOAI
LAPTOP\detail();    //Func detail in LAPTOP

Namepace có cấu trúc thứ bậc

Bạn có thể định nghĩa tên các namespace có cấu trúc thứ bậc cũng được

<?php //ns5.php
namespace LAPTOP ;
   const PAGE_SIZE= 12;
namespace LAPTOP\ADMIN;
   const PAGE_SIZE = 50;
namespace LAPTOP\SITE;
   const PAGE_SIZE = 6;
<?php //ns5_using.php
use const LAPTOP\ADMIN\PAGE_SIZE as PS1; //50
include "ns5.php";
echo "<br> PAGE SIZE " , LAPTOP\PAGE_SIZE; //12
echo "<br> PS ADMIN " , PS1; //50
echo "<br> PS SITE " , LAPTOP\SITE\PAGE_SIZE; //6

Namespace không được lồng nhau

Trong php, có thể tạo các namespace có cấu trúc thì được nhưng không tạo được namepage lồng nhau đâu, như dưới đây là lỗi.

<?php //ns6.php
namespace LAPTOP {
   const PAGE_SIZE= 12;
   namespace ADMIN{
        const PAGE_SIZE = 50;
   }
}  

Một vài link để bạn tham khảo thêm :