Skip to content

PlusMagi's Blog By Pitt Phunsanit

Plus emotional magic to the knowledge of logic.

  • About’s Pitt
Close Button

PHP: การใช้ Attributes แทนการเขียน Docblocks AnnotationsPHP: การใช้ Attributes แทนการเขียน Docblocks Annotations

2020-12-132020-12-13| phunsanitphunsanit| 0 Comment | 07:00

การมาถึงของ PHP 8.0 ได้เปลี่ยนผ่านฟีเจอร์สำคัญอย่างหนึ่งที่นักพัฒนาเรียกร้องมานาน นั่นคือ Attributes (หรือที่ภาษาอื่นเรียกว่า Annotations) ซึ่งเข้ามาแทนที่การเขียน Docblock Annotations แบบเดิม ๆ ที่เราคุ้นเคยในอดีต เช่น ใน Doctrine ORM หรือ Symfony

บทความนี้จะพาไปดูว่าทำไมเราถึงควรเลิกใช้ Docblocks แล้วหันมาใช้ Attributes แทน พร้อมตัวอย่างการเปรียบเทียบและการนำไปใช้งานจริงครับ


🛑 ปัญหาของ Docblock Annotations แบบเดิม

ที่ผ่านมา PHP ไม่ได้มีระบบ Metadata ติดมากับตัวภาษา ทำให้นักพัฒนาต้องอาศัย PHPDoc คอนเมนต์ (/ ... */) ควบคู่กับ Library ภายนอกเพื่ออ่านคอมเมนต์เหล่านั้นมาตีความ ซึ่งมีข้อเสียหลัก ๆ ดังนี้

  • เป็นแค่ String (Plain Text): คอมเมนต์ก็คือคอมเมนต์ ตัว PHP Engine ไม่ได้ช่วยตรวจสอบความถูกต้อง (Syntax Error) ถ้าคุณพิมพ์คำสะกดผิด โปรแกรมจะไม่พังจนกว่าจะรันไปเจอตอนใช้งาน
  • พึ่งพาเครื่องมือภายนอก: ต้องใช้โค้ดจำพวก doctrine/annotations มาช่วย Parsing คอมเมนต์ออกมาเป็น Object อีกที
  • มีผลต่อ Performance: การอ่านคอมเมนต์และ Parse สตริงในทุก ๆ Request ส่งผลกระทบต่อความเร็วของระบบ

✨ Attributes คืออะไร?

Attributes คือระบบ Native Metadata ที่ฝังอยู่เป็นส่วนหนึ่งของภาษา PHP (ตั้งแต่ PHP 8.0+) มีหน้าที่ประกาศข้อมูลอธิบายส่วนต่าง ๆ ของโค้ด เช่น Class, Method, Function, Property หรือ Parameter โดยใช้โครงสร้าง #[AttributeName]

ข้อดีของ Attributes

  1. Native Syntax: ทำงานโดย PHP Core โดยตรง ไม่ต้องพึ่งพา External Parser
  2. Type Safety & Validation: เนื่องจากมันเป็นโค้ด PHP จริง ๆ ถ้าเราพิมพ์ชื่อ Attribute ผิด หรือส่ง Argument ผิดประเภท ตัว PHP จะแจ้ง Syntax Error หรือ ArgumentCountError ทันที
  3. Performance ดีกว่า: PHP จัดการคอมไพล์และแคช Attributes ได้ดีกว่าการอ่าน Text คอมเมนต์

🔍 เปรียบเทียบ: Docblocks VS Attributes

ลองมาดูการเปรียบเทียบการสร้าง Route ใน Controller ระหว่างรูปแบบเก่าและรูปแบบใหม่กันครับ

แบบเก่า: Docblock Annotation

use Symfony\Component\Routing\Annotation\Route;

class ProductController
{
    /**
     * @Route("/product/{id}", name="product_show", methods={"GET"})
     */
    public function show(int $id)
    {
        // ...
    }
}

แบบใหม่: PHP Attributes (ตั้งแต่ PHP 8.0+)

use Symfony\Component\Routing\Attribute\Route;

class ProductController
{
    #[Route('/product/{id}', name: 'product_show', methods: ['GET'])]
    public function show(int $id)
    {
        // ...
    }
}

ข้อสังเกต: ใน Attributes เราสามารถใช้ Named Arguments (name: 'product_show') ของ PHP 8.0 ร่วมด้วยได้ ทำให้โค้ดอ่านง่ายและกระชับขึ้นมาก โดยไม่ต้องใส่ปีกกา {} ซ้อนกันให้วุ่นวายแบบ Docblock


