Skip to content

PlusMagi's Blog By Pitt Phunsanit

Plus emotional magic to the knowledge of logic.

  • About’s Pitt
Close Button
PlusMagi's Blog By Pitt Phunsanit PHP PHP: Attributes

PHP: Attributes

2022-01-302022-01-30| phunsanitphunsanit| 0 Comment | 07:00
Categories:
  • PHP

PHP Attributes (หรือที่หลายคนคุ้นเคยในชื่อ “Annotations” จากภาษาอื่น) คือฟีเจอร์ที่ถูกเพิ่มเข้ามาตั้งแต่ PHP 8.0 มันคือการใส่ Metadata (ข้อมูลที่อธิบายข้อมูล) ให้กับโครงสร้างของโค้ด ไม่ว่าจะเป็น คลาส, เมธอด, ฟังก์ชัน, พร็อพเพอร์ตี้ หรือแม้กระทั่งพารามิเตอร์ โดยข้อมูลเหล่านี้จะไม่ส่งผลต่อการทำงานของโค้ดโดยตรง แต่เราสามารถดึงมาใช้ตรวจสอบหรือเปลี่ยนแปลงพฤติกรรมของโปรแกรมได้ผ่าน Reflection API

ก่อนหน้า PHP 8.0 เรามักจะใช้ Docblocks (คอมเมนต์ / ... */) ในการเขียนอธิบาย ซึ่งมีข้อเสียคือระบบไม่ได้ตรวจสอบไวยากรณ์ (Syntax) และดึงข้อมูลไปใช้ค่อนข้างยาก แต่พอมี Attributes ทุกอย่างก็กลายเป็นเรื่องที่ถูกต้องตามโครงสร้างของภาษา และใช้งานง่ายขึ้นมากครับ


💡 โครงสร้างและไวยากรณ์ (Syntax)

การประกาศใช้ Attribute ใน PHP จะใช้เครื่องหมาย #[ ] วางไว้เหนือสิ่งที่เราต้องการกำหนด Metadata

#[AttributeName]
class MyClass {
    #[AttributeName]
    public string $myProperty;

    #[AttributeName]
    public function myMethod(#[AttributeName] $argument) {}
}

นอกจากนี้เรายังสามารถส่งค่า (Arguments) เข้าไปใน Attribute ได้เหมือนกับการเรียกใช้งานฟังก์ชันปกติเลยครับ

#[JoinTable(name: "users_roles")]
#[Column("username", type: "string", length: 50)]

🛠️ วิธีการสร้างและใช้งาน Attributes (Step-by-Step)

ลองมาดูตัวอย่างการสร้างระบบ Validation ง่ายๆ ด้วย Attributes กันครับ เพื่อให้เห็นภาพการทำงานจริง

1. ประกาศคลาสสำหรับ Attribute

การสร้าง Attribute ก็คือการสร้างคลาสธรรมดา แต่เราต้องใส่ #[Attribute] ไว้บนหัวคลาส เพื่อบอกให้ PHP รู้ว่าคลาสนี้จะถูกนำไปใช้เป็น Attribute นะ

<?php

#[Attribute(Attribute::TARGET_PROPERTY)] // กำหนดให้ใช้ได้เฉพาะกับ Property เท่านั้น
class StringLength {
    public function __construct(
        public int $min,
        public int $max
    ) {}
}

2. นำ Attribute ไปใช้งานในคลาสอื่น

ลองสร้างคลาส UserRegistration แล้วนำ #[StringLength] ที่เราสร้างเมื่อกี้ไปแปะไว้ที่พาสเวิร์ด

class UserRegistration {
    #[StringLength(min: 8, max: 20)]
    public string $password;

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

3. อ่านค่า Metadata ด้วย Reflection API

นี่คือขั้นตอนสำคัญ เพราะถ้าเราไม่ใช้ Reflection API มาอ่านค่า ตัว Attribute ก็จะอยู่เฉย ๆ ไม่มีผลอะไรครับ

function validate($object) {
    $reflection = new ReflectionClass($object);
    
    // วนลูปดู Property ทั้งหมดในคลาส
    foreach ($reflection->getProperties() as $property) {
        // ดึง Attribute ชื่อ StringLength ออกมา
        $attributes = $property->getAttributes(StringLength::class);
        
        foreach ($attributes as $attribute) {
            // แปลง Attribute กลับมาเป็น Instance ของคลาส StringLength เพื่อใช้งาน
            $validator = $attribute->newInstance();
            $value = $property->getValue($object);
            
            // ตรวจสอบเงื่อนไข
            if (strlen($value) < $validator->min || strlen($value) > $validator->max) {
                throw new Exception("Property {$property->getName()} ต้องมีความยาวระหว่าง {$validator->min} ถึง {$validator->max} ตัวอักษร");
            }
        }
    }
    echo "Validation ผ่านฉลุย! ✨";
}

// --- ทดลองใช้งาน ---
try {
    $user = new UserRegistration("12345"); // สั้นเกินไป (เงื่อนไขคือ 8-20)
    validate($user);
} catch (Exception $e) {
    echo "Error: " . $e->getMessage(); 
    // ผลลัพธ์: Error: Property password ต้องมีความยาวระหว่าง 8 ถึง 20 ตัวอักษร
}

🎯 ประโยชน์ของการใช้ Attributes

