PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : تحلیل و تفسیر خط به خط کد php ممکن است؟



سیدرضا بازیار
September 27th, 2018, 10:01
سلام

یادمه توی دوران دانشگاه که برنامه نویسی c رو یاد میگرفتیم یه روش بود که نشون میداد یک کد دقیقا در هر مرحله چه کاری رو انجام میده و کامل کد رو تا انتها برای ما اجرا میکرد...

حالا توی برنامه نویسی php توی برخی کد ها واقعا زمان بر هست که متوجه بشم کد من داره چه کاری انجام میده

راهی هست که بتونم ببینم در هر مرحله کد من چیکار میکنه؟

الان کد پایین رو مشاهده کنید:


function xxx($n){
if($n == 1){
return 1;
}else{
return 3 * xxx($n-1);
}
}
echo xxx(5);


توی قسمت پایین دقیقا چه اتفاقی می افته؟


return 3 * xxx($n-1);


شما اگه عدد 3 رو تغییر بدین متوجه میشید که محاسبه تغییر میکنه

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

*Mr.Mehdi*
September 27th, 2018, 17:14
سلام

یادمه توی دوران دانشگاه که برنامه نویسی c رو یاد میگرفتیم یه روش بود که نشون میداد یک کد دقیقا در هر مرحله چه کاری رو انجام میده و کامل کد رو تا انتها برای ما اجرا میکرد...

حالا توی برنامه نویسی php توی برخی کد ها واقعا زمان بر هست که متوجه بشم کد من داره چه کاری انجام میده

راهی هست که بتونم ببینم در هر مرحله کد من چیکار میکنه؟

الان کد پایین رو مشاهده کنید:


function xxx($n){
if($n == 1){
return 1;
}else{
return 3 * xxx($n-1);
}
}
echo xxx(5);


توی قسمت پایین دقیقا چه اتفاقی می افته؟


return 3 * xxx($n-1);


شما اگه عدد 3 رو تغییر بدین متوجه میشید که محاسبه تغییر میکنه

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

سلام این فانکشنی که شما نوشتی به صورت بازگشتی یا recursive هست و درک کارکرد اینطور موارد کمی سخته

می تونید این فانکشن را تریس کرده و با رسم درخت بازگشت جوابش رو بدست بیارید

مثلا اون قسمتی که گفتین چه کاری انجام میده ، فرض کنید با مقدار 3 این فانکشن فراخوانی بشه ، میرسیم به
return 3 * xxx(3-1) و اینجا دوباره فانکشن با مقدار 2 فراخوانی میشه


return 3 * xxx(2-1) و در این مرحله چون فانکشن با مقدار 1 فراخوانی میشه و داخل شرط نوشتیم اگر $n مساوی با 1 بود 1 برگشت داده بشه مقدار 1 رو داریم که


xxx(2-1) مقدار 1 رو به ما میده از طرفی در 3 ضرب میشه و کلا میشه 3، خب دوباره به بالا بر میگردیم مقدار
xxx(3-1) برابر 3 شد و دوباره ضرب در 3 میشه 9 ،

که جواب نهایی ما هست

راه آنلاین و سریعی واسه این کار سراغ ندارم ولی خب امیدوارم صحبت ها بهتون کمک بکنه

موفق باشید

hoka
September 27th, 2018, 17:50
در تکمیل صحبت های ایشون میتونم اینطوری براتون توضیح بدم که اون n-1 رو شما یک لوپ در نظر بگیر که 3 رو در خودش ضرب میکنه تا جایی که n = 1 باشه و باز هم در خودش ضرب میشه به خاطر if

مثلا عبارت زیر


echo xxx(5);

میشه


3 * 3 * 3 * 3 * 1

masih_enter
September 27th, 2018, 19:47
برای تست کد ها میتونید از این سایت استفاده کنید .
http://sandbox.onlinephpfunctions.com/code/8259c2531140c5648308f6d1a2c2347fcf22a0c6

JeyServer
September 27th, 2018, 20:46
سلام
فکر میکنم دوستان به جای اینکه ابزار تحلیل و آنالیز اجرا رو به شما معرفی کنند، خودشون برای شما اینکارو انجام دادن!
----
قطعا نیاز شما با XDebug حل میشه.
مخصوصا قابلیت function trace:
https://xdebug.org/docs/execution_trace

masih_enter
September 27th, 2018, 20:51
سلام
فکر میکنم دوستان به جای اینکه ابزار تحلیل و آنالیز اجرا رو به شما معرفی کنند، خودشون برای شما اینکارو انجام دادن!
----
قطعا نیاز شما با XDebug حل میشه.
مخصوصا قابلیت function trace:
https://xdebug.org/docs/execution_trace

بخش دیباگینگ ide هایی مثل phpstorm هم خوبه . میشه خط به خط دستورات رو اجرا کرد و تغیرات متغیر هارو مشاهده کرد و بهتر تحلیل کرد کد های دیگرانو.

سیدرضا بازیار
September 27th, 2018, 21:35
سلام
فکر میکنم دوستان به جای اینکه ابزار تحلیل و آنالیز اجرا رو به شما معرفی کنند، خودشون برای شما اینکارو انجام دادن!
----
قطعا نیاز شما با XDebug حل میشه.
مخصوصا قابلیت function trace:
https://xdebug.org/docs/execution_trace

من از phpstorm استفاده میکنم xdebug هم نصب کردم
حالا چطوری این قابلیت رو میشه فعال کرد؟

- - - Updated - - -


سلام این فانکشنی که شما نوشتی به صورت بازگشتی یا recursive هست و درک کارکرد اینطور موارد کمی سخته

می تونید این فانکشن را تریس کرده و با رسم درخت بازگشت جوابش رو بدست بیارید

مثلا اون قسمتی که گفتین چه کاری انجام میده ، فرض کنید با مقدار 3 این فانکشن فراخوانی بشه ، میرسیم به
return 3 * xxx(3-1) و اینجا دوباره فانکشن با مقدار 2 فراخوانی میشه


return 3 * xxx(2-1) و در این مرحله چون فانکشن با مقدار 1 فراخوانی میشه و داخل شرط نوشتیم اگر $n مساوی با 1 بود 1 برگشت داده بشه مقدار 1 رو داریم که


xxx(2-1) مقدار 1 رو به ما میده از طرفی در 3 ضرب میشه و کلا میشه 3، خب دوباره به بالا بر میگردیم مقدار
xxx(3-1) برابر 3 شد و دوباره ضرب در 3 میشه 9 ،

که جواب نهایی ما هست

راه آنلاین و سریعی واسه این کار سراغ ندارم ولی خب امیدوارم صحبت ها بهتون کمک بکنه

موفق باشید

وقتی شرط if رو اجرا میکنه، چطوری برمیگرده else رو هم اجرا میکنه؟ حلقه روی فانکشن اجرا میشه؟:-b

*Mr.Mehdi*
September 27th, 2018, 22:08
وقتی شرط if رو اجرا میکنه، چطوری برمیگرده else رو هم اجرا میکنه؟ حلقه روی فانکشن اجرا میشه؟:-b

در هر بار اجرا if و else که فقط یکیشون اجرا میشه و قسمت if هم حالت پایه فانکشن هست ، یعنی وقتی تابع با عدد 1 فراخوانی شد یه مقدار ثابت 1 رو برگشت داده میشه که اگر این شرط نباشه

تابع میفته داخل یه حلقه و هیچ وقت به پایان نمیرسه و اصطلاحا stackoverflow رخ میده

فکر میکنم عمده مشکل شما برمیگرده به اینکه مفهوم توابع بازگشتی رو بلد نیستین، که اگر سرچ کنید در موردشون و مطالبی بخونید صد در صد به فهم قطعه کدی که نوشتین کمک میکنه

موفق باشید

masih_enter
September 27th, 2018, 22:29
کتاب آموزش PHP از مقدماتی تا پیشرفته‎
http://p30download.com/fa/entry/51907

کتاب آموزش php به زبان ساده
http://www.tahlildadeh.com/EbookDetails/%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%DA%A9%D8%AA%D8%A7%D8%A8-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-php-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87

سیدرضا بازیار
September 27th, 2018, 22:38
در هر بار اجرا if و else که فقط یکیشون اجرا میشه و قسمت if هم حالت پایه فانکشن هست ، یعنی وقتی تابع با عدد 1 فراخوانی شد یه مقدار ثابت 1 رو برگشت داده میشه که اگر این شرط نباشه

تابع میفته داخل یه حلقه و هیچ وقت به پایان نمیرسه و اصطلاحا stackoverflow رخ میده

فکر میکنم عمده مشکل شما برمیگرده به اینکه مفهوم توابع بازگشتی رو بلد نیستین، که اگر سرچ کنید در موردشون و مطالبی بخونید صد در صد به فهم قطعه کدی که نوشتین کمک میکنه

موفق باشید

مشکل اصلی اینه که کد من بسیار پیچیده تر از این کد هست
فقط کد رو ساده کردم تا مفهوم دقیق رو متوجه بشم

دارم یه سیستم رو بر پایه فرمول هایی مینویسم واسه محاسبات فرمول های پیشرفته ریاضیات...

الان وقتی فرمول ها رو وارد توابع بازگشتی میکنم به شدت هنگ میکنم :d کاش میشد یه ابزار کمکی استفاده کرد

MJmoonwalk
September 28th, 2018, 00:03
شما اولویت عملگرها رو یادبگیرید

return 3 * xxx($n-1);
در کد ابتدا n منهای یک به تابع فرستاده میشه و بعد خروجی تابع در 3 ضرب میشه.