🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ پویا پارسایی
کجا و طبق چه شرایطی باید متد کلاسمون رو استاتیک تعریف کنیم؟
جامعه لاراول ایجاد شده در ۱۵ خرداد ۱۴۰۱

سلام و عرض ادب

داخل متد TwoFactor اومدیم متد generateCodeFor رو به صورت استاتیک تعریف کردیم:


namespace App\\Models;
use Illuminate\\Database\\Eloquent\\Model;
class TwoFactor extends Model
{
    public static function generateCodeFor($user)
    {
        $user->code()->delete();
        return static::create([
            'user_id' => $user->id,
            'code' => random_int(1000, 9999)
        ]);
    }
}

وقتی متد رو به صورت استاتیک تعریف کنیم، دیگه نیازی نیست از اون کلاس آبجکتی ساخته بشه و بعد اون متد روی اون آبجکت صدا زده بشه، مثل اینجا:


namespace App\\Services\\Auth;
use App\\Models\\TwoFactor;
use App\\Models\\User;
class TwoFactorAuthentication
{
    public const CODE_SENT = 'code.sent';
    public function requestCode(User $user)
    {
        $code = TwoFactor::generateCodeFor($user);
        $code->send();
        return static::CODE_SENT;
    }
}

موضوعی که اینجا متوجهش نمیشم اینه که خب اگر ما از مدل TwoFactor یه آبجکت بسازیم، بعد از روی آبجکتش همه متدهاش رو صدا بزنیم، چه فرقی داره؟

به طور مثال، به این صورت:

مدل TwoFactor:


namespace App\\Models;
use Illuminate\\Database\\Eloquent\\Model;
class TwoFactor extends Model
{
    public function generateCodeFor($user)
    {
        $user->code()->delete();
        return static::create([
            'user_id' => $user->id,
            'code' => random_int(1000, 9999)
        ]);
    }
}

بعد هر جا که خواستیم ازش استفاده کنیم، به این صورت یه آبجکت ازش میسازیم و متدهاش رو صدا میزنیم:


namespace App\\Services\\Auth;
use App\\Models\\TwoFactor;
use App\\Models\\User;
class TwoFactorAuthentication
{
    public function __construct(private TwoFactor $twoFactor)
    {
    }
    public const CODE_SENT = 'code.sent';
    public function requestCode(User $user)
    {
        $code = $this->twoFactor->generateCodeFor($user);
        $code->send();
        return static::CODE_SENT;
    }
}

به این صورت هم داره کار میکنه.

۱- این روش چه اشکالاتی داره؟

۲- از کجا باید متوجه بشیم که متدی که میخوایم واسه یه کلاس تعریف کنیم به صورت استاتیک باشه بهتره یا نباشه؟

سلام پوریای عزیز

ببینید شما باید در کلاس‌ها و متدهایی که نقش ابزاری یا کمکی دارن و نیاز به شیئشون نداریم اون‌ها رو باید بشکل static صدا بزنیم

برای همین اگر دقت کنید توی پیکج و حتی فریم ورک‌ها همه helper class‌ها متدهاشون static هست

Most helper or utility classes use static methods. You should only use non-static methods if you want to create multiple instances of your helper class, but since you just need a simple input -> function -> output, I would make the methods static.
محمد گازری ۱۶ خرداد ۱۴۰۱، ۰۷:۴۰

ممنون جناب گازری

اولین خط از همین نقل قولی که فرمودید، گفته:

Most helper or utility classes use static methods.

ولی اینجا متدی که استاتیک تعریف کردیم داخل helper و utility نیست و داخل مدل تعریف شده که خب تو برنامه‌مون جاهای زیادی میایم از مدلمون یک instance میسازیم که اگر این نقل قول صحیح باشه، اینجا خودمون نباید متد رو static تعریف کنیم.


در ادامه گفته شده که:

since you just need a simple input -> function -> output, I would make the methods static.

اینجا گفته شده اگه یه ورودی، فانکشن و بعد خروجی به صورت ساده داشتین، از استاتیک استفاده کنید.

که خب اینجا توی متد خودمون ما همچین چیزی رو نداریم، ما داریم توی متد خودمون چندتا متد دیگه رو صدا میزنیم و بعد خروجی رو میدیم:

public static function generateCodeFor($user)
{
    $user->code()->delete();
    return static::create([
        'user_id' => $user->id,
        'code' => random_int(1000, 9999)
    ]);
}

همونجوری که مشاهده میفرمایید، اول متد ()code، بعد متد ()delete، و بعدش هم ()create صدا زده میشه و نتیجه رو برمیگردونه، پس اینجا ما نیومدیم یه کار ساده روی ورودی انجام بدیم و خروجی رو برگردونیم.

که اینجا هم اگر نقل قول درست باشه، باز خودمون نباید متدمون رو استاتیک تعریف میکردیم.

پویا پارسایی ۱۶ خرداد ۱۴۰۱، ۰۷:۵۴

مشکلی نیست ببینید ما اینجا داریم یه شی از یوزر رو بهش پاس میدیم و روی اون شی، متد‌ها رو صدا میزنیم!

خود اون متدمون صرفا یه code generator هست و کار خاصی نمیکنه!

The static keyword is used in the context of variables and methods that are common to all the objects of the class. Therefore, any logic which can be shared among multiple instances of a class should be extracted and put inside the static method.
---------
Static methods are for functions that dont rely on an instance of the class being created.

به نیاز خود اون متد باید توجه کنید در جمله زیر

You should only use non-static methods if you want to create multiple instances
بهترین پاسخ
محمد گازری ۱۶ خرداد ۱۴۰۱، ۰۸:۰۵