بایگانی دسته: برنامه نویسی

PHP در راه انتشار – قسمت دوم

با تاخیر خیلی زیاد بلاخره اینو گفتم بنویسم که موضوعم ناقص نمونه.

در پست PHP در راه انتشار – قسمت اول درباره یکسری از مهمترین تغیرات نسخه هفتم PHP گفتم و حالا میخوام بقیشونو بگم.

تعریف ثابت آرایه ای با استفاده از define

در نسخه ۵.۶ این امکان اضافه شده بود که از طریق const یک ثابت با مقدار آرایه ای تعریف کنیم. ولی یک مشکل اساسی داشت و ان هم این بود که شما نمیتونستید از متغیر های مقدار دهی شده برای مقدار دهی ثابت استفاده کرد. یکم توضیحش سخته. اجازه بدید نشون بدم.

مثلا به دستورات زیر دقت کنید. توی این دستورات خط دوم ارور میده.

ولی اگه من جایی نیاز داشته باشم تا با استفاده از یک متغیر یک ثابت رو مقدار دهی کنم پس باید چیکار کنم؟ خب اینجاست که define با تغیرات نسخه ۷ به کمکمون میاد.

خب خیلی راحت همینکار رو با define میکنیم و هیچ اروری هم دریافت نمیکنیم.

استفاده گروهی از namespace ها

خب برای اینم باز مثال ببینیم بهتره.

مثلا کد زیر برای دوران قبل از PHP7 بود:

همین کد بعد از دوران پیدایش نسخه ۷ام به این شکل میشه:

تابع intdiv 😐

این تابه دوتا پارامتر به عنوان ورودی میگیره و بخش صحیح حاصل تقسیم پارامتر اول به دوم رو برمیگردونه.

اینکه این تابع رو خودمون تعریف کنیم کار خیلی راحتی هست ولی خب گذاشتن دیگه…

پارامتر session_start

احتمال خیلی زیاد با session_start آشنا هستید. ولی خب این تابع هیچ پارامتری دریافت نمیکرد؛ البته تا نسخه هفتم. حالا به عنوان پارامتر اختیاری میتونه آرایه‌ای از تنظیماتی که قبل از این باید از php.ini تغیرشون میدادیم بگیره.

کلاس IntlChar

ّIntlChar یک کلاس از پیش تعریف شدست که داخل پر از ثابت ها و متود هایی هست که مربوط به بررسی و جمع آوری یکسری از اطلاعات مربوط به کاراکتر ها است.

تعدا ثابت ها و متود های داخل این کلاس به قدری زیاده که حتی تصور اینکه اینجا بررسیشون کنم ترسناکه. پس اگر میخواید دربارش بخونید برید به صفحه خود IntlChar داخل مستندات PHP .

 

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

تیغ اوکام

william_ockham
William Ockham

قبل از هر چیزی باید با ویلیام اوکام آشنا بشید ولی من خیلی مختصر دربارش میگم. اگر بیشتر میخواستید بدونید میتونید به صفحه ویلیام اوکام در ویکیپدیا مراجعه کنید.

ویلیام اوکام فیلسوف و منطق‌دان انگلیسی که ۷ قرن پیش زندگی میکرده. از عمده دلایل شهرتش اینهمه سال پس از مرگ، «اصل تیغ اوکام» یا با اسم دیگه «اصل اختصار تبیین» هست.

حالا این تیغ اوکام چی هست و چی میگه؟

ویکیپدیا میگه به شکل ترجمه عامیانه از لاتین تیغ اوکام این رو میگه:

در توضیح و توصیف، بخش‌های ناضروری را حذف کن.

ولی این که حالا این یعنی چی باز ویکی پدیا اینو میگه:

میان دو نگره که توان توصیف و پیش‌بینی یکسانی دارند، ساده‌ترین را بگزین.

خب فکر کنم یکم مشخص شده باشه که چی میگه.

تا اینجا که تمام استنادمون به ویکیپدیا بوده پس از همونجا یک مثال هم میارم براتون:

چرا در یخچال خانه هیچ غذایی نیست؟! آیا گروهی ازسارقان بین‌المللی آن را خالی کرده‌اند؟ آیا یخچال شیئی ساخته فضایی هاست که هر غذایی را ناپدید می‌سازد؟ یا اینکه دلیل خالی بودن یخچال، این است که هم اتاقی من و دوستانش دیشب گرسنه بوده‌اند؟

دیگه حس میکنم زیادی از حد مشخص شد یعنی چی! توی مثال بالا اینکه سارقین بین‌المللی غذاهارو دزدیده باشن ممکنه ولی خب واقعا ساده ترین حالت ممکن نیست و باید خیلی از موارد وارد داستان بشن تا بشه همچین چیزی رو توجیح کرد ولی اینکه یکی گشنش شده و غذای توی یخچال رو خورده یک نظریه خیلی سادست و لازم نیست داستان پیچیده ای برای انجام شدنش داشته باشیم.

ولی ایرادات زیادی به تیغ اوکام وارده که یکی از مهمتریناش معیار سادگی هست. وقتی که گفتیم «میان دو نگره که توان توصیف و پیش‌بینی یکسانی دارند، ساده‌ترین را بگزین.» ساده ترین اصلا کدوم یکی هست؟ ما به چی میگیم ساده؟!

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

خب مثالمو با زبان برنامه نویسی CPP میزنم.

یک برنامه ای رو اجرا میکنید و خروجی Hello World رو دریافت میکنید. به نظر شما برنامه نویس توی سورس برنامه چی نوشته که خروجیش این شده؟ خط اول، دوم یا سوم کد زیر؟

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

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

مثلا میشه به نظر من اینارو معیار های خوبی قرار داد و به اونهایی که این ویژگی هارو دادند برنامه های ساده تر گفت:

  • تعداد حلقه های کمتر
  • تعداد شرط های کمتر
  • تعداد متغیر های کمتر
  • خطوط کوتاهتر
  • و…

ابته منظورم از خطوط کوتاهتر خطوط کمتر نیست ها!! منظورم طول هر خط هست. به نظر من تعداد خطوط معیار مناسبی برای سادگی نیست.

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

اندر مزایای پایگاه داده های گراف محور و OrientDB

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

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

خلاصه اینکه یک نوع از این پایگاه داده های جدید هم پایگاه داده های گراف محور یا Graph Based هستند.از معروف ترین این دیتابیس ها میشه به NEO4j اشاره کرد. ولی خب دیتابیس هایی هم هستند که از چند نوع از ساختار های NoSQL پشتیبانی میکنند مثل OrientDB که هم از حالت گراف پشتیبانی میکند و هم از سند-گرا که یکی دیگر از ساختار های NoSQL است.

خلاصه این که برای کار خودم از پایگاه داده OrientDB استفاده کردم تا گراف رو داخلش ذخیره کنم.خب قبل از این من توی C# به MS-SQL و توی PHP به MySql متصل شده بودم و باهاشون کار کرده بودم.ولی خب تا حالا با Java به هیج دیتابیسی وصل نشده بودم. پس این کار برای من دوتا جنبه تازه داشت. اول اینکه برای اولین بار داشتم توی جاوا به پایگاه داده متصل میشدم و دوم اینکه اولین تجربه من با دیتابیس OrientDB و در کل یکی از زیر شاخه های جنبش NoSQL بود.

خب اولین کاری که باید میکردم ساختن یک دیتابیس محلی در آدرسی هست که خودم میخوام تا برنامه بتونه باهاش در ارتباط باشه.

فقط برنامه برای کار کردن به چند تا از کتابخانه های OrientDB نیاز داره که توی پوشه /lib خود دیتابیس میتونید پیداشون کنید.

خب من به این فایل ها برای کتابخانه نیاز دارم و اونارو به اپلیکیشن خودم اضافه میکنم.

خب حالا بریم سر برنامه. اول از هر چیزی من نیاز دارم تا ایمپورتشون کنم:

حالا دیگه تمام چیزی که نیاز دارم این یک خط کده تا کل گراف رو وارد آبجکت graph بکنم:

همچنین باید هروقت کارم با دیتابیس تموم شد متود shutdown رو از گرافم اجرا کنم تا ارتباط قطع بشه.خب پس به صورت اصولی تر میام از ساختار try finally استفاده میکنم.

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

به مثال های زیر در کار با گراف دقت کنید تا دیگه من شرح ندم:

از نکات خیلی جالبش اینه که نیاز به sync کردن نیست و هر کاری میکنید مستقیما توی پایگاه داده اعمال میشه.همچنین OrientDB از زبانی شبیه به SQL برای Query های خودش استفاده میکنه که بیشتر فقط زمانی که میخوایم بر اساس یک الگوی خاص دنبال یک چیزی بگردی ازش استفاده میکنیم. برای استفاده از اون هم میتونید به صورت زیر استفاده کنید:

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

http://orientdb.com/docs/master/index.html

روز جهانی عدد پی

امروز چهارده مارس هست و روزی که به اسم عدد پی نامگذاری شده.دلیلشم اینه که عددپی به طور تغریبی چیزی نزدیک به ۳٫۱۴ هست و امروز هم که ۳/۱۴ هست یعنی روز چهاردهم ماه سوم!

π = ۳٫۱۴۱۵۹۲۶۵۳۵

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

خب اینم از هدیه روز پی، برنامه تخمین عدد پی به روش سوزن بوفن با زبان زیبای جاوا.

هپی پی دی 😀

Happy Pi day

مسابقه چالش هوش مصنوعی شریف

در روز هایی که گذشت بخش غیر حضوری هفتمین دوره مسابقه Sharif Ai Challenge تموم شد و ماهم توی این مسابقات شرکت داشتیم.البته باز هم کار خاصی نکردیم ولی اینبار از خودمون خیلی راضیم.به چند دلیل:Sharif AI Challenge

  • اولین برنامه ای که با جاوا نوشتم بعد از Hello World برنامه همین مسابقه بود که خب واقعا به نظر خودم خیلی کمکم کرد تا دستم توی جاوا راه بیوفته.
  • باعث شد تا برم درباره یکسری از الگوریتم ها و مفاهیم هوش مصنوعی مطالعه بکنم(هرچند که توی برناممون ازشون استفاده نکردم)
  • رتبه ای هم که کسب کردیم نسبت به این که اولین بار بود داشتیم برنامه ای توی این سبک مینوشتیم رضایت بخش بود.(۶۷ ام شدیم درحالی که نزدیک به ۴۲۰ تیم از سطح جهان توی مسابقه شرکت داشتند)

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

البته توی برگزاری مسابقه بی‌نظمی موج میزد که اونم میگذاریم به حساب اینکه اولین دوری بود که مسابقه به صورت بین المللی برگزار میشد.ولی خب بی نظمی هایی مثل اینکه دوبار تاریخ ارسال کد تمدید شد در حالی که اگر زمان کمه برای همه کمه و توی مسابقه نباید از این اتفاقات بیوفته و یا اینکه همون روز های آخر برنامه ساخت زمین رو روی سایت گذاشتند، اونهم فقط برای سیستم عامل ویندوز!

از تمام مشکلات و ایرادات که بگذریم باید گفت که با یکی از سبک های خیلی زیبای مسابقات مواجه هستیم که برای خود من شرکت توی این مسابقه خیلی جذاب بود.مخصوصا که این مسابقه باعث یکسری اتفاقات خاصی شد که حسابی روی من اثر گذاشتن و زندگی رو هیجان‌انگیزتر کردن 😀

مشکل اصلی در تدریس زبان های کامپیوتر

سالهاست که کامپیوتر ها به زندگی ما انسان ها کمک میکنند و به همین دلیل هم همیشه دوره هایی برای یادگیری زبان های کامپیوتر از جمله برنامه نویسی و نشانه گذاری(Markup) وجود داشته.ولی معمولایک مشکل بزرگ دامن‌گیر مدرس میشود که باعث کند شدن روند یادگیری میشود.

مشکلی که از آن حرف میزنیم شروع نکردن به تدریس از جایی است که اول داستان است.معمولا در زمان تدریس یک یا دو مبحث را در ابتدا به صورت حفظی پیش میبریم و در نهایت میگوییم که بله فلان ها بهمان بودند 😐

مثلا در برنامه نویسی C یا C++ قالبی به این شکل را در ابتدا میگوییم که حفظ کنید:

یا مثلا در زبان نشانه گذاری HTML در ابتدا قالب زیر معرفی میشود:

خب حالا باید مثلا چیکار کنیم؟

جواب اینه که باید از یک قدم عقبتر شروع کنیم!مثلا قبل از اینکه قالب C رو معرفی کنیم بگیم که مفهوم تابع چیه، تابع چجوری تعریف میشه حالا INCLUDE چیه و چرا انجامش میدیم حالا بیایم بگیم که تابع main رو تعریف میکنیم به فلان شکل و ادامه ماجرا.

یا مثلا توی html باید اول بیایم مفهوم تگ رو بشناسونیم.بگیم که تگ html نشانگر چیه، تگ body چیه و باز هم ادامه ماجرا.

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

چرا با Ajax مشکل دارم؟

Ajax (بخوانید ای جکس) یک تکنولوژی هست که توی وب خیلی کاربرد داره و درواقع با جاوا اسکریپت پیاده سازی میشه.مثلا وقتی که میخوایم بدون لود شدن دوباره صفحه یک تغیری توش بدیم و باید اطلاعات جدیدیو از سرور  بگیریم از Ajax  استفاده میکنیم.

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

  1. سئو. ایجکس نباید اطلاعاتی که برای موتور های جستجو مهم هستند رو لود بکنه.بلکه اون اطلاعات باید با خود صفحه اصلی لود بشن.چرا؟ چون موتو جستجو اونوقت نمیتونه اونارو بخونه و مشخصه که نتونه بخونه چیزی از صفحه برای کش شدن توسط موتور جستجو وجود نداره.
  2. مشکلات اینترنت.اگه برنامه نویس اینترنت مسخره مارو در نظر نگرفته باشه ممکنه باعث بشه تا صفحه خوب کار نکنه.
  3. مشکل در کش شدن توسط مرورگر کاربرها.به همون دلایلی که توی مورد اول(سئو) گفتم مرورگر خود کاربرا هم نمیتونن این صفحاتو کش کنند و باعث میشه که هر دفعه کلش لود بشه.
  4. مسخره ترین اینترفیسی که ممکنه برای یک دستگاه ساخته بشه.مثلا مودم.اصلا کل داستان اینکه من یاد این افتادم که از Ajax بدم میاد به خاطر همین بود.داستان اینه که من اومدم برای مودم ۴G یک اسکریپت بنوسیم که بره از فلان صفحه ببینه که الآن اینترنت قطعه یا وصله و اکه وصله نوع کانکشن چیه (نسل دوم تا چهارم رو میگم) ولی خب سازندگان خوبش لطف کردن اینترفیسشو با Ajax  نوشتن تا من نتونم این اسکریپتو توی دو دقیقه بنویسم و اعصابم خورد بشه.

پس نتیجه ای که میگیریم اینه: Ajax خوبه ولی به جاش.وقتی شورشو در بیاریم فقط اذیت میکنه.پس منطقی باشیم و الکی کاری رو انجام ندیم.

برنامه نویسی وب، کابوس برنامه نویسی

برنامه نویسی وب یکی از بزرگترین بخش های برنامه نویسی رو تشکیل میده که در دنیای امروز هم هرروز داره نقشش پر رنگ تر میشه.هرروز شاهد این هستیم که اکثر سرویس ها دارن از حالت اپلیکیشنی به حالت تحت وب میرن که نشان از مهمتر شدن این زمینه داره.

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

ولی توی دنیای برنامه نویسان وب کار خیلی سخت تره.و پیچیده تر.به دلیل ساختار عجیبی که وب داره نمیشه همون کارهای قبلیرو اینجا تعریف کرد.مثلا ایجاد یک لوپ که همیشه منتظر اتفاق افتادن چیزی باشه به شکل رایجش توی اونجا، توی وب نداریم.

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

تکنولوژی های زیادی برای تولید یک سایت مدرن لارمه که اینجا لیستشون میکنم:HTML CSS AJAX و همچنین یک زبان برنامه نویسی برای مثال PHP یا پرل و پایتون و صد البته که C# هم از طرف مایکروسافت اینجا حرف هایی برای گفتن داره.

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

پس بیاید قدر این بچه هایی رو که توی بالا آوردن وبسایت هستند بدونیم.اینا خیلی زحمت‌کش هستند 🙂

ساخت تمام زیر مجموعه ها

سال پیش داشتم به ساخت یک دیتابیس از پسورد های هش شده با md5 فکر میکردم.به اینکه چجوری میتونه برنامه کل زیر مجموعه هارو بسازه.و یکی از جواب ها این بود: اعداد!

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

میتونیم با بعضی چیزا این خاصیتشون رو به شکل دلخواهی کنترل کنیم.مثلا با تعین کردن مبنای عدد یا بازه های خاصی از اعداد.

قرار بود یک دیکشنری از تمام کلمه های ممکن درست کنیم.برای همین اول ا.مپم کل کاراکتر هایی که ممکنه توی کلمات استفاده بشن رو نوشتم.۵۲ تا حروف بزرگ و کوچیک انگلیسی به ده تا ارقام صفر تا نه و ۱۸ تا هم کاراکتر های خاص که جمعا میشه ۸۰ تا کاراکتر.

برای همین یک عدد در مبنای ۸۱ رو خودم تعریف کردم و خاصیت های اعداد رو روش پیاده کردم و هر شماره عدد صفر تا ۸۰ رو معادل یک کاراکتر قرار دادم.

یعنی مثلا از یک عدد تک رقمی شروع میشه که وقتی یک رقمه ۸۱ کاراکتر رو تکی در نظر میگیره بعد وقتی دو رقمی شد کل حالت های ممکنی که میشه با ۸۰ کاراکتر یک رشته دو کاراکتری تولید کرد رو درست میکنه.

و اینجوری بود که تونستم یک دیکشنری درست بکنم که توش این کلمات باشن تا هششون کنم.(ولی خب میخواستم که تا عدد خیلی بزرگی برم جلو که دیدم اونوقت باید سالها منتظر بمونم تا این دیکشنری ساخته بشه. 🙂 )

PHP در راه انتشار – قسمت اول

اگه سازندگان PHP روی حرفشون بمونن قراره تا آخر این ماه میلادی نسخه جدید PHP منتشر بشه.حالا اینکه نسخه ۶ چیشد که یک داستانه ولی امکانات PHP جدید داستان دیگه ای داره.قبلا هم توی پست HHVM، باعث پیشرفت PHP یکم درباره امکانات نسخه جدید توضیح داده بودم ولی اینجا میخوام علاوه بر کد های اونها چند تا مورد دیگه رو هم بگم.

مقایسه سرعت PHP7

افزایش سرعت

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

دو عملگر جدید

در نسخه جدید دو عملگر مقایسه ای اضافه شده اند.مورد اول عملگر <=> و مورد دوم عملگر ??.

به مثال ها توجه کنید:

مثال عملگر <=>

مثال عملگر  ?? (برای توضیح بهتر اینجوری مثال میزنم که خط اول معادل خط دوم هست)

حذف شدن کامل بخشی از موارد منسوخ شده

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

برای اینکه ببینید دقیقا چیا حذف شدن میتونید به متنی که سایت خود پی اچ پی در این مورد منتشر کرده مراجعه کنید.

تعین نوع داده بازگشتی

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

تعین نوع داده ورودی

بعد از تعین نوع داده بازگشتی بلاخره نوع داده ورودی رو هم مشخص میکنیم.مثلا یک تابع فلان ورودی که میگیره از چه نوعی باید باشه.باز هم به مثال توجه کنید:

و البته این مورد هم در حالت عادی ارور نمیده ولی با فعال کردن strict_types درصورت درست نبودن ورودی ارور میده.

اینها مهمترین تغیراتاین نسخه از PHP بودند.یکسری دیگه از تغیرات رو هم توی پست جدا معرفی میکنم.(امیدوارم تا قبل از انتشار نسخه نهایی منتشرش بکنم.)

قسمت دوم PHP در راه انتشار بلاخره بعد از مدت طولانی منتشر شد و میتونید از لینکی که دادم اون رو مشاهده کنید.

PHP در راه انتشار – قسمت دوم