سلام دوستان
بنده این دوتا magic method رو درک نمیکنم
میشه بهم بگین چیه و به چه دردی میخوره ؟!
@ali.bayat
@hesammousavi
@mohaligateway
@juza66
@eniack
@AliValinejad
و ....
وقتی که متدی از کلاسی رو فراخوانی کنی که در اون کلاس موجود نیست
قبل از اینکه اکسپشن throw بشه
PHP چک میکنه که:آیا متد call__ داری یا نه
اگر داشته باشی که اون متد اجرا میشه..
اگر هم نه که اکسپشن میگیری
از این تکنیک در فراخوانی بعضی متدهای الکوئنت در لاراول هم استفاده شده
بخوام توضیح بدم ممکنه درست توضیح ندم و باعث گمراهی شما بشه بهت پیشنهاد میکنم لینک زیر رو ببینی بهتره
https://ditty.ir/posts/php-magic-methods-part-1/5LyDn
و
https://ditty.ir/posts/php-magic-methods-part-2/5WDen
وقتی که متدی از کلاسی رو فراخوانی کنی که در اون کلاس موجود نیست
قبل از اینکه اکسپشن throw بشه
PHP چک میکنه که:آیا متد call__ داری یا نه
اگر داشته باشی که اون متد اجرا میشه..
اگر هم نه که اکسپشن میگیری
از این تکنیک در فراخوانی بعضی متدهای الکوئنت در لاراول هم استفاده شده
البته اینجا هم بنویسم همون مقاله رو که این دوتا متد رو توضیح دادن بد نیست. به هرحال برای دیگر دوستان و خودم خالی از لطف نیست
متد call()
این متد زمانی فراخونی میشه که میخوایم متدی رو از یک آبجکت فراخونی کنیم که غیرقابل دسترسی هست. در حالت عادی و بدون این متد اگه یک متد غیرقابل دسترسی رو فراخونی کنیم، خطا میگیریم که متدی که داریم فراخونی میکنیم وجود نداره:
class Boat { }
$obj = new Boat();
$obj->move(); // Call to undefined method Boat::move()
حالا اگه متد call رو به کلاس اضافه کنیم میتونیم این قضیه رو مدیریت کنیم:
class Boat
{
public function __call($name, $arguments)
{
$strArgs = implode(',', $arguments);
echo "You're calling the method $name with $strArgs arguments";
}
private function move()
{
echo "You will not see me";
}
}
$obj = new Boat();
$obj->move(true, true, true); // You're calling the method move with 1,1,1 arguments
همونطور که میبینیم وقتی توی خط آخر متد move رو صدا زدیم، متد call فراخونی شد و چون سطح دسترسی متد move برابر با private هست، این متد فراخونی نخواهد شد و برای فراخونی شدن اون باید سطح دسترسی رو به public تغییر بدیم یا بصورت دستی از توی متد call اون رو فراخونی کنیم:
public function __call($name, $arguments)
{
$this->move();
}
متد call دو تا آرگومان میگیره که اولی اسم متدی هست که داریم فراخونی میکنیم و آرگومان دوم، آرایهای شامل آرگومانهایی هست که به متد داریم پاس میدیم.
نکته: استفاده از متدهای Overloading باید با دقت انجام بگیره. چون همونطور که میبینیم داریم عملکرد طبیعی برنامه رو دستکاری میکنیم.
متد callStatic()
این متد مشابه متد call هست، با این تفاوت که متد callStatic زمانی فراخونی میشه داریم یک متد غیرقابل دسترسی استاتیک رو فراخونی میکنیم. این متد باید بصورت استاتیک تعریف شده باشه:
class Boat
{
public static function __callStatic($name, $arguments)
{
$strArgs = implode(',', $arguments);
echo "You're calling the static method $name with $strArgs arguments";
}
private static function move()
{
echo "You will not see me";
}
}
Boat::move(true, true, true); // You're calling the static method move with 1,1,1 arguments
دوستان به خوبی توضیح دادن . من فقط یه نکته بگم که لاراول در پس زمینه فِسادها از مجیک متد callStatic__ استفاده میکنه.یعنی متدهایی که استاتیک نیستن (non-static) رو به صورت استاتیک با فراخوانی آنها از داخل این مجیک متد انجام میده. یعنی در واقعیت متدهایی که از فِسادها فراخوانی میشن استاتیک نیستن.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