/ / Php nâng cao / Comments (7)

Namespace trong PHP 5.3.x

Đối với nhiều ngôn ngữ lập trình (như C++, Java…) thì khái niệm Namesapce đã quá quen thuộc,nhưng đối với ngôn ngữ lập trình PHP thì có lẽ sẽ có nhiều bạn còn mơ hồ về khái niệm này.Từ phiên bản PHP 5.3.X trở đi thì PHP đã có thêm 1 chức năng nữa là namespace.Và hôm trong bài này mình sẽ hướng dẫn các bạn làm quen với khái niệm này và cách sử dụng nó nhé.

Giới thiệu về Namespace trong PHP 5.3.x

A. Tại sao lại có chức năng namespace?

– Với những yêu cầu thực tế khi chúng ta xây dựng 1 dự án lớn,hoặc sử dụng 1 framework nào đó có rất nhiều file,rất nhiều class và phương thức và khi chúng ta sử dụng vô tình nạp các class hoặc các hàm hoặc các hằng có cùng tên như vậy lúc này hệ thống sẽ không thể biết được là bạn đang cần sử dụng lớp nào,hàm nào phải không nào.Chính vì vậy các framework mới bây giờ hầu hết đều sử dụng tới Namesapce ví dụ trong Zend framework 2.x,Laravel framework
– Ở phiên bản zend framework 1.x dựa vào thư viện để đọc và làm việc trên các lớp một cách rất cụ thể. Bởi đường dẫn chi tiết của chúng đã được thể hiện rõ nét ngay trên tên của chúng. Kỹ thuật này trong OOP (lập trình hướng đối tượng) còn gọi là lazy loading.Ví dụ : new Zend_Controller_Action.
Có nghĩa là nó sẽ tìm từ zend/controller/action.php.Như vậy để load được 1 class phải xử lý rất nhiều phải không nào.Nhận thấy sự bất cập này lên Từ phiên bản PHP 5.3.X trở đi thì PHP đã bổ xung thêm namespace để tạo định danh cho các lớp 1 cách rõ ràng hơn

B. Các sử dụng Namespace ?

– Để sử dụng namespace, chúng ta định nghĩa bằng cách dùng từ khóa namespace để tạo vùng định danh.
– Định nghĩa một không gian tên phải được đặt ở trên cùng,phía trên của định nghĩa này không được có khoảng trống và mã html.
Ví dụ:
+ Tạo 1 test1.php với nội dung sau:

<?php
namespace HocPHP;
class test{
    public function demo(){
        echo "Sử dụng Namespace trong PHP 5.3.x tại Hocphp.info";
    }
} 

+ Tạo 1 test2.php với nội dung sau:

<?php
require("test1.php");
$b = new test;
$b->demo();

Và khi các bạn chạy file test2.php sẽ báo lỗi như sau:

Fatal error: Class ‘test’ not found in C:\xampp\htdocs\demo\test2.php on line 3

Như vậy là các bạn thấy hệ thống không thể tìm thấy classs test đâu cả vì toàn bộ nội dung của file test1.php đã được bảo vệ do sử dụng namespace HocPHP.vậy là dù chúng ta có gọi tới file đó thì cũng không thể truy cập vào lớp hoặc phương thức trong file này được.Vậy để sử dụng được lớp và phương thức này trong file test2.php ta sẽ viết lại nội dung như sau:

require("test1.php");
$b = new HocPHP\test;
$b->demo();

+ Với ví dụ trên chúng ta sẽ chạy được kết quả như ý muốn,và các bạn thấy việc sử dụng namespace thật đơn giản phải không nào.Ngoài ra các bạn còn có thể dùng cho cả hằng như sau:
Ví dụ:
+ Tạo 1 test1.php với nội dung sau:

<?php
namespace HocPHP;
const TITLE="Hoc php online";
} 

+ Tạo 1 test2.php với nội dung sau:

<?php
require("test1.php");
echo HocPHP\TITLE;

– Khi các bạn chạy file test2.php sẽ hiển thị được nội dung hằng TITLE trong file test1.php

C.Tạo namespaces theo cấu trúc phân cấp

– Ngoài cách định nghĩa không tin tên đơn giản như trên thì các bạn hoàn toàn có thể định nghĩa không gian tên này theo dạng phân cấp.
Ví dụ:
+ Tạo 1 test1.php với nội dung sau:

