آموزش ثابت‌های جادویی PHP با مثال کد

ثابت‌های جادویی یا Magic Constants امکان دسترسی به اطلاعات مختلف برنامه را به ما می‌دهد. استفاده از این ثابت‌ها، به‌خصوص در مواردی که نیاز به دسترسی به اطلاعاتی مربوط به فایل‌ها، کلاس‌ها، توابع و namespaceها داریم بسیار کاربردی هستند. در این آموزش پس از تعریف این ثابت‌ها، ۹ ثابت جادویی PHP را با مثال بررسی می‌کنیم.

ثابت یا constant به‌نوعی یک متغیر است که مقدار آن در طول اجرای برنامه نمی‌تواند تغییر کند. مشابه متغیر در PHP، نام ثابت می‌تواند با حروف انگلیسی یا علامت _ شروع شود ولی ابتدای آن علامت دلار ($) قرار نمی‌گیرد. همچنین، ثابت‌ها به‌صورت سراسری در تمام scopeهای PHP در دسترس هستند.

تعریف ثابت جادویی در PHP

ثابت‌های جادویی مقادیری هستند که به‌طور خودکار توسط زبان PHP تولید می‌شوند. این ثابت‌ها نیازی به تعریف توسط ما ندارند و در هر قسمت از برنامه به‌راحتی در دسترس هستند. اگر می‌خواهید یک مقدار ثابت دلخواه را تعریف کنید، آموزش ثابت در PHP برایتان مفید است.

از ۹ ثابت جادویی که تا نسخهٔ فعلی PHP (یعنی 8.3.0) داریم، ۸ تای آن‌ها با __ (دو تا underscore) شروع شده و با __ به پایان می‌رسند. این ثابت‌ها به‌طور خلاصه عبارت‌اند از:

  • __LINE__ : شماره خط فعلی را به ما می‌دهد.
  • __FILE__ : مسیر کامل فایل به همراه نام فایل را در بر دارد.
  • __DIR__ : مسیر فولدر فعلی (حاوی فایل کد) را می‌دهد.
  • __FUNCTION__ : نام تابعی که در حال اجراست را می‌دهد.
  • __CLASS__ : نام کلاس جاری را برمی‌گرداند.
  • __METHOD__ : نام متد در حال اجرا را نگه‌داری می‌کند.
  • __NAMESPACE__ : فضای نام (همان namespace) را برمی‌گرداند.
  • __TRAIT__ : حاوی نام trait جاری است.
  • ClassName::class : نام کامل کلاس (نام کلاس + namespace) را می‌دهد.

توضیح ثابت‌های جادویی PHP

در این بخش، هر ثابت را به‌طور کامل بررسی کرده و برای هر کدام مثالی جهت درک بهتر می‌زنم.

ثابت LINE

ثابت جادویی __LINE__ شماره خط فعلی کد را درون فایلی که در حال اجراست برمی‌گرداند. این ثابت می‌تواند برای دیباگ (رفع اشکال و خطاها) و نیز نمایش خطاها مفید باشد. برای مثال، می‌توانیم در هنگام مدیریت خطا و استثنا در PHP شماره دقیق خط را نیز نشان دهیم. به‌طور کلی دو موقعیت کاربردی برای این ثابت عبارت‌اند از:

  • نشان دادن شماره خط خطاها
  • استفاده از شماره خط در لاگ (log) برای ثبت موقعیت خطا

اگر قطعه کد زیر را درون یک فایل قرار داده و اجرا کنیم، مقدار 4 توسط __LINE__ به ما برگردانده می‌شود؛ چون از این ثابت در خط چهارم فایل استفاده کرده‌ایم.

<?php
 echo "test __LINE__ constant from sabzdanesh";
 // example comment
 echo __LINE__;    // 4

ثابت جادویی FILE در PHP

این ثابت مسیر کامل و نام فایل (همان path) را برمی‌گرداند. از این Magic Constant می‌توانیم در مواقعی که نیاز است مسیر کامل فایل را بدانیم استفاده کنیم؛ برای مثال:

  • نمایش مسیر فایل برای بررسی‌های امنیتی
  • استفاده از نام و مسیر فایل در گزارش‌گیری‌ها

قطعه زیر را در مسیر /home/sabzdanesh/test و در فایلی به نام codes.php قرار داده و اجرا می‌کنیم:

