PDA

View Full Version : متد و فیلد static



pary_daryayi
پنج شنبه 07 خرداد 1394, 08:41 صبح
با سلام .
من میخوام متدهای کلاسی که ایجاد میکنم static باشن .
اما فیلدهایی هم دارم که نمیخوام استاتیک تعریف بشن . از طرفی فیلدهای غیر استاتیک رو نمیشه در متدهای استاتیک صدا زد .
باید چکار کنم ؟
اگر فیلد رو استاتیک بگیرم ، آخرین نتیجه در اون باقی میمونه که نمیخوام اینطور باشه .

engmmrj
پنج شنبه 07 خرداد 1394, 09:51 صبح
امکان ایجاد object در متد های staic وجود ندارد ُ برای اینکار میتوانید از یک متد واسط بصورت زیر استفاده کنید .

class Stc
{
private $name = 'engmmrj';

public static function display()
{
echo static::call()->name;
}


public static function call()
{
return (new self());
}

}

$class = Stc::display();

pary_daryayi
شنبه 23 خرداد 1394, 17:10 عصر
در کد زیر هم فیلد والد و هم فیلد فرزند استاتیک هستند .



class A{


protected static $tb='ok';

public static function test(){
echo self::$tb;
}

}


class B extends A{


protected static $tb = 'person';

}


B::test();


وقتی شی ای از کلاس فرزند ایجاد میشه آیا نباید مقدار فیلد اون کلاس جایگزین بشه ؟ میخوام person رو چاپ کنه اما OK چاپ میشه

-------------------------

فیلدها رو بصورت غیر استاتیک هم که مینویسم ( با روش شما ) باز person رو چاپ نمیکنه و OK چاپ میشه . چرا ؟


class A{


protected $tb='ok';

public static function test()
{
echo static::call()->tb;
}


public static function call()
{
return (new self());
}

}


class B extends A{


protected $tb = 'person';

}


B::test();

arta.nasiri
شنبه 23 خرداد 1394, 18:07 عصر
سلام

وقتی از self استفاده میکنید به متغیری اشاره میکنه که تو همون کلاس تعریف شده و تو کلاس های مشتق شده نمیتونید مقدار اونو با تعریف مجدد متغیر یا مقداردهی مجدد تغییر بدید. البته منطقی هم بنظر میرسه. واسه این مورد شما باید از کلمه کلیدی static به جای self استفاده کنید تا به متغیری اشاره کنه که تو کلاس مشتق شده ایجاد یا مقداردهی شده.