کیهان
3 سال پیش توسط کیهان مطرح شد
4 پاسخ

متد های جادویی call و callStatic

سلام دوستان

بنده این دوتا magic method رو درک نمیکنم
میشه بهم بگین چیه و به چه دردی میخوره ؟!

@ali.bayat
@hesammousavi
@mohaligateway
@juza66
@eniack
@AliValinejad
و ....


ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
3

وقتی که متدی از کلاسی رو فراخوانی کنی که در اون کلاس موجود نیست
قبل از اینکه اکسپشن throw بشه
PHP چک میکنه که:‌آیا متد call__ داری یا نه
اگر داشته باشی که اون متد اجرا میشه..
اگر هم نه که اکسپشن میگیری

از این تکنیک در فراخوانی بعضی متدهای الکوئنت در لاراول هم استفاده شده


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 3 سال پیش آپدیت شد
1

بخوام توضیح بدم ممکنه درست توضیح ندم و باعث گمراهی شما بشه بهت پیشنهاد میکنم لینک زیر رو ببینی بهتره
https://ditty.ir/posts/php-magic-methods-part-1/5LyDn
و
https://ditty.ir/posts/php-magic-methods-part-2/5WDen


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 3 سال پیش مطرح شد
3

وقتی که متدی از کلاسی رو فراخوانی کنی که در اون کلاس موجود نیست
قبل از اینکه اکسپشن throw بشه
PHP چک میکنه که:‌آیا متد call__ داری یا نه
اگر داشته باشی که اون متد اجرا میشه..
اگر هم نه که اکسپشن میگیری

از این تکنیک در فراخوانی بعضی متدهای الکوئنت در لاراول هم استفاده شده


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 3 سال پیش آپدیت شد
2

البته اینجا هم بنویسم همون مقاله رو که این دوتا متد رو توضیح دادن بد نیست. به هرحال برای دیگر دوستان و خودم خالی از لطف نیست

متد 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

منبع
https://ditty.ir/posts/php-magic-methods-part-1/5LyDn


tayyebi1989
@tayyebi.eng 12 ماه پیش مطرح شد
0

دوستان به خوبی توضیح دادن . من فقط یه نکته بگم که لاراول در پس زمینه فِسادها از مجیک متد callStatic__ استفاده میکنه.یعنی متدهایی که استاتیک نیستن (non-static) رو به صورت استاتیک با فراخوانی آنها از داخل این مجیک متد انجام میده. یعنی در واقعیت متدهایی که از فِسادها فراخوانی میشن استاتیک نیستن.


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام