یک باگ دیگه تو Activerecord

[rtl]

[right]

تو کلاس activerecord توابع getattribute و setattribute طوری تعریف شدن که با استفاده از آن می‌توان به تمام خاصیت‌های خصوصی این کلاس ومشتقاتش براحتی دسترسی داشت.

تو این دو تا کلاس به تابع property_exists توجه کنید که از ورژن ۵.۳ به بعد واسه خاصیت‌های خصوصی هم true برمی‌گردونه.

[/rtl]

[left]




public function getAttribute($name)

	{

		if(property_exists($this,$name))

			return $this->$name;

		elseif(isset($this->_attributes[$name]))

			return $this->_attributes[$name];

	}


public function setAttribute($name,$value)

	{

		if(property_exists($this,$name))

			$this->$name=$value;

		elseif(isset($this->getMetaData()->columns[$name]))

			$this->_attributes[$name]=$value;

		else

			return false;

		return true;

	}



[/left]

[/right]

[rtl]سلام. میشه بگید راه حلش چیه و چه طوری باید می بود؟[/rtl]

[rtl]

[right]

ظاهرا از اونجا که yii بر اساس php 5.1 نوشته شده که تو اون ورژن property_exists فقط خاصیت‌های عمومی رو true برمی‌گردونده و مشکلی نبوده.

شما اگه از php ورژن ۵.۳ به بالا استفاده می‌کنی اگه به این موضوع حساسیت دارین می‌تونین این توابع رو بازنویسی کنین

[/right]

[/rtl]

[font="Tahoma"][rtl]

البته این مشکل در مورد کلاسهای مشتق شده از CActiveRecord وجود نداره

به عنوان مثال در مورد متد getAttribute داریم:

[/rtl]




if(property_exists($this,$name))

	return $this->$name;



[rtl]

در اینجا درسته که تابع property_exists مقدار true برمیگردونه و شرط اجرا میشه اما از اونجایی که متد getAttribute در کلاس CActiveRecord یعنی کلاس parent تعریف شده بنابراین به property های private کلاسهای مشتق شده ازش دسترسی نداره

تنها مساله ای که وجود داره اینه که با استفاده از این متدها میشه توسط کلاس های مشتق شده از CActiveRecord به property های private از کلاس CActiveRecord دسترسی داشت.

[/rtl][/font]