دسته بندی :
تاریخ انتشار : ۲۰ مهر ۱۳۹۴
گردآوری و تالیف : حسام موسوی

کارمو با طراحی گرافیکی شروع کردم و حدود 2 سال طراحی گرافیکی میکردم بعد به طراحی وب علاقه پیدا کردم و همراه طراحی وب عاشق کدنویسی شدم به PHP | sass | css | Jquery | javaScript تسلط کامل دارم . در بین فریم ورک های PHP اول با CodeIgniter کار کردم اما به laravel علاقه مند شدم و دارم بطور حرفه ای دنبالش میکنم . امید من اینکه بتونم کاربرهای ایرانی رو به دنیای بیرون متصل کنم تا بتونن از فناوری های تازه آگاهی داشته باشن

با سلام خدمت دوستان و کاربران عزیز وبسایت راکت در قسمت های قبل یعنی

در مورد مفهوم برنامه نویسی شی گرا در php و همینطور در مورد property ها و method ها و Encapsulation (کپسوله سازی) و در مورد Inheritance (وراثت) صحبت کردیم و با مثال های مختلف اونا رو بهتون یاد دادیم در این جلسه قصد داریم در مورد Magic Methods صحبت کنیم  و اونو بهتون آموزش بدم امیدوارم مورد استفاده اتون قرار بگیره . 

متدهای جادوئی در شی گرایی php

خب امروز در این پست رسیدیم به متدهایی جادوئی در شی گرایی php . 

php برای ساده تر کردن بعضی از کارها در کلاس ها یک سری متدهای خاص و ویژه در شی گرایی قرار داده که این موضوع به توسعه دهندگان اجازه میده تا تعدادی از کارهای مفید رو به سهولت انجام بدن . 

من در اینجا چندتا از این متدهای جادوئی رو توضیح میدم امیدوارم کاملا با این مبحث آشنا بشین.

استفاده از Constructors , Destructors

بزارید اینطور براتون توضیح بدم. زمانی که شما یک object رو از کلاسی میسازید در همون ابتدای ساختن بطور اتوماتیک می خواید یک سری اعمال انجام بشه . شما اینکار رو به سادگی با متد __construct()  می تونید انجام بدید. یه ویژگی در مورد متدهای جادوئی که یادم رفت در بالا بگم اینکه تمام متدهای جادوئی دارای دو Underscore یا ( _ _ ) در قبل اسم متد هستن که به این صورت میشه فهمید که اون متد یک متد جادوئیه . 

حالا اگه شما بخواین راحت تر با کار __construct() آشنا بشین در زیر یک مثال از این متد میزنم که در هنگام ایجاد شدن obj یک مقداری رو بطور اتوماتیک چاپ کنه .  

<?php
 
class MyClass
{
  public $prop1 = "I'm a class property!";
 
  public function __construct()
  {
      echo 'The class "', __CLASS__, '" was initiated!<br />';
  }
 
  public function setProperty($newval)
  {
      $this->prop1 = $newval;
  }
 
  public function getProperty()
  {
      return $this->prop1 . "<br />";
  }
}
 
// Create a new object
$obj = new MyClass;
 
// Get the value of $prop1
echo $obj->getProperty();
 
// Output a message at the end of the file
echo "End of file.<br />";
 
?>

در بالا شما در یک قسمت با __CLASS__ مواجه شدید که این یک ثابت جادوئیه ( magic constant ) که دقیقا مثل متدهای جادوئی یک سری اعمال رو انجام میده مثلا در این جا __CLASS__ اسم کلاسی که توش قرار داره رو بر میگردونه . شما با مراجعه به این صفحه میتونید مابقی magic constant رو ببینید . 

در زیر میتونید نتیجه کد بالا رو مشاهده کنید . 

The class "MyClass" was initiated!
I'm a class property!
End of file.

خب حالا میرسیم به متد __destruct() . زمانی که یک Object نابود میشه این متد فراخونی و اجرا میشه یکی از مثال های این مورد میتونه زمانی که ارتباط با دیتابیس بسته میشه باشه که این متد اجرا بشه و یه سری کارها رو انجام بده . 

در زیر با استفاده از این متد زمانی که یک obj نابود میشه یک پیام چاپ میشه . به مثال زیر دقت کنید . 

<?php
 
class MyClass
{
  public $prop1 = "I'm a class property!";
 
  public function __construct()
  {
      echo 'The class "', __CLASS__, '" was initiated!<br />';
  }
 
  public function __destruct()
  {
      echo 'The class "', __CLASS__, '" was destroyed.<br />';
  }
 
  public function setProperty($newval)
  {
      $this->prop1 = $newval;
  }
 
  public function getProperty()
  {
      return $this->prop1 . "<br />";
  }
}
 
// Create a new object
$obj = new MyClass;
 
// Get the value of $prop1
echo $obj->getProperty();
 
// Output a message at the end of the file
echo "End of file.<br />";
 
?>

با تعریف یک destruct خروجی کد بالا به صورت زیر میشه . 

