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

  • Tabulator: TabulatorPlus (Wrapper Class )
  • AI:thClaws
  • Laravel: php artisan tinker
  • Line: API มันทำอะไรได้บ้าง
  • Laravel: reset password

Archives

Categories

  • AI (10)
  • Businesses (4)
  • Design (38)
    • UX/UI (7)
  • DevOps (55)
    • CI/CD (2)
    • Docker (29)
    • GIT (25)
  • Histories (10)
  • Life (79)
    • Books (28)
    • Tips and Tricks (19)
    • พุทธ (5)
  • Network (117)
    • Apache HTTP Server (14)
    • IOT (1)
    • Nginx (28)
    • Stalwart (5)
  • Operating Systems (246)
    • Unix-like (175)
      • Android (14)
      • iPhone (6)
      • Linux (108)
      • macOS (87)
        • Homebrew (15)
        • OrbStack (10)
      • Oh My ZSH (4)
      • Shell Script (32)
      • SSH (11)
    • Windows (112)
      • PowerShell (23)
      • WSL (24)
  • Programming (667)
    • .NET (18)
      • .NET Core EF (5)
      • C# (17)
    • API (21)
      • REST (5)
      • Swagger (6)
    • Database (175)
      • DBeaver (3)
      • MariaDB (28)
      • MySql (66)
      • Oracle Database (6)
        • 10g (3)
      • PostgreSQL (7)
      • RDBMS (2)
      • SQL Server (85)
        • SSMS (8)
        • T-SQL (26)
      • SQLite (1)
    • PowerBuilder (10)
    • Python (1)
    • Rust (1)
    • System Analyst (SA) (3)
    • Testing (11)
      • Automated Testing (3)
        • Playwright (2)
    • UML (2)
    • Web (358)
      • Backend (231)
        • Golang (1)
        • Java (45)
          • Spring Boot (14)
        • Node.js (1)
        • PHP (185)
          • Laravel (16)
          • Yii (5)
      • Frontend (124)
        • CSS (17)
          • Tailwind CSS (5)
        • JavaScript (112)
          • Angular (2)
          • jQuery (60)
          • Tabulator (12)
          • Vue.js (4)
      • WordPress (25)
  • Programs (76)
    • Excel (10)
  • Security (48)
  • Uncategorized (1)
  • กฎหมาย (6)

Sirat WordPress Theme By VWThemes

Scroll Up
Go to mobile version