การใช้งาน Namespace ใน PHP 5.3.x ขึ้นไป
ลองแปลจาก PHP Documentation ดูครับ ลองเอามาเทสเองบ้างเป็นบางจุด จริงๆ ก็แปลไม่หมดนะครับ หยิบยกขึ้นมาในส่วนที่คิดว่าน่าจะได้ใช้บ่อยๆ เท่านั้นเอง ตรงไหนที่ผิดพลาดบอกได้เลยนะครับจะได้แก้ไขให้ได้
Namespace
จุดประสงค์ของการใช้ Namespace ก็คือ
- Name collisions between code ป้องกันการชนกันเวลามีการใช้ชื่อ library หลายๆ ตัว
- 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
Post a Comment