The class "MyClass" was initiated!
I'm a class property!
End of file.
The class "MyClass" was destroyed.

شما با یک تابع به اسم unset می تونید یک Obj رو زودتر از زمانی که قراره نابود بشه نابود کنید. در زیر یک مثال با این تابع میزنم تا بهتر بتونید این مسئله و درک کنید . 

<?php
 
class MyClass
{
  public $prop1 = "I'm a class property!";
 
  public function __construct()
  {
      echo 'The class "', __CLASS__, '" was initiated!<br />';
  }
 
  public function __destruct()
  {
      echo 'The class "', __CLASS__, '" was destroyed.<br />';
  }
 
  public function setProperty($newval)
  {
      $this->prop1 = $newval;
  }
 
  public function getProperty()
  {
      return $this->prop1 . "<br />";
  }
}
 
// Create a new object
$obj = new MyClass;
 
// Get the value of $prop1
echo $obj->getProperty();
 
// Destroy the object
unset($obj);
 
// Output a message at the end of the file
echo "End of file.<br />";
 
?>

خب حالا به نتیجه کد بالا دقت کنید . 

The class "MyClass" was initiated!
I'm a class property!
The class "MyClass" was destroyed.
End of file.

Converting to a String ( تبدیل به یک رشته )

اگر شنا یک obj رو بخواین بطور مستقیم به عنوان رشته چاپ کنید قطعا با ارور مواجه میشید . اما با استفاده از متد جادوئی __toString() میتونید یک obj رو بصورت یک رشته چاپ کنید .

در زیر مثالی می زنم که قصد دارم obj رو بصورت یک رشته با echo چاپ کنم اما با ارور مواجه میشم . 

<?php
 
class MyClass
{
  public $prop1 = "I'm a class property!";
 
  public function __construct()
  {
      echo 'The class "', __CLASS__, '" was initiated!<br />';
  }
 
  public function __destruct()
  {
      echo 'The class "', __CLASS__, '" was destroyed.<br />';
  }
 
  public function setProperty($newval)
  {
      $this->prop1 = $newval;
  }
 
  public function getProperty()
  {
      return $this->prop1 . "<br />";
  }
}
 
// Create a new object
$obj = new MyClass;
 
// Output the object as a string
echo $obj;
 
// Destroy the object
unset($obj);
 
// Output a message at the end of the file
echo "End of file.<br />";
 
?>

خروجی کد بالا بصورت زیره که ارور رو هم میتونید ببینید : 

The class "MyClass" was initiated!
 
Catchable fatal error: Object of class MyClass could not be converted to string in /Applications/XAMPP/xamppfiles/htdocs/testing/test.php on line 40

برای رفع ارور ما میتونیم از متد __toString() استفاده کنیم 

<?php
 
class MyClass
{
  public $prop1 = "I'm a class property!";
 
  public function __construct()
  {
      echo 'The class "', __CLASS__, '" was initiated!<br />';
  }
 
  public function __destruct()
  {
      echo 'The class "', __CLASS__, '" was destroyed.<br />';
  }
 
  public function __toString()
  {
      echo "Using the toString method: ";
      return $this->getProperty();
  }
 
  public function setProperty($newval)
  {
      $this->prop1 = $newval;
  }
 
  public function getProperty()
  {
      return $this->prop1 . "<br />";
  }
}
 
// Create a new object
$obj = new MyClass;
 
// Output the object as a string
echo $obj;
 
// Destroy the object
unset($obj);
 
// Output a message at the end of the file
echo "End of file.<br />";
 
?>

در مثال بالا ما با استفاده از toString به علاوه اینکه یک رشته رو چاپ میکنیم ، یک متد از کلاس به اسم getProperty رو هم بر میگردونیم که شما برای واضح تر شدن و درک این موضوع به نتیجه کد بالا دقت کنید . 

The class "MyClass" was initiated!
Using the toString method: I'm a class property!
The class "MyClass" was destroyed.
End of file.

خب در این پست من چند تا از متدهای جادوئی رو معرفی کردم که امیدوارم باهشون آشنا شده باشید اگر میخواید با متدهای بیشتری از متدهای جادوئی آشنا بشین به این صفحه مراجعه کنید . "Magic Methods

دیدگاه های مخاطبین

ثبت دیدگاه شما
  • relax

    آموزشاتون خوبه
    یه سوال
    میخوام بدونم اگه بخوام از همه دیتابیسام تو مای اسکویل یه کپی داشته باشم شدنیه؟
    راهی هست که قبل پاک کردن ویندوز کل دیتابیسمو یکجا بریزم یه جای بعد یکجا دوباره ایمپورت کنم؟

    • admin

      با استفاده از phpmyadmin دیتابیس مورد نظرتون رو انتخاب میکنید و اون رو با تمام یا با انتخاب جداول Export میکنید و در جای نگهداری میکنید در وقت لازم دوباره Import میکنید .

پیشنهاد میکنیم این مطالب رو هم مطالعه کنید :