PHP 5 مفهومی با نام متدهای جادویی را معرفی کرده است که پشتیبانی PHP را از برنامهنویسی شیگرا بسیار افزایش و بهبود میدهد. در این نوشتار فهرست این توابع آمده و کد نمونه سادهای از هر کدام نیز آورده شده است. در این نوشتار فرض بر این گذاشته شده است که شما پیش از این با OOP آشنا هستید. ولی با این حال با توجه به این که یکی از خوانندگان این نوشتار، دانشآموزانم هستند که تقریبا با OOP آشنایی ندارند، تلاش میکنم به شکلی همه فهم توضیح بدهم.
سازنده و ویرانگر: __construct و __destruct
گاهی لازم است که یک سری مقداردهیهای اولیه در کلاسهایمان در زمان ساخته شدن آنها انجام بشود. نمونه:
class Book {
public $bookname;
public $author;
public function __construct($bookname, $author) {
$this->bookname = $bookname;
$this->author = $author;
}
public function __destruct(); {
echo "You don't like my book?";
}
}
$book1 = new Book('Learning PHP', 'Hoda');
echo $book1->bookname;
نکته: متدهای __construct و __destruct میبایست public تعریف شوند؛ چون که قرار است این متدها از بیرون فراخوانی شوند.
__call
این متد هنگامی فراخوانی میشود که کاربرِ کلاس متدی را صدا بزند که در کلاس وجود ندارد. فرض کنید در که استفادهکننده کلاس متد Open را از کلاس Book که در بالا تعریف شده، فرا بخواند. در این صورت PHP که متد Open را پیدا نمیکند، متد __call را در صورت وجود صدا میزند و نام متدی که وجود نداشته و کاربر آن را فراخوانی کرده و پارامترهایی که کاربر صدا زده است را به متد __call میفرستد.
class Book {
function __call($data,$arguments) {
echo "Mehod Called: $data
";
echo "Arguments: $arguments";
}
}
$book1 = new Book;
echo $book1->open();
تابعهای _get و _set
متد _get هنگامی فراخوانی میشود که مقدار یک ویژگی یا عضو کلاس تعریف نشده در کلاس خوانده بشود. تابع _set هم وقتی فراخوان میشود که در یک عضو یا ویژگی کلاس که تعریف نشده، مقداری ریخته بشود:
class Book {
function __get($data) {
echo "You asked to get member '$data'. But this member does not exist";
}
}
$book1 = new Book;
echo $book1->color;
تابعهای __isset و __unset
تابع _isset هنگامی صدا زده میشود که کاربر بخواهد با تابع isset موجود در PHP چک کند که آیا یک ویژگی مقدار دارد یا نه. تابع _unset هم هنگامی صدا زده میشود که کاربر بخواهد با تابع unset موجود در PHP مقدار یک ویژگی را خالی کند.
class Book {
function __isset($var) {
echo "Variable '$var' is not set.";
}
function __unset($var) {
echo "Variable '$var' unset.";
}
}
$book1 = new Book;
isset($book1->color);
unset($book1->color);
تابع __sleep و __wakeup
تابع __sleep هنگامی صدا زده میشود که یک کلاس را در حال Serialize کردن هستیم. تابع __wakeup هم زمانی صدا زده میشود که یک کلاس را Deserialize میکنیم:
class Connection {
protected $link;
private $server, $username, $password, $db;
public function __construct($server, $username, $password, $db)
{
$this->server = $server;
$this->username = $username;
$this->password = $password;
$this->db = $db;
$this->connect();
}
private function connect()
{
$this->link = mysql_connect($this->server, $this->username, $this->password);
mysql_select_db($this->db, $this->link);
}
public function __sleep()
{
return array('server', 'username', 'password', 'db');
}
public function __wakeup()
{
$this->connect();
}
}
$conn1 = new Connection();
$conndata = serialize($conn1);
$conn2 = unserialize($conndata);
تابع __tostring
این تابع هنگامی فراخوانی میشود، که بخواهید یک کلاس را چاپ کنید:
class Book {
public $bookname;
public $author;
public function __construct($bookname, $author) {
$this->bookname = $bookname;
$this->author = $author;
}
function __tostring() {
return "Book Name: ".$this->bookname."
Book Author: ".$this->author;
}
}
$book1 = new Book('Learning PHP', 'Hoda');
echo $book1;
نکته: تابع __tostring باید حتما یک مقدار را برگرداند.
تابع __invoke
این تابع هنگامی فراخوانی میشود که کاربر کلاس بخواهد یک کلاس را همانند یک تابع به کار بگیرد:
class Book {
function __invoke($value) {
print $value;
}
}
$book1 = new Book;
$book1();
نکته: این تابع تنها در PHP 5.3.0 به بالا در دسترس است. برای دیدن نسخه PHPی که در حال استفاده از آن هستید، میتوانید تابع phpinfo() را به کار بگیرید.
__clone
در PHP 5 همانند زبانهای دیگر OOP اگر یک شی را به شی دیگری منتسب کنید، تنها یک Reference یا اشارهگر از شی اول در شی دوم ریخته میشود. به این ترتیب حافظه این دو شی یکسان است و اگر شما یکی از این اشیاء را پاک کنید، دیگری هم پاک خواهد شد. با کمک تابع clone میشود یک کپی از یک شی درست کرد و در شی دیگری ریخت. تابع clone موجود در PHP، تابع __clone کلاس را صدا میزند تا کار ریختن شیهای داخلی کلاس اول انجام بشود.
آخرین دیدگاهها
5 روز 14 ساعت پیش
6 روز 30 دقیقه پیش
6 روز 3 ساعت پیش
6 روز 7 ساعت پیش
2 هفته 5 روز پیش
3 هفته 2 روز پیش
3 هفته 2 روز پیش
3 هفته 3 روز پیش
3 هفته 3 روز پیش
3 هفته 3 روز پیش