پیاچپی چیست و این دوره چطور میسنجد؟
این نسخهی پیشنمایش عمومیه. برای نمره گرفتن، ذخیرهی پیشرفت و باز کردن درسهای بعدی ثبتنام کن.
ثبتنام رایگانورودخوش آمدی!
به سفرِ «پیاچپی از صفر تا برنامهنویس» خوش آمدی. قبل از اینکه حتی یک خط کد بنویسیم، یک مدلِ ذهنیِ درست بسازیم؛ همین مدلِ کوچک باعث میشود بقیهی دوره برایت ساده و قابلِ پیشبینی باشد. این درس کدِ گریدشدنی ندارد — فقط طرزِ فکر.
پیاچپی یک زبانِ اسکریپتی است
پیاچپی یک زبانِ اسکریپتی و تفسیری (interpreted) است. یعنی برخلافِ بعضی زبانها، مرحلهی جداگانهی «کامپایل» نداری؛ یک مفسر (interpreter) فایلِ تو را برمیدارد و از بالا به پایین، خطبهخط اجرا میکند. هر دستور بهترتیبی که نوشتهای اجرا میشود.
وقتی اسمِ پیاچپی را میشنوی شاید یادِ سایت و مرورگر بیفتی. پیاچپی واقعاً برای وب محبوب است، اما در این دوره ما اصلاً سراغِ وب نمیرویم. ما خودِ زبان را یاد میگیریم: متغیرها، رشتهها، آرایهها، توابع، کلاسها و آن کتابخانهی استانداردِ غنی. این پایهای است که هر کدِ پیاچپیِ خوب — وب یا غیرِوب — روی آن ساخته میشود.
کد کجا و چطور اجرا میشود؟
کدِ تو روی PHP 8.2 CLI داخلِ یک سندباکسِ امن اجرا میشود. «CLI» یعنی Command-Line Interface — همان اجرای پیاچپی از خطِ فرمان، بدونِ هیچ مرورگری. دستورِ اجرا دقیقاً این است:
php main.php
یعنی فایلِ پیشفرضِ تو همیشه main.php نام دارد و خروجی به کنسول (stdout) میرود، نه به یک صفحهی وب. هر چیزی که برنامهات چاپ کند، همانجا در کنسول دیده میشود.
تگِ بازِ <?php و چرا تگِ بسته را حذف میکنیم
هر کدِ پیاچپی باید داخلِ یک تگِ پیاچپی باشد. تگِ باز این است:
<?php
echo "salam";
تا وقتی مفسر این تگِ باز را نبیند، متن را بهچشمِ متنِ معمولی (مثلاً HTML) میبیند و اجرا نمیکند. به محضِ دیدنِ <?php، وارد «حالتِ پیاچپی» میشود و شروع به اجرا میکند.
یک تگِ بسته هم وجود دارد: ?>. در فایلهایی که پیاچپی را لای HTML میگذارند بهدردِ بخور است. اما در یک فایلِ خالصِ پیاچپی (که هیچ HTMLی ندارد) ما عمداً تگِ بستهی ?> را نمینویسیم. چرا؟ چون هر فاصله یا خطِ جدیدی که بعد از ?> بیاید، مستقیماً به خروجی نشت میکند و میتواند خروجیِ تو را خراب کند. حذفِ ?> این خطر را بهکلی از بین میبرد. پس قاعدهی ما در کلِ دوره:
فایل با
<?phpشروع میشود و هیچوقت با?>بسته نمیشود.
قراردادِ ارزیابیِ پلتفرم
در تمرینها، پلتفرم اینطور کارت را میسنجد:
- یک تکه کدِ کوچک بهنامِ harness بعد از کدِ تو به
main.phpاضافه میشود (در درسهای «برنامهی کامل» اصلاً harness نداریم و خودِ خروجیِ برنامهات سنجیده میشود). - فایل با
php main.phpاجرا میشود و stdout (هر چیزی که چاپ کردهای) جمع میشود. - خروجیِ تو پیش از مقایسه نرمالسازی میشود، یعنی این تفاوتها بخشیده میشوند: حروفِ بزرگ/کوچکِ لاتین یکدست میشوند، فاصلههای دورِ نشانهگذاری (مثلِ
,و.) حذف میشوند، فضای سفیدِ اضافی جمع میشود، و ارقامِ فارسی↔لاتین یکی شمرده میشوند. پس[1, 2, 3]و[1,2,3]یکیاند و۱۲با12برابر است. - نرمالسازی شکل را میبخشد، نه معنا را. اگر متنت اشتباه باشد، رد میشوی.
یک نتیجهی مهم: خروجی باید قطعی باشد
چون داوری خروجیِ تو را با یک رشتهی ثابت مقایسه میکند، خروجیِ تو هم باید قطعی (deterministic) باشد — یعنی هر بار که برنامه اجرا میشود دقیقاً همان خروجی بیاید. به همین خاطر در خروجیِ سنجیدهشده هیچوقت از مقدارهای تصادفی (مثلِ rand()) یا زمانِ واقعی (مثلِ time()) استفاده نمیکنیم. در درسهای بعد دقیقاً میبینیم چرا و چطور.
حالا مدلِ ذهنیات آماده است: یک فایلِ main.php، اجرا با CLI، خروجی به کنسول، و یک داوریِ نرمالشدهی قطعی. برویم اولین echo را بنویسیم!