متدها و ویژگی های static در شی گرایی

تاریخ: 04 اردیبهشت 1400

کلمه کلیدی static در شی گرایی، برای راحتی استفاده از متدها و ویژگی های یک کلاس ایجاد شده است.

کلمه کلیدی static چکار می کند؟

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

اما کلمه کلیدی static باعث می شود بتوانیم متدها یا ویژگی های یک کلاس را بدون ساختن آبجکت در دسترس داشته باشیم.

در واقع زمانی که کلمه static را همراه متد یا ویژگی کلاس می آوریم، آنها را تبدیل به متد یا ویژگی static کرده ایم.

 

متدهای static در کلاس

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

class Biawp {
    public static function show_url() {
        return 'Biawp.ir';
    }
}
echo Biawp::show_url(); //output: Biawp.ir

 

استفاده از this$ درون متدهای استاتیک مجاز نمی باشد. چون هیچ آبجکتی ساخته نمی شود که this$ معنا داشته باشد:

class Biawp {
    public $url = 'Biawp.ir';
    public static function show_url() {
        return $this->url;
    }
}
echo Biawp::show_url(); //output: error Using $this when not in object context

 

ویژگی های static در کلاس

اگر در هنگام تعریف یک ویژگی، از کلمه کلیدی static استفاده کنیم، آن ویژگی یک ویژگی static خواهد بود و برای دسترسی به آن نیاز به ساختن آبجکت نداریم:

class Biawp {
    public static $url = 'Biawp.ir';
}
echo Biawp::$url; //output: Biawp.ir

 

همانطور که مشاهده می کنید، برای دسترسی به ویژگی static، باید دابل کلون (Scope Resolution Operator) به همراه علامت $ بیاید.

نکته: دسترسی به ویژگی یا متد استاتیک با استفاده از arrow (<-) امکان پذیر نمی باشد.

 

استفاده از متد static درون کلاس

اگر بخواهیم از یک متد استاتیک درون کلاس استفاده کنیم، باید کلمه کلیدی self را به کار ببریم:

class Biawp {
    public static function show_url() {
        return self::set_url();
    }
    public static function set_url() {
        return 'Biawp.ir';
    }
}
echo Biawp::show_url(); //output: Biawp.ir

 

در دستور بالا متد set_url را در متد show_url فراخوانی کردیم.

چون متد show_url یک متد static است، باید از کلمه self استفاده کنیم. همین قضیه ما را مجبور می سازد که یک set_url نیز یک متد استاتیک باشد.

نکته: اگر متد ما استاتیک باشد، فقط متد استاتیک می گیرد ولی وقتی استاتیک نباشد، هم متد استاتیک و هم متد غیر استاتیک می گیرد.

 

استفاده از ویژگی static درون کلاس

اگر بخواهیم از یک ویژگی استاتیک درون کلاس استفاده کنیم، باید کلمه کلیدی self را به کار ببریم:

class Biawp {
    public static $url = 'Biawp.ir';
    public function show_url() {
        return self::$url;
    }
}
$object = new Biawp;
echo $object->show_url(); //Biawp.ir

 

استفاده از متد یا ویژگی static در subclass

اگر بخواهیم متد یا ویژگی static کلاس والد را در فرزندان داشته باشیم، باید از کلمه کلیدی parent استفاده کنیم. البته در نظر داریم که ویژگی و متد استاتیک را فقط در متد استاتیک می توانیم داشته باشیم:

class Foo
{
    public static $url = 'Biawp.ir';
    public static function show_url() {
        return self::$url;
    }
}
class Bar extends Foo
{
    public static function show_url_subclass() {
        return parent::$url .' '. parent::show_url();
    }
}
echo Bar::show_url_subclass(); //output: Biawp.ir Biawp.ir

 

استفاده از متد یا ویژگی static یک کلاس در کلاس دیگر

یکی از فایده های جالب کلمه static اینست که می توانیم متد ها یا ویژگی های static را مستقیما در کلاس دیگر استفاده نماییم:

class Foo {
    public static $url = 'Biawp.ir';
    public static function show_url($url) {
        echo $url;
    }
}
class Bar {
    public function show_url_var(){
        return Foo::$url;
    }
    public function show_url_method() {
        return Foo::show_url('Biawp.ir');
    }
}
$object = new Bar;
echo $object->show_url_var();
echo ' ';
echo $object->show_url_method();
//output: Biawp.ir Biawp.ir

 

 

 

دیدگاهتان را بنویسید