🛠️ วิธีการสร้างและใช้งาน Attributes เอง (Custom Attributes)

เราสามารถสร้าง Attribute ขึ้นมาใช้เองภายในโปรเจกต์ได้ง่าย ๆ ด้วยการประกาศ Class และใส่ Attribute #[Attribute] ไว้บนหัว Class นั้น

Step 1: สร้าง Attribute Class

namespace App\Attributes;

use Attribute;

#[Attribute(Attribute::TARGET_METHOD)] // กำหนดให้ใช้ได้เฉพาะกับ Method เท่านั้น
class RolesAllowed
{
    public array $roles;

    public function __construct(string ...$roles)
    {
        $this->roles = $roles;
    }
}

Step 2: นำไปใช้งานกับ Method

use App\Attributes\RolesAllowed;

class AdminController
{
    #[RolesAllowed('admin', 'superadmin')]
    public function deleteUser(int $userId)
    {
        // โค้ดลบข้อมูลผู้ใช้งาน
    }
}

Step 3: การอ่านค่าด้วย Reflection API

การดึงค่าจาก Attribute มาใช้งาน จะใช้ความสามารถของ Reflection API ใน PHP ครับ

$reflectionMethod = new ReflectionMethod(AdminController::class, 'deleteUser');

// ดึง Attributes ทั้งหมดที่ชื่อ RolesAllowed ออกมา
$attributes = $reflectionMethod->getAttributes(RolesAllowed::class);

if (!empty($attributes)) {
    // แปลงกลับมาเป็น Instance ของ Class RolesAllowed เพื่อใช้งาน
    $rolesAllowedInstance = $attributes[0]->newInstance();
    
    // ดึงข้อมูล Roles ออกมาเช็ค
    $allowedRoles = $rolesAllowedInstance->roles; 
    
    print_r($allowedRoles); // ผลลัพธ์: ['admin', 'superadmin']
}

📊 ตารางสรุปความแตกต่าง

คุณสมบัติDocblock AnnotationsPHP Attributes (PHP 8+)
ประเภทเป็นเพียง “คอมเมนต์” (Text)เป็น “โครงสร้างภาษา” (Native Code)
ความเร็ว (Performance)ช้ากว่า (ต้องใช้ Regex/Parser)เร็วกว่า (PHP Core จัดการให้)
การตรวจสอบข้อผิดพลาดตรวจสอบยาก (IDE อาจไม่เตือน)ตรวจสอบทันที (Syntax Error / Static Analysis)
การพิมพ์คำสั่งใช้ @ นำหน้าคำสั่งใช้ #[ ] ครอบคำสั่ง
การจัดรูปแบบข้อมูลใช้ JSON-like หรือ Syntax เฉพาะใช้ Array และ Named Arguments ของ PHP ได้เลย

💡 สรุป

การเปลี่ยนมาใช้ Attributes แทน Docblock Annotations ไม่เพียงแต่ทำให้โค้ดของคุณดูเป็นระเบียบและทันสมัยขึ้น แต่ยังช่วยลดข้อผิดพลาดในระบบ (Human Error) จากการพิมพ์คอมเมนต์ผิด และเพิ่มประสิทธิภาพในการทำงานของแอปพลิเคชันอีกด้วย

หากคุณกำลังขึ้นโปรเจกต์ใหม่ด้วย PHP 8+ หรือกำลังใช้ Framework เวอร์ชันปัจจุบัน แนะนำให้ปรับมาใช้ Attributes เต็มตัวได้เลยครับ!


อ่านเพิ่มเติม

  • PHP: Attributes
  • PHP: Constructor Property Promotion
  • PHP: Nullsafe Operator (?->)
Read MoreRead More

Posts pagination

ก่อนหน้า 1 … 510 511 512 … 4,506 ถัดไป

Projects

  • Statement Columns Mapping Helper
  • PlusMagi Site Search
  • PlusMagi Tags Reindex
  • jQuery Plus Repeater

Recent Posts

  • SMR: Small Modular Reactors
  • Project Hail Mary: สองชีวิตต่างโลก กับหนึ่งภารกิจ สะเทือนจักรวาล
  • ขึ้นทางด่วนคุ้มไหม? วิธีตั้งค่า Google Maps คำนวณค่าผ่านทาง เทียบเวลาและค่าน้ำมันให้เห็นชัด ๆ
  • เลิกปวดหัวกับทางลัดมหาภัย: วิธีตั้งค่า Google Maps ให้เลือก “ทางขับง่าย” มากกว่า “เร็วกว่าแค่ 1-2 นาที”
  • OOD: Object-Oriented Design

Archives

Categories

  • .net core (16)
  • AI (52)
  • business (34)
  • Businesses (33)
  • cd (59)
  • ci (62)
  • culture (2)
  • data (5)
  • Design (160)
    • UX/UI (23)
  • devops (200)
  • devsecops (35)
  • dotnet (58)
  • envoy (2)
  • Histories (22)
  • history (2)
  • ios (4)
  • Life (1,210)
    • Books (59)
    • Cartoon (13)
    • Mindset (41)
    • Movies (35)
    • Philosophy (4)
    • Psychology (3)
    • Sci-Fi (53)
    • Tips and Tricks (67)
    • ปรัชญา (267)
    • พัฒนาตนเอง (883)
    • พุทธ (70)
    • สิ่งแวดล้อม (47)
  • mobile (1)
  • mystery (8)
  • net core (10)
  • Network (353)
    • Apache HTTP Server (19)
    • IOT (24)
    • Nginx (41)
    • Stalwart (6)
  • networking (131)
  • Operating Systems (448)
    • Unix-like (313)
      • Android (24)
        • F-Droid (5)
      • Homebrew (22)
      • iPhone (12)
      • Linux (195)
      • macOS (135)
        • OrbStack (12)
      • Oh My ZSH (4)
      • Shell Script (80)
      • SSH (15)
    • Windows (163)
      • PowerShell (28)
      • WSL (25)
  • Programming (1,714)
    • .NET (68)
      • .NET Core EF (7)
      • C# (60)
    • API (145)
      • REST (54)
      • Swagger (13)
    • Database (412)
      • DBeaver (5)
      • MariaDB (38)
      • MySql (81)
      • Oracle Database (8)
        • 10g (3)
      • PostgreSQL (30)
      • RDBMS (78)
      • SQL Server (91)
        • SSMS (10)
        • T-SQL (30)
      • SQLite (2)
    • PowerBuilder (20)
    • Python (27)
    • Rust (44)
    • System Analyst (SA) (97)
    • Testing (110)
      • Automated Testing (45)
        • Playwright (11)
    • UML (53)
    • Web (904)
      • Backend (589)
        • Golang (2)
        • Java (113)
          • Spring Boot (27)
        • Node.js (12)
        • PHP (281)
          • Laravel (60)
          • Yii (5)
      • Frontend (290)
        • CSS (28)
          • Tailwind CSS (6)
        • JavaScript (230)
          • Angular (4)
          • jQuery (70)
          • Tabulator (28)
          • Vue.js (7)
      • WordPress (27)
  • Programs (112)
    • Excel (20)
  • r (2)
  • science (10)
  • script (3)
  • SecDevOps (200)
    • CI/CD (11)
    • Docker (92)
    • GIT (61)
    • SVN (18)
  • Security (370)
  • sistema (1)
  • social (2)
  • system (376)
  • system analyst (31)
  • technology (923)
  • technologyระบบ (101)
  • technologyและระบบ (3)
  • typescript (10)
  • ui (63)
  • Uncategorized (6)
  • ux (58)
  • กฎหมาย (305)
  • การจัดการ (606)
  • การจัดการข้อมูล (351)
  • การจัดการข้อมูลและองค์ความรู้ (3)
  • การพัฒนาตนเอง (12)
  • การออกแบบ (77)
  • ข้อมูล (2)
  • คณิตศาสตร์ (31)
  • ความคิด (110)
  • ความปลอดภัย (224)
  • จริยธรรม (85)
  • จิตวิทยา (885)
  • ชีวิต (115)
  • ทั่วไป (16)
  • ธุรกิจ (622)
  • บุคคล (35)
  • บุคลากร (10)
  • บุคลิก (88)
  • ประวัติศาสตร์ (39)
  • ปัญญาประดิษฐ์ (28)
  • พฤติกรรม (168)
  • ภาษาศาสตร์คอมพิวเตอร์ (28)
  • ระบบ (358)
  • วัฒนธรรม (52)
  • วิชาการ (87)
  • วิชาการข้อมูล (64)
  • วิทยาการข้อมูล (162)
  • วิทยาการข้อมูลและภาษาศาสตร์คอมพิวเตอร์ (1)
  • วิทยาศาสตร์ (164)
  • วิทยาศาสตร์ข้อมูล (28)
  • สังคม (338)
  • สุขภาพ (210)
  • หนังสือ (2)
  • องค์ความรู้ (187)
  • ออกแบบ (18)
  • เทคโนโลยี (291)
  • เทคโนโลยีระบบ (156)
  • 기술 (1)
  • 사회 (1)
  • 시스템 (1)
  • 철학 (1)

Sirat WordPress Theme By VWThemes

Scroll Up
Exit mobile version