<?php
 echo "File path: " . __FILE__;

در این مثال ترکیبی از یک رشته و مقدار ثابت استفاده کرده‌ام تا خروجی مناسب‌تری داشته باشم. همان‌طور که از آموزش رشته در PHP می‌دانید، می‌توانیم دو رشته را با اپراتور . به یکدیگر متصل کنیم.

خروجی ثابت __FILE__ در کد
خروجی ثابت __FILE__ در کد

اگر همین فایل را درون یکی از فولدرهای زمپ ریخته و در localhost اجرا کنیم (روی ویندوز) نتیجه‌ای مشابه زیر می‌گیریم: (بیشتر بخوانید: نصب زمپ)

File path: C:\xampp\htdocs\sabzdanesh\test\codes.php

ثابت __DIR__

ثابت جادویی __DIR__ در PHP مسیر دایرکتوری فعلی را برمی‌گرداند. می‌توانیم از این ثابت در یافتن path فایل فعلی و نیز اتصال فایل‌ها به‌صورت داینامیک (ایجاد مسیر فایل‌های جدید) استفاده کنیم.

مشابه مثال قبل، اگر این بار به‌جای __FILE__ مقدار __DIR__ را echo کنم، صرفاً مسیر فولدر حاوی فایل کد چاپ می‌شود.

<?php
 echo "Directory path: " . __DIR__;

// Directory path: /home/sabzdanesh/test
// ویندوز: C:\xampp\htdocs\sabzdanesh\test

ثابت جادویی FUNCTION

ثابت __FUNCTION__ نام تابع جاری را در زمان اجرا به ما می‌دهد. معمولاً از این ثابت برای مستندسازی، دیباگ و گاهی اوقات بررسی اینکه آیا در تابع مورد نظرمان هستیم یا نه استفاده می‌کنیم. همچنین می‌توانیم از نام تابع در نمایش پیغام خطای مرتبط استفاده کنیم. اگر با ساختار توابع و ترفند‌های آشنا نیستید، پیشنهاد می‌کنم آموزش تابع در PHP را ببینید.

<?php
 function test_func(){
     echo "Hello user!" . "<br>";
     echo "Function name: " . __FUNCTION__;
 }

 test_func()

خروجی قطعه کد بالا، چیزی شبیه به زیر می‌شود:

خروجی ثابت جادویی FUNCTION در PHP
خروجی ثابت جادویی FUNCTION در PHP

ثابت CLASS

ثابت __CLASS__ نام کلاس جاری را برمی‌گرداند. هنگامی که از این magic constant درون بدنه یک متد یا مقدار یک ویژگی از کلاس PHP استفاده می‌کنیم، نام همان کلاس را به ما می‌دهد. مشابه ثابت‌های جادویی قبلی، از این ثابت می‌توان در موارد زیر استفاده کرد:

  • ثبت لاگ یا نمایش خطاها
  • ردیابی کد (چاپ نام کلاس در هنگام اجرای برنامه برای اینکه متوجه شویم کدام بخش از کد یا کلاس در حال اجراست)

در قطعه کد زیر، از این مقدار درون بدنه یکی از متدهای کلاس استفاده کرده‌ام. خروجی آن به‌صورت کامنت در انتهای کدها نوشته شده است:

<?php
 class MyClass {
     public function show_class_name(){
         echo "Class name: " . __CLASS__;
     }
 }

 $obj = new MyClass();
 $obj->show_class_name();

 // Class name: MyClass

ثابت METHOD در PHP

ثابت جادویی __METHOD__ نام متد فعلی که ترکیبی از نام کلاس و نام متد است را برمی‌گرداند. بنابراین اگر متدی به نام test() درون کلاس Example داشته باشیم، چیزی شبیه به Example::test در خروجی خواهیم داشت.

برای درک بهتر موقعیتی که می‌توانیم از این ثابت جادویی در PHP استفاده کنیم، قطعه کد زیر را ببینید. خروجی آن در خط آخر به‌صورت کامنت قرار گرفته است.

<?php
 class MyClass {
     public function show_class_name(){
         echo "Method name: " . __METHOD__;
     }
 }

 $obj = new MyClass();
 $obj->show_class_name();

 // Method name: MyClass::show_class_name

ثابت جادویی NAMESPACE

