تعریف متدها و پراپرتی های مشترک

[rtl]چطور می تونم یک پراپرتی یا متد خاصی را طوری تعریف کنم که مثلا در همه کنترلر ها یا مدلها و یا ویوها قابل دسترسی باشه؟[/rtl]

[right][rtl]

[font="Tahoma"]اگر منظورت رو درست فهمیده باشم میتونی از static استفاده کنی

نحوه تعریف:[/font]

[/rtl]

[left]




class MyClass {

  	public static $myProperty;

  	public static function myMethod(){

        	echo 'Hello World!';

  	};

}



[/left][rtl]

[font="Tahoma"]نحوه دسترسی:[/font]

[/rtl]

[left]


MyClass::myProperty;

MyClass::myMethod();



[/left][/right]

[rtl]خوب این کلاسی که گفتید کجا باید تعریف بشه؟ منظورم توی کدوم مسیره؟

[/rtl]

[right][rtl]

[font="Tahoma"]راستش بایدی وجود نداره بیشتر به سلیقه خودتون و کاری که قراره این method یا property انجام بده بستگی داره

اگه مربوط به یه مدل خاصی میشه بذارش توی اون مدل

اگه قراره یه پردازش کلی انجام بده (مثلا convert یه مقدار به یه مقدار دیگه) میتونی یه کلاس Helper درست کنی بذاریش توی دایرکتوری component که البته باید توی فایل config اونو import کنی تا Yii بشناستش[/font]

[font="Tahoma"]و …[/font]

[/rtl]

[/right]

[font="Tahoma"][rtl]من خودم یه کلاس رجیستری بعنوان کامپوننت استفاده میکنم ، وقتی میخوام چیزی رو ست کنم و جایی دیگه بگیرم خیلی خوبه[/rtl][/font]


// protected/components/Registry.php

class Registry extends stdclass

{

	static private $ins = NULL ;

	

	static public function ins()

	{

		if(self::$ins === NULL)

			self::$ins = new self;

		return self::$ins ;

	}

}

[rtl]استفاده[/rtl]


// model or controller

$somevar = Registry::ins()->somevar;

if(empty($somevar))

	Registry::ins()->somevar='reza';

	

	

// controller or view or other model

echo Registry::ins()->somevar;



[rtl]دست شما درد نکنه. این stdClass چیه؟[/rtl]

[rtl]منظورم اینه که مثلا یه پراپرتی یا یه متد را در نظر بگیرم و در همه مدل ها بتونم از آن استفاده کنم. و مجدد آن را برای هر مدل جدا گانه تعریف نکنم.

قاعدتا باید توی خود کلاس اصلی CActiveRecord این کار را بکنم و یا بیام یه کلاس از آن ارث بگیرم و همه مدلهایم را از این کلاس جدید extended کنم.

برای این موضوع راهی هست؟

[/rtl]

[right]اگه واقعا همه مدل ها بهش نیاز دارند به نظرم راه حل خودت خوب و منطقیه.

[/right]

[font="Tahoma"][rtl]الان توی هر مدلی یا کنترلری یک پروپرتی از رجیستری رو ست کنی ، در مدل و کنترلر بعدش و حتی ویو هم قابل دسترس هست دیگه مشکل چیه؟[/rtl][/font]

[rtl]نه ببینید آقا منظورم اون نیست. اون روشی که شما مد نظرتون هست فقط برای یک مدل بوده و در جاهای دیگر قابل فراخوانی هست.

بنده منظورم این است که بیام مثلا یه متد یا پراپرتی را خاصا توی CActiveRecord تعریف کنم و برای هر مدل ممکنه با یک مقدار یا یک طور استفاده داشته باشد.

مثلا قبلا توی کیک دیده بودم که یه کلاس bootStarp داره که وقتی یک متد کلی می خواهی تعریف کنی اونجا تعریف می کنی و در هر کنترلری قابل فراخوای است.

یه چیزی شبیه به همین کامپونتن خودمان. می خوام ببینم خود Yii راهی داره یا نه؟

[/rtl]

[font="Tahoma"][rtl]کمی بیشتر توضیح بدید خوب میشه در کل هر پرپرتی باید از جایی ست شده باشه بالاخره اون روشی که گفتم همه جا میتونید ست کنید همه جا هم میتونید بگیرید مشکلی نداره چه آبجت باشه چه هر چیزی[/rtl][/font]

[rtl]ببیند مثلا همون کانورتی که دوستمان بالاتر گفتند. مثلا تو هر مدلی باید یه چیزی کانورت بشه، ولی این کانورت برای هر مدل پیاده سازی متفاوتی دارد، ولی قالب عمل یکسان است. این عمل در عین این که کلی است برای هر کلاس مدل متفاوت است.

اینطوری بگم یکبار تعریف کنم و توی هر مدل بتونم استفاده کنم.

[/rtl]

[rtl]برای این مو.ضوع که گفتید اگر اون کلاس را از CComponent ارث بگیرم چطوره؟

توی جای دیگه گفته بودند که بیام از CBehavior ارث بگیرم. کدام درسته؟ و هرکدام به چه دردی می خورند؟[/rtl]

[rtl]CBehavior برای functionality جدید که قرار هست به مودل اضافه بشه به کار میره. مثلا اگه می خواین مدل شما به صورت tree ذخیره بشه, می تونید TreeBehavior رو دانلود کنید و به مدلتون اضافه کنید.

CComponent برای library ها یا helper ها به کار می ره. مثلا DateTime یا Text (که مثلا قرار هست برای کار کردن با زمان, تاریخ, و یا متن به شما کمک کنن).[/rtl]

[rtl]ببخشید میشه این fanctionality برای CBehavior و CComponent را بیشتر توضیح دهید.[/rtl]

[rtl]ففکر می کنم این صفحه بهتر از من توضیح می ده: جعقم="http://www.yiiframework.com/doc/guide/1.1/en/basics.componenف"

component[/url].

اگر هنوز متوجه نشدید خوشحال می شم کمکی بکنم.

ممنون.

[right][font="Tahoma"][rtl]

تا شما نگید که این Method و Property دقیقا چه کاری قراره انجام بدن نمیشه گفت Behavoir خوبه یا Component یا Event …

اگر فرض کنیم همون کانورتی باشه توی پست بالا گفتی در این صورت بهترین راه حل به نظر من تعریف یه تابع convert توی یه کلاس پدر و override کردن این تابع توی تمام کلاسهای (مدلهای) فرزند هست

در مورد اون سه تا مفهوم هم این جوری بگم که هر component میتونه چند تا Behavoir و همینطور چند تا Event داشته باشه و هر Behavoir هم میتونه چند تا Event داشته باشه و در عین حال هر کدوم از این سه تا میتونن به طور مستقل هم تعریف بشن و نیازی نیست حتما توی همدیگه تعریف بشن بنابراین بستگی به پیاده سازی خودت داره

چیزی که متداوله اینه که component چند تا پردازش رو توی دل خودش داره اما Behavoir مختص انجام دادن یه کار هست و با اضافه کردن چند تا Behavoir به یه component میتونیم یه چیزی شبیه به قابلیت ارث بری چندگانه رو داشته باشیم که متاسفانه PHP به خودی خود پشتیبانی نمیکنه

برای توضیحات بیشتر میتونی هم اون لینکی که پرهام داده رو بخونی هم کتاب cookbook که مثالهای خوبی زده

[/rtl]

Bahavoir = Behavior , sorry ;)

[/font][/right]