• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
یک ویژگی در رفرنس رو یاد بگیرید
#1
سلام،
امروز گفتم یکم با رفرنس تمرین کنم ببینم چی می تونم یاد بگیریم. یه ویژگی ازش یاد گرفتم بعلاوه یک متغیر تازه که خیلی بکار میاد. گفتم شما هم بدونید بد نیست.
اول بدونید $GLOBALS[var] میاد و کل سورس رو میگرده دنبال اون مقداری که بجای var بهش داده شده تا عملی که ازش خواسته شده رو اعمال کنه مثل تغییر مقدار. بجای اینکه دوباره اون متغیر رو تعریف کنیم یا اول global کنیم بعد مقدارش رو تغییر بدیم و مقدار نهایی رو return کنیم.
به این توجه کنید:
کد پی‌اچ‌پی:
$var 5;
function 
A$name ) {
return 
$GLOBALS[$name];
}
print 
A(“var”);
// khoroji : 5 
فهمیدید کارش چیه؟ آفرین. اگر نه هم مورد نداره. برید جستجو کنید :دی
حالا بریم سر بحث اصلیمون. اینو ببینید لطفاً:
کد پی‌اچ‌پی:
function A$name ) {
return 
$GLOBALS[$name];
}
$var 5;
$value =& A“var” );
print 
$value;
//khoroji: 5 
حالا اگر مثل زیر بخوایم مقدار $value رو عوض کنیم مقدار $var چی میشه؟

کد پی‌اچ‌پی:
function A$name ) {
return 
$GLOBALS[$name];
}
$var 5;
$value =& A“var” );
$value 1;
print 
$value;
echo( 
‘ va ’ );
print 
$var;
//khoroji: 1 va 5 
دیدید که مقدار $var همونیه که بوده یعنی 5. ولی حالا می خوایم حالا اگر مقدار $value تغییر کرد ، متقدار $var هم تغییر کنه. نظرتون چیه؟
کد پی‌اچ‌پی:
function &A$name ) {
return 
$GLOBALS[$name];
}
$var 5;
$value =& A“var” );
$value 1;
print 
$value;
echo( 
‘ va ’ );
print 
$var;
//khoroji: 1 va 1 
مقدار $var هم تغییر کرد. حالا چه نکته هایی هست که باید بدونیم؟
نکته ها:
• وقتی فقط بخوایم مقدار متغیر دومی رو برابر مقدار متغیر اول کنیم مثل همیشه از = استفاده می کنیم اما حالا کافیه از =& استفاده کنید.
• ولی وقتی بخوایم مقدار متغیر دومی رو تغییر دادیم مقدار متغیر اول هم تغییر کنه کافیه به اول اون فانکشن (متغیر نه! اون بحثش فرق می کنه که بعد از این میگم) یک رفرنس یا & اضافه می کنیم. که در این حالت مقدار متغیر اولی همیشه برابر آخرین تغییر در آخرین متغیری هست که ارجاع داده شده بهش. (*یک مثال از این هم براتون میزنم.)

بحش متغیر که گفتم فرق می کنه اینجاست:
کد پی‌اچ‌پی:
$b 4;
$i =& $b;
print 
$i//khoroji: 4
$i 53;
print 
$b//khoroji: 53 
* اینم یک مثال از اونی که گفتم:
کد پی‌اچ‌پی:
function &A$name ){
return 
$GLOBALS[$name];
}
$var 5;
$value =& A“var” );
$value 43;
print 
$var//khoroji: 43
$ali =& A“var” );
print 
$ali//khorooji: 43;
$ali 7;
print 
$var//khorooji: 7 
اگر از من می شنوید ، فقط خوندن اینجور مطالب اصلاً کافی نیست. خود من همین الان که دارم اینو می نویسم ، وقتی فکر می کنم ، می بینم هنوز گیج میزنم و نمیدونم کجا و چطور باید ازش استفاده کنم. البته دلیلش رو می دونم. دلیلش اینه که هدفی ندارم که توش بخوام از رفرنس استفاده کنم. اگر داشته باشم ، خب مثل همیشه اول تو ذهنم می نویسمش و اونجا متوجه میشم که کجا باید استفاده کنم.
پیشنهاد می کنم زیاد بنویسید. هرچی به ذهنتون خطور می کنه بنویسید. شاید کاربرد نداشته باشه اونی که می نویسید ولی بنویسید تا یه جا اشتباه کنید. وقتی آدم اشتباه می کنه و راه حلش رو پیدا می کنه برای همیشه تو ذهنش می مونه و بنظر من این تمرینه نه اینکه چیزی که بلدید رو هی و هی بنویسید.

دوستانی که بحث رفرنس رو بهتر بلدن ، اگر تو این موضوع که عرض کردم جایی اشتباه کردم یا کم گفتم خواهش می کنم شما تکمیلش کنید تا همه یاد بگیریم. مرسی Heart
غایب
  پاسخ
تشکر شده توسط :
#2
خروجی ها رو چک کن چیزی که شما تو خروجی گفتی نیست
  پاسخ
تشکر شده توسط :
#3
ای وای بر منIdeaIdea علی رضاجان احتمالا چیزی نزدی؟ چرا اینقدر پیچوندی قضیه روExclamationExclamation

در مورد GLOBALS درسته از رفرنس بهره میگیه. اما کاربردش فقط یک چیز هست. اون هم دسترسی به متغیر های سراسری در توابع تون. من یکی از مثال های خودتون رو عوض میکنم

کد پی‌اچ‌پی:
$var 5;
function 
A$num ) {
$GLOBALS['var'] = $num;
}
A(200);
print 
$var;

خروجی ما اینجا 200 هست 

در مثال بالا در حالت معمولی ما نمی تونیم در تابعمون به متغیر $var دسترسی پیدا کنیم. پس میایم به کمک GLOBALS بهش دسترسی پیدا میکنیم. میخونیمش یا تغییرش میدیم. اصلا نیاز به بازگشت هیچ خروجی هم نیست (که اشتباه و مشکلات امنیتی زیادی میتونه به بار بیاره)


نقل قول:اگر از من می شنوید ، فقط خوندن اینجور مطالب اصلاً کافی نیست. خود من همین الان که دارم اینو می نویسم ، وقتی فکر می کنم ، می بینم هنوز گیج میزنم و نمیدونم کجا و چطور باید ازش استفاده کنم. البته دلیلش رو می دونم. دلیلش اینه که هدفی ندارم که توش بخوام از رفرنس استفاده کنم. اگر داشته باشم ، خب مثل همیشه اول تو ذهنم می نویسمش و اونجا متوجه میشم که کجا باید استفاده کنم.
پیشنهاد می کنم زیاد بنویسید. هرچی به ذهنتون خطور می کنه بنویسید. شاید کاربرد نداشته باشه اونی که می نویسید ولی بنویسید تا یه جا اشتباه کنید. وقتی آدم اشتباه می کنه و راه حلش رو پیدا می کنه برای همیشه تو ذهنش می مونه و بنظر من این تمرینه نه اینکه چیزی که بلدید رو هی و هی بنویسید.
الان شب پدر و این حرفاست. پس این حرف رو از من پسرم گوش کن Big Grin
نمی خوام داستان 3 تا چوب رو بگم.اما اینجور مواقع بهترین کار خوندن این مباحث در داکیومنت پی اچ پی هست. فکر میکنم شما هم مثل من ،فقط مثال های این داکیومنت رو نگاه می کنید.(جونی های من Tongue)

اما نکاتی که شما مد نظر نگرفتید.
1- در کتابچه از رفرنس فقط در مباحث ابجکت و شی گرایی صحبت شده. نه متغیر ساده.
2- در توضیحاتش فرمورده
نقل قول:Since PHP 5, new returns a reference automatically, so using =& in this context is deprecated and produces an E_DEPRECATED message in PHP 5.3 and later, and an E_STRICT message in earlier versions. (Technically, the difference is that, in PHP 5, object variables, much like resources, are a mere pointer to the actual object data, so these object references are not "references" in the same sense used before (aliases). For more information, see Objects and references.)

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


  پاسخ
تشکر شده توسط : cyletech Padideh
#4
نقل قول:خروجی ها رو چک کن چیزی که شما تو خروجی گفتی نیست
کدوم یکیشون؟ البته سینگل کوتیشن ها چون از ورد کپی شده ، مدل فارسی هست. اونا باید اول درست کنید بعد تست کنید.