این ثابت فضای نام جاری را نشان می‌دهد و در پروژه‌هایی که از namespace استفاده می‌کنند کاربرد دارد. از این ثابت جادویی معمولاً در روند مدیریت namespace پروژه‌های بزرگ و ایجاد سیستم‌های ماژولار استفاده می‌شود.

اگر مشابه قطعه کد زیر، فایل کدی داشته باشم که برای آن یک namespace تعریف شده باشد، با استفاده از این ثابت، می‌توانیم در هر بخشی از کدهای این فایل به این نام دسترسی داشته باشم. (برای مثال، از این مقدار می‌توان در یک ساختار شرط در PHP برای انجام یک عملیات خاص استفاده کرد.)

<?php
 namespace MyNamespace;

 echo "Namespace is: " . __NAMESPACE__;

 // Namespace is: MyNamespace

ثابت جادویی TRAIT

همان‌طور که احتمالاً از نامش حدس بزنید، ثابت __TRAIT__ نام trait جاری را نشان می‌دهد. از این مقدار می‌توانیم در traitهایی که تعریف می‌شوند استفاده کنیم. استفاده از این ثابت در بررسی کلاس‌های پیچیده بسیار مفید است.

در قطعه کد زیر، یک trait دارم که از آن درون کلاس مورد نظرم استفاده شده است. وقتی متد را صدا می‌زنم، نام trait برگردانده می‌شود:

tait MyTrait {
    public function show_trait(){
        echo "Trait name: " . __TRAIT__;
    }
}

class MyClass {
    use MyTrait;
}

$obj = new MyClass();
$obt->show_trait();

مطمئناً می‌دانید که می‌توانیم trait را درون فایل دیگری تعریف کرده و با فراخوانی آن (با include و require یا namespaceها) از آن درون فایل کلاس استفاده کنم. در این‌جا هر دو را درون یک فایل قرار داده‌ام. نتیجه اجرای فایل کد بالا را در کد زیر می‌بینید:

Trait name: MyTrait

ثابت ClassName::class

آخرین ثابت جادویی در PHP مسیر کامل کلاس، شامل namespace و نام کلاس را برمی‌گرداند. این ثابت معمولاً در پروژه‌هایی که از چندین فضای نام استفاده می‌کنند کاربرد دارد. همچنین در سیستم‌های Dependency Injection (تزریق وابستگی) نیز کاربرد دارد.

نحوه استفاده و نمونه خروجی این ثابت در باکس کد زیر مشخص شده است:

<?php
 namespace Sabzdanesh;
 
 class MyClass {
     // ...
 }
 
 echo MyClass::class;

 // Sabzdanesh\MyClass

توجه کنید که اگر کلاس ما درون هیچ namespaceـی قرار نداشته باشد، ثابت جادویی ClassName::class صرفاً نام کلاس را به ما می‌دهد؛ یعنی چیزی شبیه به کد زیر:

<?php
 class MyClass {
     // ...
 }

 echo MyClass::class;

 // MyClass

خلاصه آموزش

در این آموزش با ۹ ثابت جادویی در PHP آشنا شدیم. این ثابت‌ها از پیش تعریف‌شده هستند و اطلاعاتی مثل شماره خط، نام فایل، مسیرها، نام کلاس و namespace را می‌دهند. نام تمام این ثابت‌ها به‌جز یکی (مورد آخری) با __ شروع شده و پایان می‌یابد.

استفاده از این ثابت‌ها می‌تواند در روند توسعه، مستندسازی، دیباگ و اشکال‌زدایی کدها بسیار مفید باشند. مستندات این بحث در سایت PHP (+) مثال یا توضیحات خاصی ندارد و نیازی نیست علاوه‌بر این آموزش به آن مراجعه کنید. در جدول زیر، این ثابت‌ها به‌طور خلاصه مرور شده‌اند:

نام ثابتمقدار بازگشتی
__LINE__شماره خط فعلی در فایل
__FILE__مسیر کامل و نام فایل
__DIR__path دایرکتوری فایل فعلی
__FUNCTION__نام تابع فعلی
__CLASS__نام کلاس در حال اجرا
__METHOD__نام متد فعلی
__NAMESPACE__namespace در حال اجرا
__TRAIT__نام trait مورد استفاده
ClassName::classنام کلاس با namespace
خلاصه ثابت‌های جادویی PHP با اطلاعات بازگشتی