Namespace 2 (ok)

https://toidicode.com/namespace-trong-php-107.html

https://www.php.net/manual/en/language.namespaces.basics.php

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 được phần tử không gian tên nào mà mã của bạn đang 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à một hệ thống tập tin. Có ba cách để truy cập tệp trong hệ thống tệp:

  1. Tên tệp tương đối như foo.txt. Điều này giải quyết thành currentdirectory/foo.txt trong đó currentdirectory là thư mục hiện đang chiếm. Vì vậy, nếu thư mục hiện tại là /home/foo, tên sẽ chuyển thành /home/foo/foo.txt.

  2. Tên đường dẫn tương đối như thư mục subdirectory/ foo.txt. Điều này giải quyết cho currentdirectory /subirectory/foo.txt.

  3. Tên đường dẫn tuyệt đối như /main/foo.txt. Điều này giải quyết thành /main/foo.txt.

Nguyên tắc tương tự có thể được áp dụng cho các phần tử được đặt tên trong PHP. Ví dụ, một tên lớp có thể được gọi theo ba cách:

1. Tên không đủ tiêu chuẩn hoặc tên lớp chưa được xác định như $a = new foo(); hoặc foo :: staticmethod ();. Nếu không gian tên hiện tại là tên hiện tại, điều này sẽ phân giải thành tên hiện tại foo. Nếu mã là toàn cầu, mã không có tên, mã này sẽ giải quyết thành foo. Một cảnh báo: tên không đủ tiêu chuẩn cho các hàm và hằng sẽ phân giải thành các hàm và hằng toàn cục nếu hàm hoặc hằng số được đặt tên không được xác định. Xem Sử dụng không gian tên: dự phòng cho hàm toàn cầu / hằng số để biết chi tiết.

1.1.

Link: https://www.php.net/manual/en/language.namespaces.fallback.php

Sử dụng không gian tên: dự phòng cho hàm toàn cầu / hằng số

Trong một không gian tên, khi PHP gặp một Tên không đủ tiêu chuẩn trong một tên lớp, hàm hoặc bối cảnh không đổi, nó giải quyết chúng với các ưu tiên khác nhau. Tên lớp luôn phân giải thành tên không gian tên hiện tại. Do đó, để truy cập các lớp người dùng nội bộ hoặc không có tên, người ta phải tham chiếu đến họ với Tên đủ điều kiện của họ như trong:

Truy cập các lớp toàn cầu trong một không gian tên

<?php
namespace A\B\C;
class Exception extends \Exception {}
$a = new Exception('hi'); // $a is an object of class A\B\C\Exception
$b = new \Exception('hi'); // $b is an object of class Exception
$c = new ArrayObject; // fatal error, class A\B\C\ArrayObject not found
?>

Đối với các hàm và hằng, PHP sẽ quay trở lại các hàm hoặc hằng toàn cục nếu một hàm hoặc hằng số được đặt tên không tồn tại.

các hàm / hằng toàn cục dự phòng trong một không gian tên

Bạn có thể sử dụng chính sách dự phòng để cung cấp giả cho các hàm dựng sẵn như time (). Do đó, bạn phải gọi các chức năng đó không đủ tiêu chuẩn:

2. Tên đủ điều kiện hoặc tên lớp có tiền tố như $a = new subnamespace\foo(); hoặc subnamespace\foo::staticmethod();. Nếu không gian tên hiện tại là không gian tên hiện tại, điều này sẽ phân giải thành tên currentnamespace\subnamespace\foo. Nếu mã là toàn cục, mã không có tên, mã này sẽ phân giải thành tên subnamespace\foo.

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ư $a = new \currentnamespace\foo(); hoặc \currentnamespace\foo::staticmethod();. Điều này luôn phân giải thành tên bằng chữ được chỉ định trong mã, tên currentnamespace\foo.

Example 1:

// File 1
<?php
namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() {}
class foo {
  static function staticmethod() {}
}
?>
// File 2
<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo {
  static function staticmethod() {}
}
/* Unqualified name */
foo(); // resolves to function Foo\Bar\foo
foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO
/* Qualified name */
subnamespace\foo(); // resolves to function Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // resolves to class Foo\Bar\subnamespace\foo,
// method staticmethod
echo subnamespace\FOO; // resolves to constant Foo\Bar\subnamespace\FOO
/* Fully qualified name */
\Foo\Bar\foo(); // resolves to function Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo \Foo\Bar\FOO; // resolves to constant Foo\Bar\FOO
?>
Result: 212

Example 2: Truy cập các lớp, hàm và hằng toàn cục từ trong một không gian tên

<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); // calls global function strlen
$b = \INI_ALL; // accesses global constant INI_ALL
$c = new \Exception('error'); // instantiates global class Exception
echo $a;
echo '<pre>';
	var_export($b);
echo '</pre>';
echo '<pre>';
	var_export($c);
echo '</pre>';
?>

Trong một dự án lớn có bao giờ bạn nghĩ đến trường hợp là sẽ xảy ra các class có trùng tên nhau không? Chính vì điều đó mà kể tử phiên bản PHP 5.3 trở đi thì PHP có hỗ trợ cho chúng ta chức năng mới là namespace ...

Mục Lục

1, Namespace là gì?

- Namespace giúp tạo ra một không gian tên cho hàm và lớp trong lập trình nói chung và trong PHP nói riêng.

