🚀 تخفیف ۳۵٪ + ۳.۵ میلیون هدیه! برنامه‌نویسی رو الان شروع کن - فقط امروز!
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ Amir Hossein Sattari
دسترسی به متد mul با مجیک متد call__
جامعه پی اچ پی ایجاد شده در ۰۴ تیر ۱۴۰۲

سلام

متد mul حتی بدون تعریف مجیک متد callstatic__ به درستی کار میکنه

    public static function mul($numbers)
    {
        $mul = 1;
        foreach($numbers as $number)
        {
            $mul *= $number;
        }
        return $mul;
    }

این متد mul

    public function __call($name, $arguments)
    {
        $math = new Math();
        return $math->{$name}($arguments);
    }

این مجیک متد call__

$gs = new GetSet();
echo $gs->sum(1,4,6) . PHP_EOL;  # result = 11
echo $gs->mul(1,4,7) . PHP_EOL;  # result = 28

نتیجه هم به درستی چاپ میشه در حالی که mul استاتیک هست و من مجیک متد callstatic__ رو نساختم.

دلیلش چیه؟

سلام،

کدهاتون ناقص هست، بصورت کامل کلاس‌ها رو بفرستید.

محسن موحد ۰۴ تیر ۱۴۰۲، ۲۱:۵۳
class Math
{
    public function sum($numbers)
    {
        $sum = 0;
        foreach($numbers as $number)
        {
            $sum += (int)$number;
        }
        return $sum;
    }
    public static function mul($numbers)
    {
        $mul = 1;
        foreach($numbers as $number)
        {
            $mul *= (int)$number;
        }
        return $mul;
    }
}
class GetSet
{
    private $id = 50;
    private $data;
    public function __get($prop)
    {
        if(isset($this->data[$prop])) {
            return $this->data[$prop];
        }else {
            echo "Property $prop not defined!";
        }
    }
    public function __set($prop, $value)
    {
        $this->data[$prop] = $value;
    }
    public function __call($name, $arguments)
    {
        $math = new Math();
        return $math->{$name}($arguments);
    }
    // public static function __callStatic($name, $arguments)
    // {
    //     return Math::{$name}($arguments);
    // }
}
$gs = new GetSet();
echo $gs->sum(1,4,6) . PHP_EOL;
echo $gs->mul(1,4,7);

بفرمایید

Amir Hossein Sattari ۰۵ تیر ۱۴۰۲، ۱۴:۳۳

این موضوعی که مطرج کردید ارتباطی با __call یا __callStatic نداره.

موضوع اینجاست که متد static رو بصورت non-static صدا زدید که مشکلی نداره.

شما در php میتونید متدهای استاتیک رو از طریق آبجکت call کنید اما پراپرتی استاتیک رو نمیتونید.

همچنین قبل از نسخه php7 میتونستید متدهای غیر استاتیک رو بصورت استاتیک فراخوانی کنید. منتها از php7 وارنینگ deprecated دریافت میشه و از php8 یک fatal error دریافت میشه. اگر متد غیر استاتیک رو بصورتی استاتیکی فراخوانی کنیم دیگه $this رو نمیتونیم داشته باشیم.

بهترین پاسخ
محسن موحد ۰۵ تیر ۱۴۰۲، ۱۷:۳۰