راکت
حل شده

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

4 پاسخ

سلام دوستان

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

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

ثبت پرسش جدید

پاسخ‌ها

4
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

بهترین پاسخ

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

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

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

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

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

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

متد 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
tayyebi1989
@tayyebi.eng

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

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

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