  • Syntax Validation: มีระบบตรวจไวยากรณ์ตั้งแต่ตอนเขียน (IDE ช่วยเตือนได้) ไม่เหมือน Docblock ที่เป็นแค่คอมเมนต์ตัวหนังสือธรรมดา
  • Performance: อ่านค่าได้เร็วกว่าการไปคอย Parse คอมเมนต์ผ่าน Regex แบบสมัยก่อนมาก
  • Clean Code: แยกส่วนของ Logic หลัก ออกจากส่วนที่เป็น Configuration หรือ Metadata อย่างชัดเจน
  • Framework Friendly: ปัจจุบันเฟรมเวิร์กดัง ๆ อย่าง Symfony (เช่น Routing) หรือ Laravel และคลังไลบรารีอย่าง Doctrine ORM ต่างเปลี่ยนมาใช้ Attributes เป็นมาตรฐานหลักแล้ว

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

  • PHP: จาก 5 มา 8 ต้องปรับตัวอะไรบ้าง
  • PHP: .ini config อยู่หนใด
  • PHP: php-amqplib แบบต่อเนื่อง
ป้ายกำกับ:Annotations, API, Attributes, Clean Code, Configuration, Docblocks, Doctrine, Framework, Friendly, Laravel, Logic, Metadata, ORM, Parse, Performance, PHP, PHP Attributes, Reflection, Regex, Routing, Step-by-Step, Symfony, Syntax, Validation, ข้อมูลที่อธิบายข้อมูล, คลาส, คอมเมนต์, ตรวจสอบ, พร็อพเพอร์ตี้, พารามิเตอร์, ฟังก์ชัน, เปลี่ยนแปลงพฤติกรรม, เมธอด, ไลบรารี, ไวยากรณ์

แนะแนวเรื่อง

PREVIOUS Previous post: VS Code: ลดพื้นที่จาก space เป็น tab
NEXT Next post: Playwright: ติดตั้งง่าย ๆ

Projects

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

Recent Posts

  • Angular: TabulatorPlus
  • Playwright: Environment
  • Vue.js: TabulatorPlus
  • AI MCP: Model Context Protocol
  • React: TabulatorPlus

Archives

Categories

  • AI (18)
  • Businesses (6)
  • Design (43)
    • UX/UI (12)
  • DevOps (61)
    • CI/CD (4)
    • Docker (32)
    • GIT (25)
  • Histories (10)
  • Life (90)
    • Books (36)
    • Cartoon (3)
    • Sci-Fi (4)
    • Tips and Tricks (22)
    • พุทธ (5)
  • Network (119)
    • Apache HTTP Server (14)
    • IOT (1)
    • Nginx (28)
    • Stalwart (5)
  • Operating Systems (258)
    • Unix-like (186)
      • Android (15)
        • F-Droid (5)
      • iPhone (8)
      • Linux (112)
      • macOS (99)
        • Homebrew (15)
        • OrbStack (11)
      • Oh My ZSH (4)
      • Shell Script (34)
      • SSH (11)
    • Windows (116)
      • PowerShell (24)
      • WSL (24)
  • Programming (699)
    • .NET (18)
      • .NET Core EF (5)
      • C# (17)
    • API (26)
      • REST (5)
      • Swagger (6)
    • Database (180)
      • DBeaver (3)
      • MariaDB (28)
      • MySql (66)
      • Oracle Database (6)
        • 10g (3)
      • PostgreSQL (8)
      • RDBMS (2)
      • SQL Server (85)
        • SSMS (8)
        • T-SQL (26)
      • SQLite (1)
    • PowerBuilder (10)
    • Python (2)
    • Rust (1)
    • System Analyst (SA) (13)
    • Testing (17)
      • Automated Testing (9)
        • Playwright (6)
    • UML (7)
    • Web (372)
      • Backend (238)
        • Golang (1)
        • Java (45)
          • Spring Boot (14)
        • Node.js (1)
        • PHP (192)
          • Laravel (16)
          • Yii (5)
      • Frontend (128)
        • CSS (17)
          • Tailwind CSS (5)
        • JavaScript (116)
          • Angular (3)
          • jQuery (60)
          • Tabulator (15)
          • Vue.js (5)
      • WordPress (25)
  • Programs (84)
    • Excel (10)
  • Security (52)
  • Uncategorized (1)
  • กฎหมาย (6)

Sirat WordPress Theme By VWThemes

Scroll Up
Go to mobile version