<?php
namespace Application\HocPHP;
class test{
    public function demo(){
        echo "Sử dụng Namespace trong PHP 5.3.x tại Hocphp.info";
    }
} 

+ Tạo 1 test2.php với nội dung sau:

<?php
require("test1.php");
$b = new Application\HocPHP\test;
$b->demo();

D. Nạp, gọi thêm một namespace từ bên ngoài

PHP 5.3 hỗ trợ từ khóa use. Với từ khóa này chúng ta hoàn toàn có thể triệu gọi 1 namespace từ bên ngoài vào dễ dàng.
Ví dụ:
+ Tạo 1 test1.php với nội dung sau:

<?php
namespace HocPHP;
class test{
    public function demo(){
        echo "Sử dụng Namespace trong PHP 5.3.x tại Hocphp.info";
    }
} 

+ Tạo 1 test2.php với nội dung sau:

<?php
namespace HocPHP2;
require 'test1.php';
use HocPHP;
class test2{
    public function demo2(){
        $test1 = new HocPHP\test;
        echo $test1->demo();
    }
} 
$test1= new test2;
$test1->demo2();

+ Với ví dụ trên chúng ta sẽ chạy được kết quả như ý muốn,như các bạn thấy trong file test2.php có thể sử dụng namespace của của file test1.php thông qua từ khóa use,và trong phương thức demo2() chúng ta có thể khởi tạo lớp test và sử dụng các phương thức 1 cách dễ dàng

E.Sử dụng định danh cho Namespace

Đối với những tên định danh quá dài, chúng ta có thể xem xét dùng từ khóa as để định danh chúng.
Ví dụ:
+ Tạo 1 test1.php với nội dung sau:

<?php
namespace Application\Controller\HocPHP;
class test{
    public function demo(){
        echo "Sử dụng Namespace trong PHP 5.3.x tại Hocphp.info";
    }
} 

+ Tạo 1 test2.php với nội dung sau:

<?php
require("test1.php");
use Application\Controller\HocPHP as PHP;
$b = new PHP\test;
$b->demo();

– Kết thúc bài viết: Qua bài này mình đã giới thiệu cho các bạn về khái niệm cũng như cách sử dụng Namespace trong PHP 5.3.x,nó cũng rất dễ sử dụng phải không nào.Nếu các bạn muốn nghiên cứu tới các PHP framework mới thì cần nắm vững về cách sử dụng Namespace này.



20/09/2014
Written by nobitacnt

Trong bài viết không tránh khỏi những câu từ chưa chính xác,mong nhận được sự góp ý để website hoàn thiện hơn.Nếu thấy bài viết có ích với bạn hãy like và share để ủng hộ nhé :D.

Bài viết chùng chuyên mục

7 Comments

  1. daragon says:
     /  Reply

    Thanks chủ thớt nhé giờ mới biết tới cài này,không biết ứng dụng thực tế của nó sử dụng trong những trường hợp nào

  2. The River says:
     /  Reply

    Cám ơn ad. Bài viết đơn giản và dễ hiểu

  3. Can ho Saigonres says:
     /  Reply

    Bài viết bổ ích, nghe nói rất nhiều về Namespace giờ mới biết công dụng của nó.

  4. tam says:
     /  Reply

    tại sao phải dùng use trong phần D. Nạp, gọi thêm một namespace từ bên ngoài vậy admin. Những ví dụ trước không dùng

    • nobitacnt says:
       /  Reply

      Trong phần đó mình có giải thích ngay trong đó rồi mà bạn.Nó triệu 1 namespace từ bên ngoài vào để sử dụng trong namespace hiện tại.

  5. Nguyễn Hưởng says:
     /  Reply

    Sử dụng namespace dạng phân cấp nhằm mục đích gì vậy ad, mình chỉ thấy nó dài hơn thôi

    • Hoàng văn Tuyền says:
       /  Reply

      Khi mà ứng dụng của bạn sử dụng nhiều namespace thì cần phân cấp thư mục ra cho dễ quản lý.

Gửi bình luận

Giới thiệu

Mình tạo ra blog này với mong muốn chia sẻ và học hỏi kinh nghiệm trong quá trình thiết kế website. Website đang trong quá trình phát triển chân thành cảm ơn mọi sự góp ý của các bạn để làm cho website ngày càng hoàn thiên.

DMCA.com Protection Status
Theo dõi qua Email

Tổng hợp các bài viết về

Hoc php - CodeIgniter Framework - Laravel Framework - PHP va MYSQL