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 Laravel,PHP PHP: Attributes

PHP: Attributes

2022-01-302022-01-30| phunsanitphunsanit| 0 Comment | 07:00
Categories:
  • Laravel
  • 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 แบบต่อเนื่อง
Tags: Annotations, Attributes, Clean Code, Configuration, Docblocks, Doctrine, Framework, Friendly, Laravel, Logic, Metadata, ORM, Parse, Performance, PHP Attributes, Reflection, Regex, Routing, Step-by-Step, Symfony, Validation, ข้อมูลที่อธิบายข้อมูล, คลาส, คอมเมนต์, ตรวจสอบ, พร็อพเพอร์ตี้, พารามิเตอร์, ฟังก์ชัน, เปลี่ยนแปลงพฤติกรรม, เมธอด, ไลบรารี, ไวยากรณ์

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

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

Projects

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

Recent Posts

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

Archives

Categories

  • .net core (16)
  • AI (52)
  • business (33)
  • Businesses (32)
  • 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,209)
    • Books (59)
    • Cartoon (13)
    • Mindset (41)
    • Movies (35)
    • Philosophy (4)
    • Psychology (3)
    • Sci-Fi (53)
    • Tips and Tricks (67)
    • ปรัชญา (267)
    • พัฒนาตนเอง (883)
    • พุทธ (70)
    • สิ่งแวดล้อม (46)
  • 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)
  • ระบบ (357)
  • วัฒนธรรม (52)
  • วิชาการ (87)
  • วิชาการข้อมูล (64)
  • วิทยาการข้อมูล (162)
  • วิทยาการข้อมูลและภาษาศาสตร์คอมพิวเตอร์ (1)
  • วิทยาศาสตร์ (163)
  • วิทยาศาสตร์ข้อมูล (28)
  • สังคม (338)
  • สุขภาพ (210)
  • หนังสือ (2)
  • องค์ความรู้ (187)
  • ออกแบบ (18)
  • เทคโนโลยี (290)
  • เทคโนโลยีระบบ (156)
  • 기술 (1)
  • 사회 (1)
  • 시스템 (1)
  • 철학 (1)

Sirat WordPress Theme By VWThemes

Scroll Up
Go to mobile version