-Vì ở đây là series hướng đối tượng nên mình sẽ chỉ trình bày về namespace trong hướng đối tượng, trong hướng đối tượng thì namespace có tác dụng tạo ra định danh cho lớp một cách cụ thể hóa hơn.

VD: như chúng ta có 2 file mỗi file đều chứa một class và 2 class này lại có một điểm chung là trùng tên. Giờ đây khi bạn nhúng cả 2 file này vào và gọi class thì ngay lập tức chương trình sẽ báo lỗi. Để khắc phục điều đó thì chúng ta cần khai báo namespace cho hai class đó (đọc tiếp để xem cách khai báo).

2, Khai báo namespace.

-Để khai báo namespace trong PHP chú ta sử dụng cú pháp sau:

namespace Name;

Trong đó: Name là tên của namespace.

Chú ý: khi khai báo namespace thì chúng ta phải đặt nó ở phía trên cùng của file. Hơn nữa nếu như bạn muốn đặt tên namespace đúng chuẩn thì hãy tham khảo series PHP standards.

VD:

class Package
{
    public function sayHello()
    {
        echo 'Hello World!';
    }
}

-Và bạn cũng có thể hoàn toàn đặt tên namespace theo các cấp được.

VD: Tạo một class HomeController trong thư mục app\controllers và đặt tên namespace như sau:

namespace App\Controllers;

class HomeController
{
    //code
}

3, Gọi namespace.

- Khi mà một class đã được một namespace định danh thì bạn sẽ không thể gọi theo cách thông thường được nữa mà phải gọi với cú pháp:

new tenNamespace\tenClass();

VD:

-Tạo một file ConNguoi.php có nội dung như sau:

<?php

namespace ConNguoi;

class ConNguoi
{
    private $name = 'Con Người';

    public function getName()
    {
        return $this->name;
    }
}

-Tiếp đó tạo một file index.php cùng cấp với file ConNguoi.php và lúc này chúng ta sẽ phải gọi class ConNguoi như sau:

<?php

include 'ConNguoi.php';

$connguoi = new ConNguoi\ConNguoi();

echo $connguoi->getName();
//kết quả: Con Người

Nạp namespace bằng use

-Nếu như bạn không muốn gọi namespace theo cách trên thì bạn sử dụng từ khóa use để nạp theo cú pháp sau:

use tenNamespace\tenClass;

Chú ý: Khai báo nạp namespace cũng phải được đặt trên đầu của một file, nếu như trong một file có sử dụng namespace và use thì use sẽ được đặt dưới namespace.

VD: Mình sẽ sử dụng use để nạp namespace của class ConNguoi, khi đó file index.php sẽ được viết như sau:

<?php

include 'ConNguoi.php';

use ConNguoi\ConNguoi;

$connguoi = new ConNguoi();

echo $connguoi->getName();
//kết quả: Con Người

VD: Một file mà có khai báo namespace và use thì sẽ viết như sau:

<?php

namespace nguoilon;

include 'ConNguoi.php';

use ConNguoi\ConNguoi;

class NguoiLon extends ConNguoi
{
    //code
}

4, Định danh cho namespace.

-Giả sử namespace của chúng ta rất dài hoặc vì một lý do nào đó mà bạn không muốn gọi namespace như thế, thì PHP cũng có cung cấp cho chúng ta một phương pháp đó là tạo định danh cho namespace.

-Để tạo định danh mới cho namespace trong PHP chúng ta sử dụng từ khóa as với cú pháp như sau:

use tenNamespace as tenMoi;

VD: Tạo định danh cho namespace ConNguoi ở trên.

<?php

include 'ConNguoi.php';

use ConNguoi as People;

$connguoi = new People\ConNguoi();
echo $connguoi->getName();
//kết quả: Con Người

5, Nhiều namespace trong một file.

-Như ở trên mình có nói là khi khai báo namespace thì chúng ta phải đặt ở đầu file, nhưng nếu như ở trong một file có nhiều namespace thì chúng ta sẽ khai báo như sau:

namespace nameone;

class ClassOne
{
    //
}

namespace nametwo;

class ClassTwo
{
    //
}

VD:

-Tạo một file Class.php có nội dung như sau:

<?php

namespace Class\ConNguoi;

class ConNguoi
{
    private $name = 'Con Người';

    public function getName()
    {
        return $this->name;
    }
}

namespace Class\NguoiLon;

class NguoiLon
{
    private $name = 'Nguoi Lon';

    public function getName()
    {
        return $this->name;
    }
}

-Và chúng ta sẽ tạo một file index.php để gọi 2 class đó như sau:.

<?php

include 'ConNguoi.php';

$connguoi = new Class\ConNguoi\ConNguoi();
echo $connguoi->getName();
//kết quả: Con Người

$nguoilon = new Class\NguoiLon\NguoiLon();
echo $nguoilon->getName();
//kết quả: Nguoi Lon

6, Lời Kết.

-Như vậy mình đã trình bày xong về namespace trong PHP rồi, hy vọng mọi người có thể nắm chắc kiến thức này để khi học các PHP framework như Laravel, Zend,... khỏi bị bỡ ngỡ. Bài tiếp theo chúng ta sẽ tìm hiểu về Trait trong PHP.

Last updated