یک کارگاه کاشی در یزد سفارشها را ثبت میکند. یک سفارش در PHP 8 چهار سطر است، و هیچکدامشان شبیه آن PHPای نیست که در ذهن آدمها مانده:
enum Vaziat: string { case Dar_Entezar = 'dar-entezar'; case Pokhte = 'pokhte'; case Ersal = 'ersal'; }final class Sefaresh { public function __construct(public readonly string $kod, public readonly int $kashi, public Vaziat $vaziat = Vaziat::Dar_Entezar) {} }
public readonly int $kashi داخل سازنده، هم اعلام میکند و هم مقدار میدهد، پس ویژگی و پارامتر و انتساب دیگر سه جا نیستند که باید با هم بخوانند. ساختنش با new Sefaresh(kod: 'YZ-118', kashi: 240) آرگومانها را سر محل فراخوانی نام میبرد، که بیشترین ارزشش روی سازندهای است که ترتیبش یادِ کسی نمیماند. مقدار پشت یک enum با ->value خوانده میشود، پس وضعیت بهشکل dar-entezar چاپ و ذخیره میشود بدون جدولی از ثابتها.
تعداد کاشی را بعداً عوض کنید و میایستد: Cannot modify readonly property Sefaresh::$kashi یک Error است نه یک هشدار، و همین تفاوت PHP امروز است با PHPای که هرچه به آن میدادند تحویل میگرفت. شاخه زدن روی وضعیت هم یک عبارت است نه یک دستور، چون match مقدار برمیگرداند و بدون تبدیل مقایسه میکند.
هر درخواست از هیچ شروع میشود
این همان حقیقتی است که کل زبان را توضیح میدهد و تقریباً هیچ مقدمهای با آن شروع نمیکند. یک درخواست PHP دنیا را میسازد، جواب میدهد، و همهاش را دور میریزد. اسکریپت آن کارگاه را دو بار اجرا کنید و شناسه شی هر دو بار #1 است، چون اجرای دوم لحظهای دیرتر در همان برنامه نیست، یک برنامه تازه است.
همه چیز از همین نتیجه میشود. هیچ چیز میان دو مشتری نشت نمیکند، چون چیزی برای نشت کردن نیست؛ متغیری که یک بازدیدکننده گذاشته برای بعدی دیده نمیشود، و همین یک خانواده کامل از اشکالها را حذف میکند که زبانهای سروری دیگر باید علیهشان طراحی کنند. نشت حافظه یک درخواست طول میکشد. و گذاشتن بیست سرور پشت یک نشانی به هیچ هماهنگیای نیاز ندارد، چون هیچ سروری چیزی نگه نداشته.
بهایش روی همان سطر است. هر درخواست از هیچ شروع میشود، پس هیچ چیز میان دو درخواست باقی نمیماند، و هر چیزی که باید بماند بیرون از فرایند نوشته میشود، که کارِ نشست و کوکی و پایگاه داده است، و دلیل اینکه پرسش «مقدار میان دو صفحه کجا رفت» اینجا دقیقاً یک جواب دارد. شکل یک اسکریپت زیر این مدل نحو، درخواست، و شکل یک اسکریپت است.
کد واقعاً از کجا میآید
خیلی کم از یک برنامه PHP در حال کار را کسی نوشته که اجرایش میکند. Composer وابستگیها را حل میکند و یک بارگذار خودکار مینویسد، پس کلاسها خودشان با نامشان بار میشوند و آن requireهای بالای هر فایل از بین میروند. آن سازوکار و پوشهای که پرش میکند وابستگی، نسخه و پوشه vendor است، و قاعدههای کلاس و فضای نام که بارگذاری خودکار را ممکن میکنند کلاس، فضای نام و بارگذاری خودکار. بالای آن یک فریمورک مینشیند و در عمل یکی از آنها: مسیریابی، لایه پایگاه داده و مجموعهای از تصمیمهای از قبل گرفتهشده، که مسیریابی، Eloquent و نظرهای فریمورک است.
آگهیای که مینویسد PHP، معمولاً منظورش همان فریمورک یا یک سامانه محتواست، بهندرت خود زبان بهتنهایی.
جواب برای کدام PHP نوشته شده
نسخههایی که تعیین میکنند یک جواب اینترنتی هنوز اجرا میشود یا نه
زبان میان ۲۰۱۵ و ۲۰۲۱ بیشتر از دهه پیش از آن عوض شد، و نتایج جستوجو عوض نشدند.
- ۲۰۰۴PHP 5نسخهای که بیشتر جوابهای PHP اینترنت رویش نوشته شدهاند
- دسامبر ۲۰۱۵PHP 7.0بازنویسیای که سریعش کرد و چیزهای زیادی را انداخت
- نوامبر ۲۰۲۰PHP 8.0match، آرگومان نامدار، ارتقای سازنده، str_contains، و اینکه صفر دیگر با یک کلمه برابر نیست
- نوامبر ۲۰۲۱PHP 8.1enum و ویژگی readonly، که بیشترِ همان کلاس سفارش بالاست
- ۲۰۲۶PHP 8.5جاری، و همان چیزی که کد این صفحه رویش اجرا شد
فاصله روی این شکل زمان واقعی است. شکافی که اهمیت دارد پهنترین نیست، سال ۲۰۲۰ است، جایی که جوابی که یک سال قبلش نوشته شده دیگر کامپایل نمیشود.
ابزار، و سالی که این حرف درست است
در سال ۲۰۲۶ نسخه جاری PHP نسخه 8.5 است. زبان از PHP 5 که در ۲۰۰۴ آمد تا PHP 7.0 در دسامبر ۲۰۱۵ و بعد PHP 8.0 در نوامبر ۲۰۲۰ بیشتر عوض شد تا در دهه پیش از آن. نسخهای که باید برایتان مهم باشد همان 8.0 است، چون خطی است که توصیههای اینترنت این طرف و آن طرفش نوشته شدهاند: match و آرگومان نامدار و ارتقای سازنده و str_contains همه آنجا میآیند، و تغییر مقایسه پایین این صفحه هم. نسخه 8.1 از نوامبر ۲۰۲۱ همان enum و ویژگی readonly بالا را آورد. هر چیزی که PHP را با تابع mysql_ یا کلاسی پر از getter نشان بدهد، برای زبانی نوشته شده که دیگر وجود ندارد.
و اینجا همان جایی است که خواننده ایرانی گیر میکند، به شکلی که خواننده انگلیسیزبان گیر نمیکند. بیشتر آموزش فارسی PHP در سالهای ۱۳۹۰ تا ۱۳۹۵ نوشته شده، وقتی هاست اشتراکی ایرانی هنوز PHP 5 میداد، و آن صفحهها هنوز بالای نتایج فارسیاند. کدی هم که یک تازهکار اینجا تحویل میگیرد معمولاً از همان دوره است. پس مهارت اول در این زبان، نوشتن PHP نیست؛ تشخیص دادن این است که جوابی که جلوی چشمتان است برای کدام نسخه نوشته شده. نشانههای سریعش: تابعی که با mysql_ شروع شود، فایلی بدون فضای نام، و کلاسی که بهجای سازنده، ده تا setter دارد.
Composer از سال ۲۰۱۲ و رایگان، جای دانلود کردن یک پوشه کد و کامیت کردنش را گرفت، و بزرگترین تفاوت PHP پیش و پس از خودش است. Xdebug هم دیباگر و پروفایلر است، رایگان، و جای اضافه کردن یک print و بارگذاری دوباره صفحه را گرفت.
اشتباه: بررسیای که فقط سر موقعیت صفر غلط است
کارگاه بررسی میکند که آیا یک کد سفارش مال خودش است یا نه، و سطری که به ذهن میرسد جوری غلط است که فقط برای همان کدهایی که مهماند شکست میخورد. strpos وقتی تطبیق سر ابتدای رشته باشد مقدار int(0) برمیگرداند، و مقایسه int(0) == false درست است، پس کدی که با YZ شروع شود «پیدا نشد» تست میشود. هر کد دیگری در سامانه کار میکند.
راه قدیمی این بود که با سه مساوی مقایسه کنید و تا ابد یادتان بماند چرا. راه امروزی این است که اصلاً آن پرسش را نپرسید: str_contains($kod, 'YZ') جای strpos را گرفت و تله موقعیت صفر را برداشت، و در PHP 8.0 همراه str_starts_with آمد که همان چیزی است که این سطر واقعاً میخواست.
قاعدههای مقایسه زیرش هم در همان نسخه سفت شدند. 0 == "yazd" در PHP 8 نادرست است و در PHP 7 درست بود، که بیسروصدا یک دهه اشکال احراز هویت را درست کرد و قویترین دلیل تکی برای اجرا نکردن نسخه قدیمی است. دو رشته عددی هنوز بهشکل عدد مقایسه میشوند، پس "1" == "01" همچنان درست است، و قاعدهای که دوام میآورد این است که سه مساوی بنویسید مگر دلیلی داشته باشید.
چیزی که این صفحه باز میگذارد این است که درخواست میان رسیدن و جواب دادن واقعاً چه میکند، که زیر وب است، و سهم بسیار بزرگی از PHP که کسی دارد کلمه ویرایش میکند نه کد. جای خود زبان میان بقیه هم زبانهای برنامهنویسی است، و همسایهای که همان درخواست را در مرورگر تحویل میگیرد جاوااسکریپت.