متدهای جادویی (Magic Methods)

در PHP تعدادی متد با عنوان متدهای جادویی (Magic Method) وجود دارد که نام آنها با دو زیرخط آغاز می‌شود و در هنگام وقوع رخدادهای خاصی بصورت اتوماتیک فراخوانی و اجرا می‌شوند. در زیر نام این متدها ذکر شده است :

  • __construct()
  • __destruct()
  • __call()
  • __callStatic()
  • __get()
  • __set()
  • __isset()
  • __unset()
  • __toString()
  • __invoke()
  • __sleep()
  • __wakeup()
  • __set_state()
  • __clone()
  • __autoload()

__construct()

سازنده‌ها، متدهای خاصی هستند که، وجود آنها برای ساخت اشیاء لازم است. آن‌ها به شما اجازه می‌دهند که متغیرهای کلاس را مقداردهی اولیه کنید و کدهایی که را که می‌خواهید هنگام ایجاد یک شیء اجرا شوند را به برنامه اضافه کنید. اگر از هیچ سازنده‌ای در کلاستان استفاده نکنید، PHP از سازنده پیشفرض که یک متد بدون پارامتر است، استفاده می‌کند. قبلاً ذکر شد که نام کلاس و نام سازنده باید دقیقاً عین هم باشد ولی با وجود این متد جادویی دیگر تشابه اسمی لازم نیست :

<?php
    class Person
    {
        public function __construct()
        {
            echo 'Constructor was called.';    
        }
    }

    $person = new Person();
?>
Constructor was called.

همانطور که در کد بالا مشاهده می‌کنید به محض ایجاد شیء از کلاس سازنده فراخوانی شده و کد درون آن اجرا می‌شود.

__destruct()

مخرب‌ها نقطه مقابل سازنده‌ها هستند. مخرب‌ها متدهای خاصی هستند که هنگام تخریب یک شیء فراخوانی می‌شوند. اشیاء از حافظه کامپیوتر استفاده می‌کنند و اگر پاک نشوند ممکن است با کمبود حافظه مواجه شوید. می‌توان از مخرب‌ها برای پاک کردن منابعی که در برنامه مورد استفاده قرار نمی‌گیرند استفاده کرد. معمولاً PHP به صورت اتوماتیک از زباله روب (garbage collection) برای پاک کردن حافظه استفاده می‌کند و لازم نیست شما به صورت دستی اشیا را از حافظه پاک کنید. به عنوان مثال وقتی کاربر یک فایل متنی را برای خواندن باز می‌کند و آن را نمی‌بندد، می‌توان عمل بستن فایل را با استفاده از مخرب انجام داد.

<?php
    class Person
    {
        public function __destruct()
        {
            echo 'Destructor was called.';    
        }
    }

    $person = new Person();
?>
Destructor was called.

__set() و __get()

برای درک بهتر عملکرد این دو متد توصیه می‌کنم که ابتدا درس (خواص) را بخوانید. در کل این دو متد باعث ایجاد و مقداردهی خاصیت‌های کلاس می‌شوند و کدنویسی را به شدت کاهش می‌دهند. به مثال زیر توجه کنید :

<?php
    class Person
    {
        private $info = array() ;

        function __set($name , $value)
        {
            $this->info[$name] = $value ;
        }

        function __get($name)
        {
            return $this->info[$name];
        }
    }

    $person = new Person();

    //set values
    $person -> name   = 'Leo' ;
    $person -> family = 'Messi';
    $person -> Age    = 29;

    // Get values
    echo $person -> name ; 
?>
Leo

همانطور که در کد بالا مشاهده می‌کنید به جای تعریف چند خاصیت برای کلاس یک آرایه به نام info تعریف کرده‌ایم و سپس خاصیت‌ها را با متد set__ مقداردهی و سپس با متد get__ چاپ کرده‌ایم.

__invoke()

این متد به یک شیء اجازه می‌دهد که مانند یک متد عمل کند. به مثال زیر توجه کنید :

 <?php
    class Person
    {
        public function __invoke($param)
        {
            echo 'Hello '.$param;
        }
    }

    $person = new Person();
    $person('World !');
?>
Hello World !

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

__autoload()

از این متد در فراخوانی خودکار کلاس‌هایی که از روی آنها شیء ایجاد کرده‌ایم به کار می‌رود. همانطور که می دانید برای استفاده از کلاس‌هایی که در فایل هستند، در فایل دیگر، باید آنها را include کرد. حال اگر تعداد کلاسها زیاد باشد، include کردن آنها هم خسته کننده است و هم ممکن است باعث بروز خطا شود. برای جلوگیری از تکرار و خطا از متد جادویی autoload__ می‌کنیم. فرض کنید که یک فایل به نام index.php و یک پوشه که در داخل آن دو کلاس به نام‌های firstClass.php و secondClass.php داریم.
autoload-in-php
محتویات دو کلاسی که در داخل پوشه Classes قرار دارند به صورت زیر می‌باشد :

 <?php
    class firstClass
    {
        public function ShowMessage()
        {
            echo 'Hello World!';
        }
    }
?>
 <?php
    class secondClass
    {
        public function ShowMessage()
        {
            echo 'Hello IRAN!';
        }
    }
?>

حال برای فراخوانی این کلاس‌ها در فایل index.php ، فایل مذکور را باز کرده و کدهای زیر را در داخلان بنویسید :

 <?php
    function __autoload($classname)
    {
        require_once 'Classes/'.$classname.'.php';
    }


    $firstclass  = new firstClass();
    $firstclass -> ShowMessage();

    echo '<br />';

    $secondClass  = new secondClass();
    $secondClass -> ShowMessage();
?>
Hello World!
Hello IRAN!

در کد بالا بعد از اینکه یک شیء از یک کلاس می‌سازیم، نام کلاس جایگزین پارامتر تابع autoload می‌شود. مثلاً با ایجاد شیء از firstClass کد بالا به صورت زیر در می‌آید :

 <?php
    function __autoload(firstClass)
    {
        require_once 'Classes/'.firstClass.'.php';
    }


    $firstclass  = new firstClass();
    $firstclass -> ShowMessage();
?>

در نتیجه به راحتی متدهای این کلاس قابل دسترسی می‌شوند. در مورد سایر متدهای جادویی در درس‌های آینده توضیح می‌دهیم.