از متد های استاتیک استفاده کنیم یا خیر

- 2 هفته پیش
توسط mohammad آپدیت شد
mohammad ( 1800 تجربه )
2 هفته پیش

سلام دوستان وقت بخیر

من داخل پروژه ای ک دارم (پروژه نسبتا بزرگی هم هست) از mvc استفاده میکنم و متد های کلاس هام اکثرا (تقریبا همه ) استاتیک هستن.

خواستم ببینم استفاده زیاد از متغییر های استاتیک مشکلی پیش نمیاد ؟

چون تو زبان های جاوا و سی شارپ مشکل دار میشه خواستم ببینم تو php این مشکل نیس ؟

ممنون

بهترین پاسخ انتخاب شده توسط mohammad
علی بیات
2 هفته پیش

یکی از دلایل استفاده از شئ گرایی اینه که ما کلاس‌هایی با رفتار‌های مشخص داشته باشیم و بتونیم آبجکت‌هایی رو با اطلاعات مختلف از روی اون کلاس ها بسازیم..
برای مثال فرض کنید یه کلاس User داریم... اگر ما پراپرتی استاتیک age رو داشته باشیم.. مهم نیست چند تا شئ از این کلاس بسازیم .. تمام کاربران ما age یکسانی خواهند داشت و این پراپرتی بین همه اشیا به اشتراک گذاشته میشه. به کد زیر دقت کنید.

class User {
    public statis $age = 1;

    public function addAge() {
        static::$age++;
    }
}

$user1 = new User;
$user1->addAge();

$user2 = new User;
$user2->addAge();

echo User::$age;        // 3

اطلاعات باید درون اشیا کپسوله سازی (encapsulation) بشند و این اشتراک جلوی این کار رو می‌گیره..

شئ گرایی در PHP تقریبا شبیه به جاوا و C هست ..با این تفاوت که وراثت مستقیم از چند کلاس در این زبان موجود نیست...

در نتیجه اکثرا کارهای ساده رو در php با متدهای استاتیک انجام میدن. در این حد متد‌های استاتیک خوبندکه: یه ورودی بگیرند و یه خروجی به ما تحویل بدند. یا اینکه از متد های استاتیک استفاده میشه تا با متد‌های داخل کلاس کار کنند اما ساده‌تر بهش دسترسی داشته باشیم.. نمونه‌اش در سورس کد لاراول هم هست بطور مثال کلاس Str

    public static function contains($haystack, $needles)
    {
        foreach ((array) $needles as $needle) {
            if ($needle !== '' && mb_strpos($haystack, $needle) !== false) {
                return true;
            }
        }

        return false;
    }

    public static function lower($value)
    {
        return mb_strtolower($value, 'UTF-8');
    }

    public static function length($value, $encoding = null)
    {
        if ($encoding) {
            return mb_strlen($value, $encoding);
        }

        return mb_strlen($value);
    }

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

علی بیات ( 145287 تجربه )
2 هفته پیش
تخصص : توسعه دهنده ارشد وب

یکی از دلایل استفاده از شئ گرایی اینه که ما کلاس‌هایی با رفتار‌های مشخص داشته باشیم و بتونیم آبجکت‌هایی رو با اطلاعات مختلف از روی اون کلاس ها بسازیم..
برای مثال فرض کنید یه کلاس User داریم... اگر ما پراپرتی استاتیک age رو داشته باشیم.. مهم نیست چند تا شئ از این کلاس بسازیم .. تمام کاربران ما age یکسانی خواهند داشت و این پراپرتی بین همه اشیا به اشتراک گذاشته میشه. به کد زیر دقت کنید.

class User {
    public statis $age = 1;

    public function addAge() {
        static::$age++;
    }
}

$user1 = new User;
$user1->addAge();

$user2 = new User;
$user2->addAge();

echo User::$age;        // 3

اطلاعات باید درون اشیا کپسوله سازی (encapsulation) بشند و این اشتراک جلوی این کار رو می‌گیره..

شئ گرایی در PHP تقریبا شبیه به جاوا و C هست ..با این تفاوت که وراثت مستقیم از چند کلاس در این زبان موجود نیست...

در نتیجه اکثرا کارهای ساده رو در php با متدهای استاتیک انجام میدن. در این حد متد‌های استاتیک خوبندکه: یه ورودی بگیرند و یه خروجی به ما تحویل بدند. یا اینکه از متد های استاتیک استفاده میشه تا با متد‌های داخل کلاس کار کنند اما ساده‌تر بهش دسترسی داشته باشیم.. نمونه‌اش در سورس کد لاراول هم هست بطور مثال کلاس Str

    public static function contains($haystack, $needles)
    {
        foreach ((array) $needles as $needle) {
            if ($needle !== '' && mb_strpos($haystack, $needle) !== false) {
                return true;
            }
        }

        return false;
    }

    public static function lower($value)
    {
        return mb_strtolower($value, 'UTF-8');
    }

    public static function length($value, $encoding = null)
    {
        if ($encoding) {
            return mb_strlen($value, $encoding);
        }

        return mb_strlen($value);
    }

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

mohammad ( 1800 تجربه )
2 هفته پیش

سلام مجدد
@ali.bayat
سیار ممنون بابت پاسخ

من کارم شبیه مثال اول نیست و بیشتر شبیه به مثال دوم هست و برای کارایی مثل کار با مدل های دیتا بیس

یا فراخوانی متد های کنترلر در بخش روتر استفاده میشه.

میخوام ببینم اگر برای يوزري یک متد استاتیک استفاده بشه و يوزر دیگ بیاد و لازم باشه همون متد صدا زده بشه امکان دریافت اطلاعات یک سان هست بین این دو ؟

سپاس بابت پاسخ کاملتون.

Mojtaba Michael ( 14360 تجربه )
2 هفته پیش
تخصص : برنامه نویس FullStack لاراول و اندروید و فلاتر

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

علی بیات ( 145287 تجربه )
2 هفته پیش
تخصص : توسعه دهنده ارشد وب

خیر مشکلی نخواهید داشت

برای ارسال پاسخ باید وارد سایت شوید