نقل قول:در مورد GLOBALS درسته از رفرنس بهره میگیه. اما کاربردش فقط یک چیز هست. اون هم دسترسی به متغیر های سراسری در توابع تون. من یکی از مثال های خودتون رو عوض میکنم
من نخواستم از GLOBALS صحبت کنم جیگرتو خام خام Blush اون یک تیکه کوچولو توضیح از کارش بود که اگر دوستان تو نمونه کد ها دیدن ، باهاش از پیش آشنایی داشته باشن.

نقل قول:اصلا نیاز به بازگشت هیچ خروجی هم نیست (که اشتباه و مشکلات امنیتی زیادی میتونه به بار بیاره)
راستش رو بخوای بحث ریترن رو هنوز خوب یاد نگرفتم ... باید برم بخونم.

نقل قول:الگو سینگلیشن رو در شی گرایی مطالعه کنید.
لینک پیلیز Heart
غایب
  پاسخ
تشکر شده توسط : Padideh
#5
مثال آخری
  پاسخ
تشکر شده توسط :
#6
(۱۳۹۰ خرداد ۲۶, ۱۱:۳۹ ق.ظ)cyletech نوشته:
نقل قول:خروجی ها رو چک کن چیزی که شما تو خروجی گفتی نیست
کدوم یکیشون؟ البته سینگل کوتیشن ها چون از ورد کپی شده ، مدل فارسی هست. اونا باید اول درست کنید بعد تست کنید.

نقل قول:در مورد GLOBALS درسته از رفرنس بهره میگیه. اما کاربردش فقط یک چیز هست. اون هم دسترسی به متغیر های سراسری در توابع تون. من یکی از مثال های خودتون رو عوض میکنم
من نخواستم از GLOBALS صحبت کنم جیگرتو خام خام Blush اون یک تیکه کوچولو توضیح از کارش بود که اگر دوستان تو نمونه کد ها دیدن ، باهاش از پیش آشنایی داشته باشن.

نقل قول:اصلا نیاز به بازگشت هیچ خروجی هم نیست (که اشتباه و مشکلات امنیتی زیادی میتونه به بار بیاره)
راستش رو بخوای بحث ریترن رو هنوز خوب یاد نگرفتم ... باید برم بخونم.

نقل قول:الگو سینگلیشن رو در شی گرایی مطالعه کنید.
لینک پیلیز Heart

منظورم این بود
کد پی‌اچ‌پی:
$var 5;
function 
A$name ) {
return 
$GLOBALS[$name];
}
print 
A(“var”);
// khoroji : 5 

نقل قول:ن نخواستم از GLOBALS صحبت کنم جیگرتو خام خام Blush اون یک تیکه کوچولو توضیح از کارش بود که اگر دوستان تو نمونه کد ها دیدن ، باهاش از پیش آشنایی داشته باشن.
پس لطفا بگید هدفتون از اینکه در تمامی مثال ها استفاده کردید از تابع A که داخل اون هم از GLOBALS استفاده کردید چه بوده؟

و این هم الگو سینگلیشن
کد پی‌اچ‌پی:
http://www.phppatterns.com/docs/design/singleton_pattern 
  پاسخ
تشکر شده توسط :
#7
نقل قول:مثال آخری
نه انگار هنوز کار $GLOBALS رو نفهمیدی. شاید تو فکر می کنی. وقتی مقدار $value تغییر کنه و $var هم مقدار اون رو بگیره برای دفعه بعد همون مقدار اولیش بر می گرده. در صورتی که دیگه تغییر کرده. شما خودت کد رو امتحان کن. خروجی همونیه که گفتم.
نقل قول:پس لطفا بگید هدفتون از اینکه در تمامی مثال ها استفاده کردید از تابع A که داخل اون هم از GLOBALS استفاده کردید چه بوده؟
چون $var خارج فانکشن تعریف شده بود ، برای دسترسی بهش باید از $GLOBALS استفاده می کردم تا بیاد خارج و مقدارش رو تغییر بده. من بخاطر این ازش استفاده کردم. ولی برای درک بهتره موضوع اصلی که رفرنس هست یک توضیح کوچولو ازش دادم تا دوستان دچار اشتباه نشن و فکر نکن این یک متغیر هست که خودم تعریف کردم! فقط همین.
غایب
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان