การใช้งาน Namespace ใน PHP 5.3.x ขึ้นไป

ลองแปลจาก PHP Documentation ดูครับ ลองเอามาเทสเองบ้างเป็นบางจุด จริงๆ ก็แปลไม่หมดนะครับ หยิบยกขึ้นมาในส่วนที่คิดว่าน่าจะได้ใช้บ่อยๆ เท่านั้นเอง ตรงไหนที่ผิดพลาดบอกได้เลยนะครับจะได้แก้ไขให้ได้

Namespace
จุดประสงค์ของการใช้ Namespace ก็คือ
  1. Name collisions between code ป้องกันการชนกันเวลามีการใช้ชื่อ library หลายๆ ตัว
  2. Ability to alias (or shorten) Extra_Long_Names ย่อชื่อยาวๆ ให้มันสั้นลงได้


# การประกาศใช้ Namespaces
<?php
namespace MyProject


# การใช้ Namespace จะต้องอยู่บนสุดของไฟล์เท่านั้น ห้ามมี echo หรือ แสดง html ก่อน
<html>
<?php
namespace MyProject; // fatal error - namespace must be the first statement in the script


# การประกาศใช้ Sub-namespace
<?php
# รูปแบบในการใช้งาน
namespace MyProject\Sub\Level;


# การประกาศใช้ แบบหลายๆ Namespaces
<?php
namespace MyProject;


const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }


namespace AnotherProject;


const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }


Using namespaces: Basics

เรามาดูตัวอย่างกันดีกว่า


# file1.php
namespace Foo\Bar\subnamespace;


const FOO = 1;
function foo() {}
class foo{
   static function staticmethod() {}
}


# file2.php
namespace Foo\Bar;
include 'file1.php';


const FOO = 2;
function foo() {}
class foo{
   static function staticmethod() {}
}

# ตัวอย่าง
# การเรียกใช้งานแบบไม่มีเงื่อนไข วิธีการเรียกแบบนี้มันจะเรียกจาก Namespace อันล่าสุด(นึกภาพโค้ดมัน Compile จากบนลงล่าง)
foo(); # เรียกจาก file2.php
foo::staticmethod(); # เรียกจาก file2.php


# การเรียกแบบมีเงื่อนไข จะเป็นการใส่ Sub namespace ลงไปกำกับด้วย
subnamespace\foo(); # เรียกจาก file1.php
subnamespace\foo::staticmethod() # เรียกจาก file1.php
echo subnamespace\FOO;
* วิธีที่เรียกใช้ Sub-namespace แบบนี้ได้มีเงื่อนไขก็คือ Parent ของ Sub จะต้องมีชื่อเหมือนกันกับ namespace ที่ไฟล์นี้เรียกใช้เท่านั้น


# การเรียกแบบเต็มๆ (โดยส่วนตัวคิดว่า เรียกใช้แบบนี้ชัวร์กว่านะ เป๊ะด้วย)
\Foo\Bar\subnamespace\foo::staticmethod(); # เรียกจาก file1.php
echo \Foo\Bar\subnamespace\FOO;


\Foo\Bar\foo::staticmethod(); # เรียกจาก file2.php
echo \Foo\Bar\FOO;

Using namespaces: Aliasing/Importing

เป็นอีกหนึ่งหัวข้อที่ผมคิดว่าน่าสนใจจาก Document เลยหยิบยกขึ้นมา


# การย่อชื่อ
use My\Full\Classname as Another;
เวลาที่เราเรียกใช้ Another จะเหมือนกับเป็นการเรียกใช้ My\Full\Classname


# ตัวอย่างเช่น file1.php
namespace My\Full\Classname;
const FOO = 1;


# file2.php
include ‘file1.php’;
use My\Full\Classname as Another;


echo Another\FOO; # 1


แบบนี้เป็นต้น


# ถ้าไม่มี as
use My\Full\NSname;
เวลาเรียกใช้งานสามารถใช้ NSname ได้เลย



Global space

<?php
namespace A\B\C;


/* ฟังก์ชั่นนี้คือ A\B\C\fopen */
function fopen() {
    /* ... */
    $f = \fopen(...); // ใส่ Back slash(\) เพื่อกลับไปเรียกใช้ฟังก์ชั่น fopen ของ php
    return $f;

}

ทำเอาไว้ใน Google Drive ด้วยนะครับเผื่อใครอยากจะเอาไปแชร์ต่อ

Comments