آموزش PHP (فصل ۲)

آشنایی با استانداردهای کدگذاری ASCII و Unicode


امروزه وب‌سایت‌های بی‌شماری را می‌بینیم که برای مخاطبینی با زبان خاصی -مثلاً انگلیسی، فارسی، ژاپنی و غیره- طراحی شده و یا چندزبانه هستند. وقتی بخواهیم الفبا، حروف، علائم، سَمبل‌ها و به طور کلی هر چیزی را در زبان‌های زندهٔ مختلف را به درستی در پلتفرم‌های مختلف در معرض دید کاربران قرار دهیم، می‌بایست با مفهومی تحت عنوان Encoding آشنا شویم.

آشنایی با مفهوم Character Encoding
همان‌طور که می‌دانید، سیستم‌های کامپیوتری فقط و فقط با ۰ و ۱ سروکار دارند و از همین روی، برای درک، ذخیره‌سازی و بازیابی هر چیزی وابسته به اعداد باینری (دودویی یا همان ۰ و ۱) هستند. برای اینکه کامپیوترها بتوانند حروف، علائم، اعداد، سَمبل‌ها و غیره را به درستی تشخیص دهند، نیاز است تا برای تک‌تک آنها یک عدد منحصر به فرد در نظر گیریم و به همین دلیل سیستم‌های کدگذاری (Character Encoding) به وجود آمده‌اند (در واقع، اختصاص اعداد به کاراکترهای مختلف منجر به این خواهد شد که از یک سو کاراکترها در همهٔ سیستم‌ها به طور یکسان نمایش داده شوند و از سوی دیگر به مراتب راحت‌تر بر بستر شبکه نقل و انتقال پیدا کنند و احتمال آسیب دیدن آنها کاهش یابد).

اگر هر زبان زنده‌ای بخواهد برای خود یک سیستم کدگذاری (Character Encoding) اختصاصی داشته باشد و در این بین هیچ‌گونه استاندار واحدی وجود نداشته باشد، به سختی قادر خواهیم بود تا مثلاً یک وب‌سایت ژاپنی را در مرورگر خود ببینیم (به طور مثال، کلمهٔ こんにちは که ملاحظه می‌کنید، در زبان ژاپنی به معنای سلام است و این در حالی است که شما در وب‌سایت سکان آکادمی که به زبان فارسی است به راحتی می‌توانید آن را بخوانید). برای روشن‌تر شدن این مسئله، مثالی می‌زنیم.

فرض کنیم که کامپیوتر نگارندهٔ این آموزش برای حروف hello به ترتیب از اعداد ۱۰۴، ۱۰۱، ۱۰۸، ۱۰۸ و ۱۱۱ استفاده می‌کند اما این در حالی است که این اعداد در کامپیوتر شما به ترتیب برای حروف j ،e ،e ،o و z هستند. در نتیجه کلمهٔ hello در کامپیوتر شما به صورت oeejz نمایش داده می‌شود و انتقال پیام آن‌طور که مد نظر ما است صورت نمی‌گیرد!

علاو بر این، پیش از این گفتیم که سیستم‌های کامپیوتری باینری هستند؛ به عبارت دیگر، فقط با ۰ و ۱ را متوجه می‌شوند؛ لذا هر عددی که برای هر کاراکتر خاصی در نظر گرفته می‌شود، بایستی یک معادل دودویی هم داشته باشد تا سیستم‌ آن را کاملاً درک کند. برای مثال،‌ کلمهٔ hello دارای اعداد 111 108 108 101 104 در سیستم ASCII است اما معادل دودویی همین اعداد می‌شود 0110100001100101011011000110110001101111 و همین ۰ و ۱ های مختلف هستند که سیستم‌ آنها را درک می‌کند.

در همین راستا، یکسری استانداردهای بین‌المللی به وجود آمده‌اند که دو مورد از مهم‌ترین آنها ASCII و Unicode است که در ادامه با تک‌تک آنها، شباهت‌ها و تفاوت‌های‌شان بیشتر آشنا خواهید شد.

ASCII چیست؟
ASCII مخفف American Standard Code for Information Interchange است که به منزلهٔ یک استاندارد کدگذاری کاراکترها بر اساس زبان انگلیسی است به طوری که می‌توان گفت پایه و اساس دیگر استانداردها همچون Unicode است. ASCII دو نوع مختلف دارد:
– نوع ۷ بیتی
– نوع ۸ بیتی

نوع ۷ بیتی که تحت عنوان Standard ASCII شناخته می‌شود، دارای ۲ به توان ۷ (یعنی ۱۲۸) کاراکتر مختلف است که از ۰ شروع شده و تا ۱۲۷ ادامه دارد. نوع ۸ بیتی که تحت عنوان Extended ASCII شناخته می‌شود، دارای ۲ به توان ۸ (یعنی ۲۵۶) کاراکتر مختلف است که از ۰ تا ۲۵۵ را شامل می‌شود (لازم به ذکر است که از ۰ تا ۱۲۷ اَسکی ۸ بیتی دقیقاً شبیه به همان نوع ۷ بیتی است و از ۱۲۸ تا ۲۵۵ به آن اضافه شده است).

در این سیستم، هر کاراکتر در یک بایت ذخیره می‌شود؛ مثلاً اگر یک فایل تکست ساده داشته باشیم و داخل آن حروف hello را بنویسیم و فایل را با اِنکودینگ ASCII ذخیره سازیم، حجم این فایل ۵ بایت خواهد بود.

لازم به ذکر است که اَسکی ۷ بیتی، صرفاً فضای ذخیری‌سازی ۱۲۸ کاراکتر را دارا است و این فضای ۱۲۸ تایی، برای ذخیره‌سازی همهٔ حروف کوچک و بزرگ انگلیسی،‌ اعداد،‌ علائم نقطه‌گذاری، فاصله و برخی کاراکتر‌های پراستفاده کافی است.

Unicode چیست؟
Universal Code یا به اختصار Unicode، استانداری برای پایهٔ ASCII است که برای نمایش متون اکثر زبان‌های زندهٔ دنیا کاربرد دارد به طوری که آخرین نسخه از یونیکد حاوی بیش از ۱۱۰/۰۰۰ کاراکتر مختلف است. در یک کلام، یونیکد برای هر کاراکتری یک عدد منحصر به فرد در نظر می‌گیرد -که اصطلاحاً به آن Point Code گفته می‌شود- و این استاندارد هیچ ربطی به نوع پلتفرم (سیستم‌عامل)، اپلیکیشن و زبان ندارد و همین باعث گردیده تا به یک استاندارد بین‌المللی محبوبتبدیل شود.

قبل از عرضهٔ یونیکد، سیستم‌های متفاوتی -همچون ASCII- برای کدگذاری کاراکترهای مختلف وجود داشتند اما مشکلی که وجود داشت، محدودیت آنها بود به طوری که بسیاری از زبان‌های زندهٔ دنیا و بسیاری از علائم خاص را پوشش نمی‌دادند (در واقع، استانداردهای قدیمی فضای کافی برای ذخیرهٔ علائم مختلف نداشتند).

همچنین استاندارهای اِنکودینگ قدیمی گاهی‌اوقات با یکدیگر تناقض پیدا می‌کردند و همان‌طور که در مثال فرضی فوق مشاهده کردید، مثلاً دو استاندارد مختلف، عددی واحد را برای دو کاراکتر مختلف در نظر گرفته بودند. در چنین شرایطی، سیستم‌های کامپیوتری مختلف -به خصوص سرورها- می‌بایست اِنکودینگ‌های بسیاری را ساپورت می‌کردند و همین مسئله کار را دشوار می‌ساخت.

استاندارد یونیکد توسط بنیادی غیرانتفاعی تحت عنوان The Unicode Consortium رهبری می‌شود که این وظیفه را دارا است تا به توسعه و بهبود این استاندارد برای زبان‌های زندهٔ دنیا بپردازد. امروزه این استاندارد در اکثر فناوری‌های نوین،‌ سیستم‌عامل‌ها و زبان‌های برنامه‌نویسی مختلف گنجانده شده است تا این اطمینان حاصل گردد که کاربران در پلتفرم‌های مختلف در مواجه با کاراکترهای مختلف از تجربهٔ یکسانی برخوردار خواهند بود.

در حقیقت، با آمدن Unicode Standard اوضاع به شکل قابل‌توجهی بهبود یافت و این در حالی است که امروزه تکنولوژی‌های مختلف آن را ساپورت می‌کنند و همین مقبول واقع شدن یونیکد منجر به این شده تا فارغ از نوع سیستم‌عامل، زبان، موتور جستجو، مرورگر، دیوایس و به طور کلی هر نوع پلتفرمی، کاربران مختلفی که از دیوایس‌های مختلفی استفاده می‌کنند بتوانند علائم، الفبا، حروف و سَمبل‌های زبان‌های مختلف را بدون هیچ‌گونه مشکلی مشاهده کنند (لازم به ذکر است که ۱۲۸ کاراکتر ابتدایی Unicode همان کاراکترهای ASCII هستند).

UTF-8 چیست؟
یونیکد به شکل‌های مختلفی پیاده‌سازی می‌شود که یکی از معروف‌ترین آنها، UTF-8 است. UTF-8مخفف UnicodeTransformation Format 8 bit است. به عبارت دیگر، این استاندارد که برای نمایش ایمیل و وب‌پیج‌ها بسیار کاربرد دارد، از بلوک‌های ۸ بیتی برای ذخیرهٔ کاراکترهای مختلف استفاده می‌کند (لازم به ذکر است که در وب فارسی چنانچه بخواهیم سایت بدون هیچ مشکلی در معرض دید کاربران قرار گیرد، بایستی از این استاندارد استفاده نماییم). 

فعال‌سازی UTF-8 در نرم‌افزار
برای فعال‌سازی UTF-8، ابتدا بایستی اطمینان حاصل کرد که ادیتور یا IDE شما که برای ایجاد فایل‌های HTML و PHP مورد استفاده قرار می‌دهید، قابلیت ذخیره‌سازی داکیومنت‌ها (فایل‌ها) با انکودینگ مد نظر شما را دارا است (IDE مخفف واژگان Integrated Development Environment به معنی «محیط توسعهٔ نرم‌افزار» است که از آن جمله می‌توان به اکلیپس و ویژوال استودیو اشاره کرد). نکتهباتوجه به اینکه دانشجویان این دوره ممکن است از طیف گسترده‌ای از ویرایشگرهای کد برای کدنویسی استفاده کنند و امکان پوشش دادن نحوهٔ تنظیم اِنکودینگ تک‌تک آنها وجود ندارد، از ارائهٔ آموزش بیشتر در این حوزه خودداری کرده و خواهشمندیم که بسته به نوع نرم‌افزار انتخابی خود، با سرچ در گوگل نحوهٔ تنظیم اِنکودینگ آن را مطالعه نموده و حتماً اِنکودینگ را برابر باUTF-8 قرار دهید. در تمامی نرم‌افزارهای توسعهٔ کدنویسی، در بخش تنظیمات می‌توان اِنکودینگ را تنظیم کرد.

چگونه UTF-8 را برای مرورگر تنظیم کنیم؟ 
برای آنکه به مرورگر کاربران این دستور را دهیم که از اِنکودینگ UTF-8 تبعیت کند، می‌بایست تگ زیر را در بخش هِد صفحات مورد استفاده قرار داد:

<meta charset="utf-8">

این تگ حاکی از آن است که اِنکودینگ UTF-8 باید برای نمایش صفحه مورد استفاده قرار گیرد و این در حالی است که اگر از این تگ استفاده نکنیم، از اِنکودینگ پیش‌فرض مرورگر استفاده خواهد شد. لذا برای اطمینان حاصل کردن از اینکه صفحهٔ وب‌سایت ما به درستی در معرض دید کاربران قرار می‌گیرد، حتماً بایستی این تگ را در بخش هِد سایت خود قرار دهیم. 

در واقع، UTF-8 راه‌کاری است که از آن طریق می‌توان هر نوع سَمبلی را در تمامی زبان‌های زندهٔ دنیا -من جمله زبان فارسی- نمایش داد. مثلاً علامت تشدید در زبان فارسی یکی از کاراکترهایی است که در این نسخه از یونیکد پشتیبانی می‌گردد و همین می‌شود که شما هر جایی که از آن استفاده شده باشد، می‌توانید به سادگی آن را ملاحظه کنید.

به طور کلی، چنانچه شما بخواهید وب اپلیکیشنی طراحی کنید که از زبان‌های زندهٔ مختلفی پشتیبانی کند، تنها راه‌کار استفاده از UTF-8 است.

چگونه در PHP کامنت‌نویسی کنیم؟


Comment در لغت به معنای «نظر» است اما در زبان‌های برنامه‌نویسی همچون PHP، منظور از کامنت‌گذاری نوشتن چیزهایی است که از دید کامپایلر مفسر پنهان می‌مانند اما در سورس‌کد موجود هستند و دولوپر می‌تواند آنها را بخواند. به طور کلی، از جمله مزایای کامنت‌نویسی می‌توان به موارد زیر اشاره کرد:
– توضیح بخش‌هایی از کد که درک آنها نیاز به اطلاعات بیشتری دارد
– غیرفعال کردن بخشی از کد در فرایند دیباگینگ
– ارائهٔ نکاتی برای خود دولوپر که پس از مراجعه به سورس‌کد در آینده، متوجهٔ نحوهٔ کدنویسی خود گردد!
– ارائهٔ توضیحاتی در مورد دولوپر، فریمورک‌های استفاده شده، سالی که اپلیکیشن توسعه یافته و غیرهبه خاطر داشته باشیدهمان‌طور که پیش از این دیدید، وقتی صحبت از زبان PHP به میان می‌آید به جای اصطلاح کامپایلر، از Interpreter (مُفَسر) استفاده می‌کنیم و دلیل این مسئله آن است که سورس‌کد PHP برخلاف زبان‌هایی همچون Java که یک زبان سطح بالا است و اصطلاحاً کامپایل می‌شود (یا تبدیل به زبان سطح پایین و قابل‌فهم برای ماشین که اصطلاحاً Machine Code نام دارد می‌گردد)، در حین اجرا کدها خط به خط بررسی شده و به زبان قابل‌فهم برای ماشین ترجمه/تفسیر می‌شوند. 

انواع کامنت‌ها در زبان برنامه‌نویسی PHP
در زبان PHP سه نوع مختلف نحوهٔ کامنت‌نویسی داریم که بسته به نیاز دولوپر مورد استفاده قرار می‌گیرند. اما پیش از پرداختن به انواع کامنت‌‌ها در زبان PHP، قصد داریم ببینیم که در زبان HTML به چه شکل کامنت می‌گذاریم:

<!-- Comment goes here. -->

هما‌ن‌طور که ملاحظه می‌شود، در زبان HTML هر کجا بخواهیم توضیحاتی بنویسیم که از دید موتور رِندینگ مرورگر پنهان بماند، می‌بایست آن را به صورت بالا نوشت. جالب است بدانید چنانچه به سورس صفحات وب نگاه کنیم، کامنت‌های HTML قابل مشاهده هستند اما در خروجی صفحه، هرگز دیده نمی‌شوند.

به طور کلی، کامنت‌ها در زبان PHP هرگز برای مرورگر ارسال نمی‌شوند (حتی اگر به سورس صفحات مراجعه کنیم). سه نوع کامنت‌گذاری مختلف داریم که نوع اول با # شروع می‌شود که اصطلاحاً Hash Tag یا Pound Sign نامیده می‌شود:

# This is a comment.

به سبک کامنت‌گذاری بالا، اصطلاحاً Sell Style گفته می‌شود چرا که برگرفته از سبک کامنت‌نویسی در شِل لینوکس است. نوع دوم بااستفاده از دو علامت Slash و به صورت // صورت می‌گیرد که اصطلاحاً به آن C Style گفته می‌شود: 

// This is also a comment.

نوع سوم هم که اصطلاحاً Multiline نامیده می‌شود، برای شروع از علائم */و برای پایان هم /* استفاده می‌شود:

/*
This is a longer
comment that spans
three lines.
*/

به منظور روشن‌تر شدن نحوهٔ استفادهٔ عملی از کامنت‌گذاری در PHP،‌ اسکریپت زیر را در نظر بگیرید:

<?php
/*
This is A PHP Course
Authored by Behzad Moradi
Published by SokanAcademy.com
*/

// This is the 1st echo
echo "This tutorial is about commenting in PHP <br>"; /* This shows how to use C Style commenting at the end of a line */
echo "We have 3 different commenting styles in PHP"; # This is the 2nd echo
# This is the end of the script

همان‌طور که مشاهده می‌شود، در ابتدای اسکریپت از خط ۲ام تا ۶ام از سَبک کامنت‌نویسی چندخطی (Multiline) استفاده کرده‌ایم. سپس در خط ۸ام با استفاده از علائم // یک خط از کد را کامنت‌ کرده‌ایم و می‌بینیم که به چه شکل در انتهای خط ۹ام هم با استفاده از علائم */و /* که مخصوص کامنت‌نویسی چندخطی است، در یک خط استفاده کرده‌ایم. در خط ۱۰ام هم از علامت هَشتگ برای کامنت‌ کردن انتهای خط استفاده کرده‌ایم و در نهایت هم در خط ۱۱ام مجدد از هَشتگ اما این بار برای کامنت کردن یک خط مجزا استفاده کرده‌ایم (در واقع، از جایی که این علائم قرار می‌گیرند تا انتهای همان خط، از دید مفسر پنهان خواهد ماند).به خاطر داشته باشیدهمان‌طور که در اسکریپت فوق مشخص است، تگ پایانی <? را قرار نداده‌ایم. در واقع، اگر در فایلی صرفاً کدهای PHP داشته باشیم، توصیه می‌شود که تگ پایانی قرار داده نشود چرا که اگر تگ پایانی <? را نوشته سپس بعد از آن یک اینتر خورده و منجر به ایجاد خط جدیدی شود، این خط جدید به عنوان Output (خروجی) توسط مفسر PHP ارسال شده و با هِدرهای پروتکل HTTP تداخل پیدا کرده و منجر به ایجاد ارور Cannot modify header information – headers already sent می‌گردد. لذا شدیداً توصیه می‌شود در فایل‌هایی که صرفاً کدهای PHP وجود دارند، هرگز تگ پایانی <? را در انتهای فایل ننویسید. هشدارهرگز از ترکیب روش‌های کامنت‌نویسی داخل یکدیگر استفاده نکنید چرا که این کار از یک سو باعث کاهش خوانایی کامنت‌ها می‌شود و از سوی دیگر ممکن است منجر به ایجاد اختلال در اسکریپت گردد.

نکاتی مهم در مورد کامنت‌نویسی
به طور کلی، اگر به سورس‌کد پروژه‌های حرفه‌ای در گیت‌هاب، فریمورک‌ها و لایبرری‌های معروف و اساساً به نحوهٔ کدنویسی دولوپرهای حرفه‌ای نگاه کنیم، خواهیم دید که ایشان به بهترین شکل ممکن اقدام به کامنت‌نویسی می‌کنند. در اینجا منظور از بهترین، این است که یکسری Best Practice در حین کامنت‌نویسی می‌بایست همواره مد نظر قرار گیرد که برخی از مهم‌ترین آنها عبارتند از:

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

// This variable stores user name
$username = null;

مسلماً اگر نحوهٔ نامگذاری متغیرها -که در آموزش‌های آتی به تفصیل در مورد آنها صحبت خواهیم کرد- درست صورت گیرد، نام متغیر گویای ماهیت‌اش خواهد بود و اصلاً نیازی به نوشتن کامنت نخواهیم داشت.

– به‌روزرسانی کامنت‌ها: بسیاری از دولوپرها را می‌بینیم که به درستی کامنت‌نویسی می‌کنند اما وقتی که سورس‌کد را ریفکتور می‌کنند (تغییر می‌دهند)، فراموش می‌کنند تا کامنت‌ها را نیز آپدیت کنند و همین مسئله منجر به این خواهد گشت تا در آینده، هم خود دولوپر و هم دیگر همکارانش دچار سردرگمی شوند. به عنوان مثال داریم:

// This variable stores user name
$username = $firstname . $lastname;

همان‌طور که ملاحظه می‌گردد، کامنت این پیام را به ما می‌رساند که متغیر username$ حاوی نام کاربر است اما این در حالی است که می‌بینیم این متغیر حاوی دو متغیر دیگر است تحت عناوین firstname$ و lastname$ که به ترتیب به معنی «نام» و «نام‌خانوادگی» می‌باشند. چنین تناقضاتی منجر به سردرگمی دولوپرها در آینده خواهد شد و تا حد ممکن می‌بایست از آنها اجتناب کرد.

– کد بایستی گویا باشد: وقتی ما کدنویسی می‌کنیم، می‌بایست تمام تلاش خود را به کار بندیم تا کد ما اصطلاحاً Self-explanatory باشد؛ به عبارت دیگر، سورس‌کد،‌ فاصله‌گذاری، نام‌گذاری متغیرها/کلاس‌ها/متدها و غیره می‌بایست آن‌قدرگویا باشند که ما به عنوان یک دولوپر نیاز به حداقل کامنت‌نویسی داشته باشم. به عنوان مثال داریم:

public function showUserInfo ($firstname = null, $lastname = null) {
    return $firstname . $lastname;
}

همان‌طور که ملاحظه می‌شود، در اسکریپت فوق فانکشن یا تابعی داریم تحت عنوان ()showUserInfo که این وظیفه را دارا است تا دو پارامتر ورودی گرفته، سپس آنها را اصطلاحاً Concatenate کند (به‌ هم بچسباند) سپس نتیجه را بازگرداند (در آموزش‌های آتی به تفصیل در مورد فانکشن‌ها توضیح خواهیم داد).

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

ادغام کدهای HTML با PHP


پیش از این گفتیم که یکی از مزیت‌های زبان برنامه‌نویسی PHP این است که می‌توان به سادگی آن را با کدهای HTML ادغام کرد. در واقع، نرم‌افزار وب‌ سرور هر چیزی که مابین تگ‌های php?> و <? باشد را به عنوان اسکریپت‌های PHP تلقی کرده و مفسر این زبان شروع به تفسیر و پردازش آنها می‌کند و هر کدی که خارج از این تگ‌ها قرار گرفته باشد، به عنوان کدهای HTML برای مرورگر ارسال می‌گردد.

آشنایی با پسوندهای php ،.html. و phtml.
به طور کلی، برای طراحی صفحات معمولی وب‌سایت از پسوند html. برای فایل‌ها استفاده می‌شود اما اگر بخواهیم به وب سرور بفهمانیم که با صفحاتی دینامیک سروکار دارد، علاوه بر استفادهٔ درست از تگ‌های php?> و <? می‌بایست از پسوند php. نیز استفاده کرد. هشداراگر فایل مد نظر به پسوند php. ختم نشود، هرگز در لوکال‌هاست پردازش نخواهد شد و مسلماً اسکریپت‌های پی‌اچ‌پی هم تفسیر نخواهند شد.

در ارتباط با تفاوت پسوندهای php. و phtml. بایستی گفت که پسوند phtml. از ترکیب پسوندهای html. و php. ساخته شده و اساساً فرق چندانی با یکدیگر نمی‌کنند جز اینکه صفحاتی که با پسوند php. ذخیره شوند صرفاً حاوی کدهای زبان برنامه‌نویسی پی‌اچ‌پی هستند اما صفحاتی که دارای پسوند phtml. می‌باشند، صفحاتی هستند که عموماً دارای کدهای اچ‌تی‌ام‌ال می‌باشند و در خلال آنها هم یکسری کدهای پی‌اچ‌پی وجود دارد (لازم به ذکر است که در این دوره، تا حد ممکن از پسوند php. استفاده خواهد شد). هشداراز آنجا که فایل‌های php. این سیگنال را به وب سرور می‌دهند که محتوایشان دینامیک است، لذا این فایل‌ها حتماً می‌بایست از طریق لوکال‌هاست باز شوند و به طور مثال چنانچه مسیر فایل چیزی همچون \:C در سیستم‌عامل ویندوز باشد، فایل‌ هرگز اجرا نخواهد شد.

آشنایی با انواع تگ‌های آغازین و پایانی PHP
پیش از این توضیح دادیم که برای درج کدهای PHP نیاز داریم تا اولاً فایل با پسوند php. ذخیره شده باشد، ثانیاً تگ‌های آغازین و پایانی PHP در جایی که می‌خواهیم اسکریپت‌ بنویسیم درج شده باشند. به طور کلی، چندین نوع تگ PHP داریم که عبارتند از:

نوعتگ پایانیتگ آغازینوضعیت
استاندارد<?php?>
تگ استاندارد با دستور echo<?=?>
تگ کوتاه شده<??>
به سَبک ASP.NET<%%>

مواردی که تیک خورده‌اند را مجاز به استفاده هستیم و آنهایی که ضربدر دارند، اصطلاحاً Deprecated هستند؛ به عبارت دیگر، منقضی شده و مجاز به استفاده از آنها نمی‌باشیم.

حال با این توضیحات، فایلی می‌سازیم تحت عنوان index.php و کدهای زیر را داخل آن می‌نویسیم:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">

    <title>SokanAcademy PHP Course</title>
</head>

<body>
    <?php echo "In The Name of The Most High"; ?>
</body>

</html>

پیش از تفسیر کدهای فوق، همان‌طور که در آموزش‌های گذشته توضیح داده شد، این فایل را از طریق لوکال هاست در مرورگر باز می‌کنیم. آنچه مسلم است اینکه خروجی این فایل در مرورگر دقیقاً شبیه به یک فایل HTML ساده است اما واقعیت امر آن است که بخشی از این فایل -هر آنچه که مابین تگ‌های php?> و <? قرار گرفته است- توسط مفسر زبان PHP پردازش شده، در اختیار وب سرور آپاچی قرار گرفته و آپاچی هم خروجی را در قالب فرمت HTML در اختیار مرورگر می‌دهد و همین می‌شود که ما فکر می‌کنیم با یک فایل HTML سروکار داریم.به خاطر داشته باشیددر نظر گرفتن این نکته ضروری است که ما تحت هیچ عنوان هیچ‌گونه اسکریپت PHP را قبل از پردازش شدن توسط مفسر این زبان نخواهیم توانست برای مرورگر ارسال کنیم.

در تفسیر کدهای فوق، بایستی بگوییم که در خط اول اصطلاحاً Document Type آمده است؛ این تایپ حاکی از آن است که مرورگر با یک فایلی که توسط نسخهٔ ۵ زبان HTML طراحی شده است روبه‌رو می‌باشد و از این پس کلیهٔ قابلیت‌های نسخهٔ ۵ زبان HTML ساپورت خواهند شد.

سپس همان‌طور که پیش از این توضیح داده شد، برای آنکه بخواهیم کلیهٔ کاراکترهای زبان فارسی به درستی در صفحه نمایش داده شوند، می‌بایست از اِنکودینگ UTF-8 استفاده کنیم و برای این منظور، از تگ خاصی در بخش هِد سایت استفاده کرده‌ایم (لازم به ذکر است که این تگ در بخش هِد می‌بایست در بالاترین جایگاه قرار گیرد تا عنوان در نظر گرفته شده داخل تگ‌های <title></title> هم به درستی نمایش داده شود).

حال همان‌طور که می‌بینیم، در بین تگ‌ آغازین <body> و تگ پایانی <body/>، تگ‌های php?> و <? را نوشته و داخل آنها از دستور echo که در زبان PHP مسئول پرینت کردن یک عبارت است استفاده کرده‌ایم. در واقع، کاری که echo انجام می‌دهد این است که عبارت In The Name of The Most High را چاپ می‌کند.

پیش از این گفتیم که تگ =?> همان تگ استاندارد PHP است با این تفاوت که دستور echo نیز داخل آن گنجانده شده است. برای درک بهتر این موضوع، کد فوق را به صورت زیر ریفکتور می‌کنیم:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">

    <title>SokanAcademy PHP Course</title>
</head>

<body>
    <?= "In The Name of The Most High"; ?>
</body>

</html>

می‌بینیم که با تغییر تگ آغازین، دیگر نیازی به تایپ کردن دستور echo نیست و به نوعی می‌توان گفت که کد تمیزترمی‌گردد (معمولاً از این تگ در تِمپلیت‌ها که برخی از آنها داری پسوند phtml. هستند استفاده می‌شود به طوری که نیاز است تا در میان کدهای HTML،‌ بارها و بارها کدهای مختلف PHP جایگذاری شوند). نکتهلازم به ذکر است که در فایل php.ini می‌توان امکان استفاده از تگ‌های کوتاهٔ شدهٔ ?> و <? را فراهم ساخت بدین صورت که مقدار کامند short_open_tag را برابر با On قرار داد اما این کار اصلاً توصیه نمی‌شود.

آشنایی با دستورات echo و print
برخی دستور echo -و همچنین print که کاری مشابه echo انجام می‌دهد- را فانکشن (تابع) می‌نامند اما این در حالی است که این یک غلط مصطلح است و چنین دستورات اصطلاحاً Language Construct نامیده می‌شوند (در انتهای این آموزش بیشتر در این باره بحث خواهد شد).

به طور کلی، برای echo و print هم می‌توان از Single Quotation Mark و هم Double Quotation Mark استفاده نمود. به عبارت دیگر، هرآنچه که بخواهیم چاپ شود را هم می‌توانیم مابین علائم ‘ ‘ و هم مابین علائم ” ” قرار دهیم. به طور کلی، می‌توان کارکرد این علائم را مشابه یکدیگر در نظر گرفت اما در شرایط خاصی هم شاهد نتایج کاملاً غیرمنتظره‌ای خواهیم بود که در ادامه بیشتر پیرامون این موضوع بحث خواهیم کرد.

همان‌طور که در اسکریپت فوق مشخص است، اولین علامت ” به منظور نقطهٔ آغازین و دومین علامت ” به منزلهٔ نقطهٔپایانی جایی است که از مفسر پی‌اچ‌پی می‌خواهیم برایمان چاپ کند. در پایان هم یک علامت به اصطلاح Semicolon (نقطه‌ ویرگول) یا همان علامت ; را قرار داده‌ایم که در زبان پی‌اچ‌پی به منزلهٔ پایان هر Statement (دستور) است.به خاطر داشته باشیدنکته‌ای که در اینجا حائز اهمیت است این می‌باشد که در زبان PHP اگر صرفاً بخواهیم یک کامند (دستور) داشته باشیم و پس از آن هیچ کامند دیگری نیاید، می‌توان Semicolon را نگذاشت اما به عنوان یک Best Practice، شدیداً توصیه می‌شود که علامت ; در پایان تمامی خطوط کد گذاشته شود.

گاهی‌اوقات پیش می‌آید که می‌خواهیم مثلاً نقل‌قولی از فردی مشهور را چاپ کنیم و می‌دانیم که معمولاً نقل‌قول‌ها مابین علائم ” ” آورده می‌شوند تا مخاطب متوجه شود که جملهٔ مد نظر منصوب به شخص دیگری است و یا به عنوان مثالی دیگر، گاهی از علامت ‘ برای خلاصه‌نویسی زبان انگلیسی استفاده می‌شود (مثلاً به جای اینکه بنویسیم I am، می‌نویسیم I’m). حال برای روشن‌تر شدن این مثال‌ها، کد زیر را در نظر می‌گیریم:

echo "I asked "What is your name?"";

و یا به عنوان مثالی دیگر، می‌توان کد زیر را در نظر گرفت:

echo 'I'm Behzad Moradi';

چنانچه اسکریپت‌های فوق را اجرا کنیم، در مرورگر با پیامی همچون خطای زیر مواجه خواهیم شد:

This page isn’t working
localhost is currently unable to handle this request.
HTTP ERROR 500

پیش از این با مفهوم Status Code در پروتکل HTTP آشنا شدیم و دیدیم که کد وضعیت 500 حاکی از وجود خطایی در سمت سرور است. این پیامی است که مرورگر در اختیار ما قرار می‌دهد و این در حالی است که گاهی‌اوقات نیاز داریم تا جزئیات بیشتری از باگ به وجود آمده در معرض دیدمان قرار گیرد تا سریع‌تر بتوانیم برنامه‌ٔ خود را دیباگ کنیم. برای این منظور، می‌توانیم به فایل error.log وب سرور آپاچی که قبلاً با آن آشنا شدیم مراجعه کنیم:

$ gedit /var/log/apache2/error.log

ترمینال را باز کرده و دستور فوق را وارد می‌کنیم (البته به جای نرم‌افزار ویرایشگر متن gedit می‌توان از سایر نرم‌افزارها همچون nano ،vim و غیر هم استفاده کرد). ارورها در این فایل، به ترتیب تاریخی که رخ داده‌اند نمایش داده می‌شوند؛ لذا می‌بایست به انتهای این فایل مراجعه کنیم و خواهیم دید که اروری به صورت زیر درج شده است:

PHP Parse error:  syntax error, unexpected 'm' (T_STRING), expecting ',' or ';' in /var/www/sokanacademy-php-course/index.php on line 2

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

echo 'I'm Behzad Moradi';

در واقع، مفسر پی‌اچ‌پی به اولین علامت ‘ می‌رسد و متوجه می‌شود که باید هر‌ آنچه که پس از این علامت قرار گرفته را چاپ کند و پس از آنکه به علامت ‘ در I’m می‌رسد، فکر می‌کند که به نقطهٔ پایانی رسیده است! و همان‌طور که در ارور فوق می‌بینیم، به ما پیشنهاد می‌شود که یک علامت ; به جای حرف m قرار دهیم تا ارور مرتفع گردد.

در چنین مواقعی، دو راه‌کار مختلف پیش‌ روی ما قرار داد. راه‌کار اول بدین شکل است که اگر در عبارت (استرینگ) مد نظر که قصد چاپ کردن آن را داریم علامت ” وجود داشت (همچون مثال اول)، از علامت‌های ‘ ‘ به عنوان نقاط آغازین و پایانی استفاده کنیم و اگر در استرینگ مد نظر علامت ‘ وجود داشت (همچون مثال دوم) از علائم ” ” به عنوان نقاط آغازین و پایانی استفاده کنیم. به عبارت دیگر، خواهیم داشت:

echo 'I asked "What is your name?"';
echo "I'm Behzad Moradi";

به عنوان خروجی دستورات فوق هم داریم:

I asked "What is your name?"

و

I'm Behzad Moradi

آشنایی با مفهوم Escaping در برنامه‌نویسی
به عنوان راه‌کار دوم، می‌بایست با چیزی تحت عنوان Escaping آشنا شویم. در واقع، اگر ما بخواهیم به مفسر پی‌اچ‌پی دستور دهیم که یک کاراکتر خاص را تفسیر نکند بلکه همان‌طوری که نوشته شده آن را چاپ کند، می‌بایست از یک علامت Backslash یا \ قبل از کاراکتر مد نظر استفاده کنیم که به این پروسه، Escaping گفته می‌شود. به عنوان مثال، خواهیم داشت:

echo "I asked \"What is your name?\"";
echo 'I\'m Behzad Moradi';

اگر این اسکریپت را اجرا کنیم، می‌بینیم که بدون هیچ مشکلی عبارات مد نظر با علائم ” و ‘ که داخل‌شان درج شده‌اند چاپ خواهند شد.

تغییر فایل php.ini به منظور نمایش ارورها
پیش از این دیدیم که اگر بخواهیم ببنیم چه باگی در سورس‌کد خود وجود دارد، بایستی به فایل error.log وب سرور آپاچی مراجعه کنیم که دائماً مراجعه کردن به این فایل در حین کدنویسی دشوار است و می‌بایست به دنبال راه‌کاری باشیم تا ارورها، هشدارها و غیره به سادگی داخل مرورگر در معرض دیدمان قرار گیرند. برای این منظور، بایستی تغییراتی در فایل php.ini که قبلاً با آن آشنا شدیم اعمال نماییم. برای این منظور، کامند زیر را در ترمینال وارد می‌کنیم:

sudo gedit /etc/php/7.0/apache2/php.ini

دستور sudo را پیش از همه وارد می‌کنیم چرا که برای اعمال تغییرات، نیاز به پرمیشن روت (ادمین) داریم. پس از باز کردن این فایل، به دنبال خطی می‌گردیم که عبارت display_errors = Off در آن نوشته شده است. به سادگی، مقدار Off را به On تغییر داده، وب سرور را ری‌استارت می‌کنیم و از آن پس خواهیم دید که داخل مرورگر، اگر اروری وجود داشته باشد در معرض دیدمان قرار خواهد گرفت. به عنوان مثال، ارور فوق که در فایل لاگ آپاچی دیدیم به صورت زیر در مرورگر در معرض دیدمان قرار خواهد گرفت:

Parse error: syntax error, unexpected 'm' (T_STRING), expecting ',' or ';' in /var/www/sokanacademy-php-course/index.php on line 2

چاپ کردن تگ‌های HTML با استفاده از زبان PHP
پیش از این گفتیم که زبان PHP این امکان را در اختیار ما قرار دهد تا بتوانیم کدهای HTML را به سادگی ایجاد کنیم. به عنوان مثال، می‌توان تگ‌های HTML را به صورت زیر با استفاده از PHP مورد استفاده قرار داد:

echo "This is <strong>bold</strong>";

در واقع، به عنوان خروجی دستور فوق، This is bold را خواهیم داشت. و یا به عنوان مثالی دیگر، می‌توانیم از تگ <br> برای نوشتن عبارات در چند خط مجزا استفاده کرد.

نکته‌ٔ دیگری که در ارتباط با دستورات echo و print می‌بایست مد نظر قرار داد این است که عبارت قرار گرفته مقابل آنها را می‌توانید در چند خط نوشت. برای مثال داریم:

echo "This sentence is
printed over two lines.";

اگر اسکریپت فوق را اجرا کنیم، خواهیم دید که .This sentence is printed over two lines بدون آنکه در خطوط مجزایی چاپ گردد، در معرض دید کاربر قرار خواهد گرفت اما اگر به Source صفحه نگاه کنیم (در مرورگر گوگل کروم روی صفحه کلیک راست کرده و روی گزینهٔ View page source کلیک کنیم)، با خروجی زیر مواجه خواهیم شد:

This sentence is
printed over two lines.

در واقع، می‌بینیم که در سورس HTML، اینتری که کرده‌ بودیم وجود دارد اما در خروجی وب‌پیج (صفحه)، این اینتر نشان داده نمی‌شود. اگر بخواهیم خروجی در خطوط مجزایی چاپ شود، می‌بایست از تگ‌ <br> و یا تگ‌های <p></p> استفاده کرد:

echo 'This sentence is<br>printed over two lines.';

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

This sentence is<br>printed over two lines.

آشنایی با مفهوم Language Construct
پیش از این گفتیم که دستوراتی همچون echo و print اصطلاحاً Language Construct نامیده می‌شوند اما امروزه به عنوان یک غلط مصطلح درآمده که دولوپرهای این زبان چنین ساختارهایی را Function (فانکشن یا تابع) می‌نامند.

در ارتباط با تفاوت مابین Language Construct و Function بایستی بگوییم که دستوراتی همچون echo در دل خود زبان PHP گنجانده شده‌اند و به سادگی توسط مفسر این زبان فهمیده می‌شوند اما این در حالی است که یک Function خود از چندین Language Construct تشکیل شده و زمانی که از یکی از فانکشن‌های از پیش نوشته شده در زبان PHP استفاده می‌کنیم، فانکشن مد نظر ابتدا به بخش‌های کوچک‌تری -یا چندین Construct دیگر- شکسته شده، سپس هر کدام از آنها توسط مفسر فهمیده می‌شوند. به طور کلی از جمله کانستراکت‌های پرکاربرد زبان PHP می‌توان به موارد زیر اشاره کرد:

کاربردکانستراکت
چاپ کردن چیزیecho
چاپ کردن چیزیprint
ارسال یک پیام و پایان داده به اپلیکیشنexit
عملکردی مشابه exit دارا است.die
پایان دادن به یک فانکشن و بازگرداندن نتیجهٔ مد نظر به جایی از اپلیکیشن که آن فاکشن را فراخوانی کرده بود.return
ایمپورت (وارد) کردن یک فایل به داخل فایلی دیگرinclude
عملکردی مشابه include دارد با این تفاوت که مفسر اطمینان حاصل می‌کند که فایل مد نظر قبلاً include نشده باشد.include_once
این دستور مشابه دستور include است با این تفاوت که اگر پس از استفاده از include اروری صورت گیرد، این دستور یک Warning (هشدار) نشان داده سپس به سراغ اجرای الباقی اسکریپت خواهد رفت اما دستور require یک ارور از جنس Fatal نشان داده و اسکریپت متوقف می‌شود.require
این دستور مشابه دستور include_once است با این تفاوت که هَندل کردن ارورها در آن مشابه دستور require است.require_once
یک مقدار true یا false را بسته به اینکه پارامتر ورودی‌اش خالی باشد یا خیر باز می‌گرداند.empty
اگر متغیر اصطلاحاً set شده باشد مقدار true و در غیر این صورت مقدار false را باز می‌گرداند.isset
یک متغیر را از داخل مِموری پاک می‌کند.unset

آشنایی با تفاوت‌ دستورات echo و print
پیش از این گفتیم که این دو دستور PHP را می‌توان به جای یکدیگر مورد استفاده قرار داد اما در عین حال، این دو دستور دارای تفاوت‌هایی جزئی با یکدیگر هستند.

به عنوان یکی از تغییرات اساسی این دو، بایستی گفت که دستور echo هیچ چیزی را اصطلاحاً return نمی‌کند اما این در حالی است دستور print همواره مقداری را return خواهد کرد (این دست اطلاعات برای کاربران مبتدی اصلاً نیاز نیست بلکه صرفاً به خاطر جامعیت بخشیدن به این دورهٔ آموزشی آورده می‌شوند. همچنین در آموزش‌های آتی به تفصیل در مورد دستور return و کاربردهایش توضیح خواهیم داد.)

دستور echo را هم با استفاده از پرانتر و هم بدون آن می‌توان مورد استفاده قرار داد چرا که این دستور Function نیست که داشتن پرانتز برایش اجباری باشد بلکه به اصطلاح یک Language Construct است که هم با پرانتز و هم بدون پرانتز می‌توان آنها را مورد استفاده قرار داد:

$firstName = 'Behzad';
$lastName = 'Moradi';
echo $firstName;
echo "<br>";
echo($lastName);

همچنین اگر چند متغیر داشته باشیم که بخواهیم آنها را به ترتیب چاپ کنیم، می‌توانیم با استفاده از کاما آنها را از یکدیگر مجزا سازیم:

$firstName = 'Behzad';
$lastName = 'Moradi';
echo $firstName, $lastName;

البته اگر از پرانتز برای echo استفاده کنیم، هرگز نمی‌توانیم بیش از یک پارامتر را داخل آن قرار داده و با کاما آنها را از یکدیگر مجزا سازیم:

$firstName = 'Behzad';
$lastName = 'Moradi';
echo ($firstName, $lastName);

به عنوان خروجی اسکریپت فوق داریم:

Parse error: syntax error, unexpected ',' in /var/www/sokanacademy-php-course/index.php on line 4

در اینجا اگر بخواهیم ارور را مرتفع سازیم، یا می‌توانیم پرانتزها را حذف کنیم و یا به جای علامت کاما،‌ از نقطه مابین نام دو متغیر استفاده کنیم:

$firstName = 'Behzad';
$lastName = 'Moradi';
echo ($firstName . $lastName);

 نکتهبه چسباندن دو متغیر به یکدیگر در برنامه‌نویسی، اصطلاحاً Concatenation گفته می‌شود.

دستور print هم تا حدود زیادی شبیه به دستور echo است بدین صورت که می‌توان آن را هم با پرانتز و هم بدون آن مورد استفاده قرار داد:

$firstName = 'Behzad';
$lastName = 'Moradi';
print $firstName;
print "<br>";
print($lastName);

اما برخلاف echo، چه از پرانتز برای print استفاده کنیم و چه استفاده نکنیم، نخواهیم توانست چندین متغیر را با کاما از یکدیگر مجزا ساخته و از این دستور بخواهیم که آنها را چاپ کند:

$firstName = 'Behzad';
$lastName = 'Moradi';
print $firstName, $lastName;

در صورت اجرای اسکریپت فوق در مرورگر با ارور زیر مواجه خواهیم شد:

Parse error: syntax error, unexpected ',' in /var/www/sokanacademy-php-course/index.php on line 4

در حقیقت، می‌توان گفت که دستور echo می‌تواند بیش از یک پارامتر ورودی بگیرد اما print این‌گونه نیست. همچنین پیش از این گفتیم که دستور echo هیچ مقداری را return نمی‌کند (باز نمی‌گرداند). برای روشن‌ شدن مطلب، کد زیر را مد نظر قرار دهید:

$firstName = 'Behzad';
$newVariable = echo $firstName;
echo $newVariable;

به عنوان خروجی اسکریپت فوق داریم:

Parse error: syntax error, unexpected 'echo' (T_ECHO) in /var/www/sokanacademy-php-course/index.php on line 3

در واقع، echo صرفاً مسئول چاپ کردن چیزی است اما این در حالی است که ما در خط دوم از این دستور خواسته‌ایم که تا مقدار متغیر firstname$ را باز گردانده تا بتوانیم خروجی‌اش را در متغیر دیگری تحت عنوان newVariable$ ذخیره سازیم. در مقابل، دستور print چنین چیزی را در اختیار ما قرار می‌دهد. به عنوان مثال داریم:

$firstName = 'Behzad';
$newVariable = print $firstName;
//echo $newVariable;

به عنوان خروجی اسکریپت فوق داریم:

Behzad

حال یک بار دیگر این اسکریپت را اجرا می‌کنیم اما خط سوم را از کامنت در می‌آوریم:

$firstName = 'Behzad';
$newVariable = print $firstName;
echo $newVariable;

به عنوان خروجی اسکریپت فوق داریم:

Behzad۱

در واقع، از آنجا که دستور print همواره مقدار ۱ را return می‌کند، می‌بینیم که علاوه بر چاپ شدن مقدار متغیر newVariable$، مقدار ۱ هم چاپ شده است.

مقایسه‌ای مابین پرفورمنس echo و print
باتوجه به اینکه دستور echo هیچ مقداری را return نمی‌کند، پرفورمنس (راندمان) آن تاحدودی نسبت به دستور print بیشتر است. لذا توصیه می‌شود که تا حد ممکن از دستور echo استفاده نمایید. دانلود فایل‌های تمرین

آشنایی با مفهوم Variable (متغیر) در زبان PHP


Variable از واژهٔ انگلیسی Vary به معنی «متغیر بودن» ساخته شده است و در دنیای برنامه‌نویسی هم Variable (متغیر) به ظرفی اشاره دارد که به صورت موقت دیتایی را درون حافظه ذخیره می‌سازد. در زبان برنامه‌نویسی PHP، شاهد ۸ نوع مختلف از متغیرها هستیم که به ۴ دستهٔ کلی زیر تقسم‌بندی می‌شوند:
– Scalar
– Non-scalar یا Composite
– Resource
– Null

دستهٔ Scalar شامل بولین (Boolean)، عدد صحیح (Integer)، عدد اعشاری (Float) و رشته (String) است؛ دستهٔ Non-scalar شامل آرایه (Array) و آبجکت (Object) است؛ Resource به چیزی اشاره دارد که در خود زبان PHP تعبیه نشده است (همچون ارتباط با دیتابیس) و Null هم تایپ خاصی است که حاوی هیچ مقداری نبوده و تهی است.

شیوهٔ نامگذاری متغیرها در زبان PHP
فارغ از اینکه بخواهیم چه نوع متغیری ایجاد کنیم، یکسری قوانین کلی وجود دارند که در نام‌گذاری متغیرها در زبان PHPحتماً می‌بایست مد نظر قرار داده شوند که عبارتند از:
– نام متغیر باید با علامت $ شروع شود (مثلاً userId$)
– نام متغیر می‌تواند ترکیبی از حروف، اعداد و _ باشد (مثلاً user_id$)
– اولین حرف در نام متغیر پس از علامت $ باید یک حرف انگلیسی یا علامت _ باشد (مثلاً 1user$ مورد قبول نیست).
-نام متغیرها در زبان PHP اصطلاحاً Case-sensitive است؛ به عبارت دیگر، مفسر این زبان به حروف بزرگ و کوچک در ارتباط با متغیرها حساس است (مثلاً از دید مفسر این زبان userId ،$userID$ و userid$ سه متغیر مختلف محسوب می‌شوند).

به عنوان چند نمونه از نام‌های غلط در نامگذاری متغیرها در زبان PHP داریم:

my variable // There is a white space
my.variable // There is a dot
$1variable // There is a number at the beginning
$my-variable // There is a dash

به خاطر داشته باشیددر بالا با اصطلاح Case-sensitive آشنا شدید بدین معنا که نسبت به بزرگی یا کوچکی حروف حساسیت وجود دارد. در مقابل، اصطلاح دیگری وجود دارد تحت عنوان Case-insensitive که حاکی از آن است که مفسر PHP نسبت به بزرگی یا کوچکی حروف حساسیت ندارد.
به طور کلی، مفسر PHP نسبت به بزرگی یا کوچکی حروف در نام متغیرها، کلاس‌ها، متدها و چیزهایی از این دست حساس (Case-sensitive) است اما نسبت به نام دستوراتی همچون echo یا print و فانکشن‌های از پیش تعریف شده در خود زبان همچون ()sort غیرحساس (Case-insensitive) است. به عبارت دیگر، هیچ فرقی نمی‌کند که دستور اِکو را به صورت echo، eCHo و یا ECHO بنویسیم (البته توصیه می‌شود که استاندارد نوشتن کلیهٔ دستورات با حروف کوچک دنبال شود).

آشنایی با اصطلاحات نامگذاری‌ها در برنامه‌نویسی
به طور کلی سه روش مختلف برای نام‌گذاری چیزهای مختلف در سورس‌کد وجود دارد که عبارتند از camelCase ،snake_case و StudlyCase یا PascalCase. برای روشن شدن منظور از تک‌تک این اصطلاحات، متغیرهای زیر را در نظر بگیرید:

$fist_name = "Behzad"; // This is snake_case
$firstName = "Behzad"; // This is camelCase
$FirstName = "Behzad"; // This is StudlyCase (PascalCase)

همان‌طور که ملاحظه می‌شود، منظور از اصطلاح snake_case این است که کلیهٔ حروف نام متغیر را به صورت کوچک بنویسیم و از آنجا که در نام‌گذاری متغیرها مجاز به استفاده از Space (فاصله) نیستیم، به جای فاصله از Underscore یا همان علامت _ استفاده می‌کنیم.

منظور از اصطلاح camelCase هم این است که اولین حرف نام متغیر به صورت کوچک سپس اولین حرف کلیهٔ کلمات با حروف بزرگ نوشته می‌شوند (وجه تسمیهٔ این روش نام‌گذاری به این دلیل است که نام متغیر به نوعی شبیه به کوهان شترمی‌شود).

در نهایت، به روش نام‌گذاری StudlyCase یا PascalCase می‌رسیم که دقیقاً مشابه روش camelCase است با این تفاوت که حرف اول اولین کلمه نیز همچون سایر کلمات به صورت بزرگ نوشته می‌شود. نکتهدر زبان PHP بین دولوپرها مرسوم است که از هر یک از روش‌های نام‌گذاری فوق برای یکسری چیزها استفاده می‌کنند که به مرور اشاره خواهیم کرد که بایستی از کدام روش استفاده کرد.

اختصاص مقدار به یک متغیر
با استفاده از علامت = که اصطلاحاً Assignment Operator نامیده می‌شود، می‌توان مقادیر دلخواه خود را به متغیرها در زبان PHP اختصاص دهیم. هشداراشتباهی که بسیاری از کدآموزان در فرایند آموزشی خود مرتکب می‌شوند این است که فکر می‌کنند علامت = در برنامه‌نویسی همان کاری را انجام می‌دهد که در ریاضیات انجام می‌دهد؛ به عبارت دیگر،‌ فکر می‌کنند که علامت = میزان برابری چیزی را نشان می‌دهد اما این در حالی است که در زبان‌های برنامه‌نویسی اصلاً این‌گونه نیست و این علامت برای تخصیص مقداری به یک متغیر استفاده می‌شود. در زبان‌های برنامه‌نویسی اگر بخواهیم میزان برابری را نشان دهیم، می‌بایست از علائم == و یا === استفاده نماییم.

نحوهٔ استفاده از متغیرها با دستور echo در زبان PHP
برای روشن‌تر شدن این مسئله، مثالی می‌زنیم:

$firstName = 'Behzad';
$lastName = 'Moradi';
echo "My firstname is $firstName and my lastname is $lastName.";

به عنوان خروجی کدهای فوق داریم:

My firstname is Behzad and my lastname is Moradi.

در تفسیر کدهای فوق، بایستی بگوییم که Variale (متغیر) در زبان PHP با قرار دادن یک علامت $ و نام دلخواه ساخته شده، سپس یک علامت = قرار می‌دهیم و یک Value (مقدار) برای آن در نظر می‌گیریم و در نهایت هم یک علامت ; قرار می‌دهیم.

حال اگر بخواهیم مقادیر متغیرهای خود را با استفاده از دستورات echo و یا print چاپ کنیم، می‌بینیم که به سادگی از علائم ” ” استفاده کرده، هر عبارتی که بخواهیم می‌نویسیم و هر کجا هم که نیاز داشته باشیم مقادیر متغیرها چاپ شوند، آنها را جایگذاری می‌کنیم.

نکته‌ای که در اینجا می‌بایست مد نظر داشته باشیم این است که می‌توان از علائم { } دور متغیر استفاده کنیم تا این اطمینان حاصل گردد که نام متغیر به اسامی قبل و بعدش نمی‌چسبد:

$firstName = 'Behzad';
$lastName = 'Moradi';
echo "My firstname is {$firstName} and my lastname is {$lastName}.";

دقیقاً خروجی قبل را در یافت خواهیم کرد با این تفاوت که می‌توانیم اطمینان حاصل کنیم که به اشتباه نام متغیر به یک استرینگ نخواهد چیسبید. به عنوان مثال:

$firstName = 'Behzad';
$lastName = 'Moradi';
echo "My firstname is $firstNameand my lastname is {$lastName}.";

اگر از علائم { } استفاده نکنیم، همان‌طور که مشاهده می‌شود ممکن است نام متغیر به استرینگ‌های قبل و یا بعدش بچسبد که در این صورت داریم به مفسر دستور می‌دهیم که مقدار متغیر جدیدی -که وجود خارجی ندارد- را چاپ کند. هشدارتوجه داشته باشید که برای چاپ کردن مقادیر متغیرها در زبان PHP با استفاده از دستور echo حتماً می‌بایست از علائم ” ” استفاده کرد و در صورتی که از علائم ‘ ‘ استفاده شود، نتیجهٔ دلخواه را نخواهیم گرفت و علت این مسئله هم آن است که علائم ” ” می‌توانند هر آنچه که مابین آنها قرار گرفته را Interprete (تفسیر) کنند در حالی که علائم ‘ ‘ صرفاً چیزی که مابین آنها قرار گیرد را همان‌طور که هستند چاپ می‌کنند. به همین دلیل به نظر می‌رسد که از یک سو اگر سرعت برای دولوپر مهم باشد و از سوی دیگر نیازی به قابلیت‌های علائم ” ” نداشته باشد، سرعت اجرای ‘ ‘ بیشتر است. 

برای روش‌تر شدن هشدار فوق، کدهای بالا را به صورت زیر ریفکتور می‌کنیم:

$firstName = 'Behzad';
$lastName = 'Moradi';
echo 'My firstname is $firstName and my lastname is $lastName.';

به عنوان خروجی اسکریپت فوق داریم:

My firstname is $firstName and my lastname is $lastName.

می‌بینیم که اگر به جای علائم ” ” از علائم ‘ ‘ استفاده کنیم، به جای نمایش دادن مقادیر متغیرها، نام متغیرها چاپ خواهد شد و مسلماً این چیزی نیست که مد نظر ما است. نکتهدر صنعت توسعهٔ نرم‌افزار، زمانی که دست به اعمال تغییرات در سورس‌کد پروژهٔ خود بزنیم، به این فرایند Refactor کردن گفته می‌شود. ریفکتور کردن معمولاً به منظور بهبود سورس‌کد صورت می‌گیرد.

آشنایی با مفهوم Concatenation
گاهی‌اوقات نیاز داریم تا چندین استرینگ و متغیر را به یکدیگر بچسبانیم که برای این منظور می‌بایست با مفهومی تحت عنوان Concatenation (به معنی الحاق، الصاق یا چسباندن) آشنا شویم. برای مثال، اسکریپت فوق را در نظر می‌گیریم:

$firstName = 'Behzad';
$lastName = 'Moradi';
echo 'My firstname is ' . $firstName . ' and my lastname is ' . $lastName;

می‌بینیم که هر کجا که استرینگ داریم، آنها را مابین علائم ‘ و ‘ قرار داده‌‌ایم سپس یک نقطه قرار داده و استرینگ بعدی را آورده‌ایم. به فرایند چسباندن یکسری استرینگ/متغیر به یکدیگر، Concatenation گفته می‌شود. به عنوان خروجی اسکریپت فوق داریم:

My firstname is Behzad and my lastname is Moradi

امکان استفاده از مقدار یک متغیر به عنوان نام یک متغیر دیگر!
در زبان PHP دولوپرها این امکان را دارند تا از Value (مقدار) یک متغیر، به عنوان نام متغیری دیگر استفاده کنند. این مسئله در ظاهر کمی گیج‌کننده است اما با ذکر یک مثال واقعی، منظور بهتر منتقل خواهد شد:

$firstVariable = "hi";
$$firstVariable = "hello";
echo $hi;

به عنوان خروجی اسکریپت فوق داریم:

hello

در واقع، ما یک متغیر ساخته‌ایم تحت عنوان firstVariable$ که مقدار استرینگ hi را دارد. در خط دوم از دو علامت $$ استفاده کرده سپس نام متغیری که پیش از این ساخته‌ بودیم را نوشته و مقداری دلخواه همچون hello را هم برای آن در نظر گرفته‌ایم. حال اگر متغیر hi$ را چاپ کنیم، خواهیم دید که مقدار hello چاپ می‌شود. در حقیقت، کاری که در خط دوم انجام داده‌ایم این است که دستور داده‌ایم که مقدار متغیر firstVariable$ به عنوان نام متغیر جدیدمان در نظر گرفته‌ شود.

آشنایی با زبان‌های اصطلاحاً Statically-typed و Dynamically-typed
به خاطر داشته باشید که در این مبحث، Type (تایپ) اصلاً به معنی «تایپ کردن» نیست بلکه به معنی «نوع» بوده و به نوع دیتایی که در متغیرها ذخیره می‌شود اشاره دارد.

از بُعد چگونگی تعریف متغیرها، می‌توان زبان‌های برنامه‌نویسی را اصطلاحاً به دو دستهٔ Statically-typed و Dynamically-typed تقسیم‌بندی کرد. به عبارت دیگر، در زبانی که به اصطلاح Statically-typed باشد، دولوپر می‌بایست در حین کدنویسی، تایپ (نوع) متغیر را مشخص کند تا در حین کامپایل برنامه، نوع متغیرها در اختیار کامپایلر وجود داشته باشند. به عنوان مثال، در زبان جاوا که یک زبان Statically-typed است داریم:

int myInteger = 5;

همان‌طور که مشاهده می‌شود، در زبان جاوا برای آنکه بخواهیم یک متغیر از جنس عدد صحیح تعریف کنیم، در حین کدنویسی باید کلیدواژهٔ int را بنویسیم که به منظور تعریف متغیرهای عددی استفاده می‌شود سپس می‌توانیم مقداری همچون عدد ۵ را برای این متغیر در نظر بگیریم. حال اگر به صورت زیر یک استرینگ برای متغیر فوق در نظر بگیریم:

int myInteger = "5";

با اروری همچون ارور زیر از طرف کامپایلر جاوا مواجه خواهیم شد:

incompatible types: String cannot be converted to int

زیرا نوع متغیر int (عدد صحیح) است و این در حالی است که ما یک استرینگ (رشته) به عنوان مقدار اولیهٔ آن در نظر گرفته‌ایم.

در مقابل، در زبان‌های به اصطلاح Dynamically-typed نیازی نیست دولوپر در حین کدنویسی نوع متغیرها را مشخص سازد و این در حالی است که پس از اختصاص مقادیر به متغیر،‌ بسته به اینکه مقادیر از چه نوعی هستند، در حین Run-time (تفسیر و اجرای سورس‌کد) تایپ متغیر مشخص خواهد شد. از جملهٔ این نوع زبان‌ها می‌توان به PHP و Python اشاره کرد. به عنوان مثال در زبان PHP داریم:

$myNumber = 5;

می‌بنیم که اصلاً نوع متغیر را تعریف نکردیم اما در حین اجرای اسکریپت فوق، مفسر PHP از روی مقدار در نظر گرفته شده برای این متغیر -که عدد ۵ است- می‌فهمند با یک متغیر از جنس int (عدد صحیح) سر و کار دارد.

آشنایی با تفاوت‌های زبان‌های اصطلاحاً Weakly-typed و Strongly-typed
تفاوت اصلی مابین دو اصطلاح Weakly-typed و Strongly-typed در نحوهٔ به‌کارگیری متغیرها در زبان‌های برنامه‌نویسی است. به عبارت دیگر، در زبانی که Strongly-typed باشد، وقتی که تایپی برای متغیری در نظر گرفته شود، آن تایپ تا ابد باقی خواهند ماند تا اینکه دولوپر با فرایندی تحت عنوان Cast -که در ادامه بیشتر با آن آشنا خواهید شد- بیاید و تایپ متغیر را تغییر دهد.

برای مثال، اگر بخواهیم دو متغیری که تایپ‌ها یکی نیست را با یکدیگر جمع کنیم، ارور دریافت خواهیم کرد اما این در حالی است که چنین سخت‌گیری در مورد زبان‌های به اصطلاح Weakly-typed وجود ندارد. به عنوان نمونه، در زبانی همچون جاوا که یک زبان به اصطلاح Strongly-typed یا Strictly-typed است، با نوشتن کدهای زیر ارور دریافت خواهیم کرد:

public class MyClass {
    public static void main(String args[]) {
        int myInteger = 5;
        String myString = "5";
        int total = myInteger + myString;
        System.out.println(total);
    }
}

به عنوان خروجی برنامهٔ جاوای فوق داریم:

incompatible types: String cannot be converted to int

حال برنامهٔ فوق را ریفکتور کرده تا ارور مذکور مرتفع گردد:

public class MyClass {
    public static void main(String args[]) {
        int myInteger = 5;
        String myString = "5";
        int total = myInteger + Integer.parseInt(myString);
        System.out.println(total);
    }
}

به عنوان خروجی داریم:

10

می‌بینیم پس از اینکه تایپ متغیر myString در خط بعد به Integer تغییر یافت، کامپایلر جاوا به سادگی قادر خواهد بود تا هر دو متغیر myInteger و myString را با یکدیگر جمع کرده و جمع‌جبری آنها ۱۰ خواهد شد.

در مقابل، زبان PHP زبانی است که گفته می‌شود اصطلاحاً Weakly-typed یا Loosely-typed است. به عبارت دیگر، در واقع، در PHP وقتی که ما دست به تعریف متغیری می‌زنیم، ما به عنوان یک دولوپر اصلاً نیازی نیست تا نگران این مسأله باشیم که چه نوع دیتایی قرار است در این متغیر ذخیره گردد. به عنوان نمونه داریم:

$myNumber = 5;

همانطور که مشاهده می‌شود، در حین تعریف این متغیر هرگز نوع آن را مشخص نکرده‌ایم اما این در حالی است که در حین اجرای این خط از کد، مفسر پی‌اچ‌پی بر اساس نوع مقدار این متغیر (که در اینجا یک عدد صحیح است) متوجه می‌شود که نوع این متغیر چیست. حال اسکریپت زیر را نظر بگیرید:

$myNumber = 5;
$myString = "5";
$total = $myNumber + $myString;
echo $total;

به عنوان خروجی داریم:

10

در تفسیر اسکریپت فوق بایستی بگوییم که متغیر myString$ به خاطر محتوایی که دارد، نوع آن استرینگ است (در حقیقت، از آنجا که عدد ۵ مابین دو علامت ” ” قرار گرفته است، یک استرینگ (رشته) محسوب می‌شود که چیزی همچون Five تلقی می‌گردد). اما ما در متغیر سوم -total$- آمده‌ایم و هر دو متغیر که یکی از جنس عدد صحیح است و دیگری از جنس استرینگ را با یکدیگر جمع کرده‌ایم و می‌بینیم که مفسر پی‌اچ‌پی هم بدون هیچ مشکلی هر دو متغیر -که تایپ‌ها آنها با یکدیگر متفاوت است- را به سادگی با یکدیگر جمع کرده و خروجی ۱۰ را در اختیار ما قرار می‌دهد.

نکته‌ای که در اینجا می‌بایست مد نظر داشته باشیم این است که مفسر پی‌اچ‌پی در Run-time (زمان اجرای اسکریپت) به صورت خودکار تمام تلاش خود را می‌کند تا تایپ متغیر myString$ را به تایپی تغییر دهد که بتواند مقدار آن را با متغیر myNumber$ جمع کند. لذا تایپ int در حین اجرا برای متغیر myString$ در نظر گرفته خواهد شد اما اگر پس از اجرای موفقیت‌آمیز اسکریپت، باز هم تایپ این متغیر را بررسی کنیم، می‌بینیم که string است:

$myNumber = 5;
$myString = "5";
$total = $myNumber + $myString;
echo $total . "
";
echo gettype($myString);

به عنوان خروجی داریم:

10
string

 نکتهوقتی که تایپ یک متغیر مشخص می‌شود، اصطلاحاً گفته می‌شود که تایپ آن Declare شده است.

به نوعی می‌توان گفت که این قابلیت را برخی از دیگر دولوپرهای زبان‌های برنامه‌نویسی جزو نقاط ضعف زبان PHP در نظر می‌گیرند چرا که در برخی مواقع منجر به ایجاد یکسری باگ‌ها می‌گردد؛ اما همین قابلیت از دید دلوپرهای متعصب زبان PHP، برگ برندهٔ این زبان است زیرا انعطاف‌پذیری دولوپر را به مراتب بالاتر برده و دست وی را بیشتر باز خواهد گذاشت.

آشنایی با مفهوم Variable Casting در زبان PHP
Cast بحثی بسیار مهم در PHP به شما می‌آید و این در حالی است که گاهی‌اوقات دولوپرهای باتجربه نیز از ساز و کار Variable Casting در این زبان آگاهی ندارند!

در پشت پرده، مفسر PHP متغیرها را اصطلاحاً به تایپ مورد نیاز Cast می‌کند اما این در حالی است که این آزادی عمل در اختیار دولوپر قرار گرفته تا در صورت نیاز، خود به صورت دستی اقدام کَست کردن متغیرها کنند که این کار را به دو روش می‌توان انجام داد:
– استفاده از اپراتور کَست
– استفاده از فانکشن‌های از پیش تعریف شده در PHP

$myVariable = '123';
$variableType = gettype($myVariable);
echo "My Variable Value is $myVariable and its type is $variableType";

همان‌طور که ملاحظه می‌شود، متغیری داریم تحت عنوان myVariable$ که مقداری هم که برای آن در نظر گرفته شده است، استرینگی است تحت عنوان ‘123’. در حقیقت، از آنجا که ۱۲۳ مابین دو علامت ‘ و ‘ قرار گرفته‌ است، همچون یک عبارت یا نوشته با آنها برخورد می‌شود (به عبارت دیگر، چیزی مشابه ‘One Two Three’ است).

در خط بعد متغیر دیگری تعریف کرده‌ایم تحت عنوان variableType$ که مقدار آن را برابر با یکی از فانکشن‌های از پیش تعریف شده در زبان PHP تحت عنوان ()gettype قرار داده‌ایم و همان‌طور که از نام این فانکشن مشخص است، این وظیفه را دارا است تا تایپ (نوع) پارامتر ورودی‌اش را مشخص سازد.

در همین راستا، به عنوان پارامتر ورودی این فانکشن، متغیری که پیش از این تعریف کرده‌ایم را در نظر می‌گیریم و در خط آخر هم با استفاده از دستور echo استرینگی را به صورت زیر چاپ خواهیم کرد:

My Variable Value is 123 and its type is string

می‌بینیم که مقدار هر دو متغیر بازگردانده شده است و این در حالی است که تایپ متغیر myVariable$ اصطلاحاً string است. حال به منظور درک بهتر فرایند کَستینگ، کدهای فوق را به صورت زیر تغییر می‌دهیم:

$myVariable = '123';
$myVariable = (int) $myVariable;
$variableType = gettype($myVariable);
echo "My Variable Value is $myVariable and its type is $variableType";

مجدد اسکریپت فوق را در مرورگر اجرا می‌کنیم:

My Variable Value is 123 and its type is integer

می‌بینیم که مقدار متغیر $variableType از string به integer تغییر یافت. آنچه اتفاق افتاده این است که در خط دوم متغیر myVariable$ را اصطلاحاً Cast کرده‌ایم به int. به عبارت دیگر، خود اقدام به تبدیل کردن تایپ (نوع) متغیر از string به integer کرده‌ایم.به خاطر داشته باشیدهمان‌طور که ملاحظه می‌شود به جای نوشتن کامل تایپ integer از int استفاده کرده‌ایم. اصطلاحاً گفته می‌شود که int یک Alias (نام مستعار) برای integer است. همچنین bool هم یک نام مستعار برای Boolean است.

حال قصد داریم تا به جای int متغیر مد نظر را به بولین کَست کنیم:

$myVariable = '123';
$myVariable = (bool) $myVariable;
$variableType = gettype($myVariable);
echo "My Variable Value is $myVariable and its type is $variableType";

ابتدا خروجی اسکریپت فوق را چک می‌کنیم:

My Variable Value is 1 and its type is boolean

می‌بینیم که پس از کست کردن متغیر به bool، مقدار آن برابر با ۱ شده است و تایپ هم به درستی boolean نمایش داده می‌شود.به خاطر داشته باشیددیتاتایپ Boolean دو مقدار بیشتر نمی‌تواند داشته باشد: true یا false. همچنین مقدار عددی true برابر با عدد ۱ و مقدار عددی false برابر با ۰ است.

پیش از این گفتیم که روش دومی که برای کَست کردن می‌توانیم استفاده کنیم، استفاده از فانکشن‌های از پیش تعریف شده در زبان PHP است. نکتهٔ جالب در مورد این دست فانکشن‌ها این است که نام آنها به خوبی گویای کاری است که انجام می‌دهند که عبارتند از floatval ،intval ،strval و boolval. به طور مثال داریم:

$myVariable = '123';
$myVariable = intval($myVariable);
$variableType = gettype($myVariable);
echo "My Variable Value is $myVariable and its type is $variableType";

به عنوان خروجی هم داریم:

My Variable Value is 123 and its type is integer

راه‌کار آخر هم برای کَست کردن متغیرها استفاده از فانکشن ()settype است. برای روشن‌تر شدن این مسئله، کدهای زیر را در نظر بگیرید:

$myVariable = '123';
$myVariable = settype($myVariable, 'integer');
$variableType = gettype($myVariable);
echo "My Variable Value is $myVariable and its type is $variableType";

به عنوان خروجی اسکریپت فوق داریم:

My Variable Value is 1 and its type is boolean

همان‌طور که ملاحظه می‌شود، نتیجه غیرمنتظره است! در واقع، کاری که این فانکشن انجا می‌دهد این است که دیتاتایپ را تغییر می‌دهد که اگر این کار با موفقیت صورت گیرد مقدار true و در غیر این صورت، مقدار false را باز می‌گرداند و همان‌طور که پیش از این گفتیم، معادل استرینگی true برابر با ۱ و معادل استرینگی false برابر با ۰ است؛ لذا از آنجا که در اسکریپت فوق این فرایند با موفقیت انجام شده، در خط دوم مقدار ۱ به متغیرمان اختصاص می‌یابد و تایپ آن بولین می‌شود و همین می‌شود که در خروجی عدد ۱ را می‌بینیم. حال چنانچه بخواهیم همچون گذشته نتیجهٔ مد نظر را مشاهده کنیم، می‌بایست اسکریپت فوق را به صورت زیر ریفکتور نماییم:

$myVariable = '123';
settype($myVariable, 'integer');
$variableType = gettype($myVariable);
echo "My Variable Value is $myVariable and its type is $variableType";

حال خروجی را چک می‌کنیم:

My Variable Value is 123 and its type is integer

می‌بینیم که نتیجهٔ قابل انتظار مشاهده می‌شود. در واقع، کاری که در اسکریپت فوق پس از اعمال تغییرات انجام داده‌ایم این است که در خط دوم به جای آنکه خروجی فانکشن settype که معادل با ۱ است را به متغیر myVariable اختصاص دهیم، صرفاً فرایند کَستینگ را انجام می‌دهیم و خروجی این فانکشن را ذخیره نمی‌سازیم.

نکات حساس در مورد Variable Casting
وقتی در زبان PHP به سراغ فرایند کَستینگ می‌رویم، گاهی نتایج آن‌طور که مد نظر ما است نشان داده نمی‌شود و اینجا است که بایستی با یکسری استثناء‌ها آشنا شویم.

همواره به یاد داشته باشیم که کست کردن از دیتاتایپ Float به Integer هرگز عدد اعشاری را رو به بالا یا پایین رُند نمی‌کند بلکه بخش اعشاری کاملاً حذف می‌گردد:

$myFloat = 123.56;
$myFloat = (int) $myFloat;
echo $myFloat;

به عنوان خروجی داریم:

123

در مورد بولین‌ها اگر یک استرینگ را به بولین کست کنیم، مقدار آن برابر با false می‌شود:

$myString = "";
$myString = (bool) $myString;
var_dump($myString);

به عنوان خروجی داریم:

bool(false)

در کد فوق از فانکشن جدیدی تحت عنوان var_dump استفاده کرده‌ایم. کاری که این فانکشن انجام می‌دهد این است که مقدار متغیر را همچون echo برایمان چاپ می‌کند اما این در حالی است که اطلاعات بیشتری هم در اختیارمان قرار می‌دهد. می‌بینیم که مقدار false بازگردانده شده است (به خاطر داشته باشید که اگر این متغیر خالی نبود و استرینگی داخل آن وجود داشت، پس از کست کردن مقدار true بازگردانده می‌شد).

اگر یک عدد صحیح یا عدد اعشاری را به بولین کست کنیم و در عین حال مقدار آن صفر نباشد، چه عدد مثبت باشد و چه منفی، مقدار true بازگردانده می‌شود:

$myInteger = -123;
$myInteger = (bool) $myInteger;
var_dump($myInteger);

به عنوان خروجی داریم:

bool(true)

کَست کردن یک استرینگ به عدد، ۰ می‌شود:

$myString = "This is string";
$myString = (int) $myString;
var_dump($myString);

به عنوان خروجی داریم:

int(0)

چک کردن تایپ متغیرها در زبان PHP
در زبان PHP یکسری فانکشن‌های از پیش تعریف شده وجود دارند که برای چک کردن تایپ (نوع) یک متغیر می‌توان از آنها استفاده کرد که از آن جمله می‌توان به ()is_int یا ()is_array اشاره کرد که به ترتیب به منظور چک کردن اینکه آیا یک متغیر عدد صحیح یا آرایه هست یا خیر، مورد استفاده قرار می‌گیرد (لازم به ذکر است که این دست فانکشن‌ها در دستورات شرطی (If/Else) مورد استفاده قرار می‌گیرد که در ادامهٔ آموزش‌ها بیشتر با این نوع دستورات آشنا خواهید شد). لیست این فانکشن‌ها عبارت است از:

settype() - Set the type of a variable
get_class() - Returns the name of the class of an object
is_array() - Finds whether a variable is an array
is_bool() - Finds out whether a variable is a boolean
is_callable() - Verify that the contents of a variable can be called as a function
is_float() - Finds whether the type of a variable is float
is_int() - Find whether the type of a variable is integer
is_null() - Finds whether a variable is NULL
is_numeric() - Finds whether a variable is a number or a numeric string
is_object() - Finds whether a variable is an object
is_resource() - Finds whether a variable is a resource
is_scalar() - Finds whether a variable is a scalar
is_string() - Find whether the type of a variable is string
function_exists() - Return TRUE if the given function has been defined
method_exists() - Checks if the class method exists

برای روشن‌تر شدن نحوهٔ به‌کارگیری این فانکشن‌ها، اسکریپت زیر را در نظر بگیرید:

$myVariable = 7;
$type = is_int($myVariable);
echo $type;

به عنوان خروجی اسکریپت فوق داریم:

1

حال اسکریپت فوق را به صورت زیر ریفکتور می‌کنیم:

$myVariable = "7";
$type = is_int($myVariable);
echo $type;

اکنون به عنوان خروجی،‌ هیچ چیزی در معرض دیدمان قرار نخواهد گرفت چرا که نتیجه false است و مقدار عددی false هم برابر با ۰ است که در خروجی نمایش داده نمی‌شود.

تاکنون به نوعی با مفهوم متغیر در زبان PHP آشنا شده‌اید. در ادامه قصد داریم به تفصیل در مورد تک‌تک این ۸ نوع متغیر در زبان PHP بحث کنیم. در واقع، هر کدام از این انواع متغیرها اصطلاحاً Data Type نامیده می‌شوند که این وظیفه را دارند تا نوع خاصی از دیتا (داده) را در خود ذخیره سازند.

آشنایی با متغیرهای اصطلاحاً Scalar
پیش از این گفتیم که در زبان PHP چهار نوع متغیر از نوع Scalar دارد که در ادامه با تک‌تک آنها آشنا خواهید شد:

– آشنایی با String در زبان PHP: (استرینگ یا رشته) به مجموعه حروف الفبا، کاراکترهای خاص، علائم، اعداد و هر چیزی گفته می‌شود که در کنار یکدیگر داخل علائم ” ” یا ‘ ‘ قرار می‌گیرند. به طور مثال، عبارت «من دولوپر هستم» یک استرینگ (رشته) است. به عنوان مثال داریم:

$string = "I am a developer.";

 هشدارهمواره به خاطر داشته باشید که اگر ابتدای استرینگ را با علامت ” شروع کرده باشید، حتماً بایستی انتهای آن را نیز با علامت ” به اتمام برسانید و در صورتی که مثلاً از علامت ‘ استفاده کنید، ارور دریافت خواهید کرد.

پیش از این گفتیم که متغیرها به این دلیل متغیر نامیده می‌شوند که اصطلاحاً Mutable (قابل تغییر) هستند. در مثال زیر می‌بینیم که ابتدا متغیری با مقدار اولیه‌ای تعریف کرده‌ایم اما در خط بعد مجدد همان متغیر را نوشته و این بار مقدار جدید برای آن در نظر گرفته‌ایم:

$string = "I am a developer.";
$string = "I am a not developer.";
echo $string;

اگر خروجی اسکریپت فوق را ببینیم، خواهیم دید که متغیر string$ مقدار اولیهٔ خود را از دست داده و مقدار جدید جایگزین آن شده است:

I am a not developer.

در واقع، همان‌طور که مفسر PHP یک اسکریپت را از بالا به پایین تفسیر می‌کند، همواره مقداری که در آخرین خط برای متغیر در نظر گرفته شده است مبنا قرار داده خواهد شد. همچنین در نظر داشته باشید محدودیتی در ارتباط با Length (طول) برای استرینگ‌ها در زبان PHP در نظر گرفته نشده است و استرینگ‌هایی با هر حجمی که بخواهید می‌توانید ذخیره سازید (البته بسته به سخت‌افزار مورد استفاده، این حجم می‌تواند از یک سرور به سرور دیگری متغیر باشد).

– آشنایی با Integer در زبان PHP: اعداد صحیح مابین 2,147,483,648- و 2,147,483,647 جزو دیتاتایپ Integer هستند. در ارتباط با اعداد صحیح در زبان PHP یکسری قوانین وجود دارند که مهم‌ترین آنها عبارتند از:
– هر عدد صحیح حداقل می‌بایست یک رقم داشته باشد.
– هر عدد صحیح نمی‌بایست هیچ‌گونه رقم اعشاری داشته باشد.
– هر عدد صحیح می‌توان مثبت یا منفی باشد.

به عنوان مثال، در اسکریپت زیر یک متغیر از جنس عدد صحیح ایجاد کرده‌ایم:

$integer = 123;
var_dump($integer);

به عنوان خروجی داریم:

int(123)

می‌بینیم که فانکشن ()var_dump علاوه بر مقدار این متغیر، نوع آن (int) را هم مشخص ساخته است.

همواره به خاطر داشته باشید که اعداد را نمی‌بایست داخل علائم ” ” و یا ‘ ‘ قرار داد چرا که در این صورت آنها را به استرینگ تبدیل کرده‌ایم. همچنین به صورت پیش‌فرض، اعداد در PHP مثبت (+) در نظر گرفته می‌شوند مگر آنکه علامت منفی (-) قبل از آنها درج شود.

– آشنایی با Float در زبان PHP: نام دیگر این نوع دیتاتایپ Floating Point Number یا Double است و به هر نوع عددی گفته می‌شود که رقم اعشاری داشته باشد. به عنوان مثال داریم:

$float = 1.23;
var_dump($float);

به عنوان خروجی داریم:

float(1.23)

– آشنایی با Boolean در زبان PHP: دیتاتایپ بولین از دو حال خارج نیست: true یا false. به عنوان مثال داریم:

$itIsTrue = true;
$itIsFalse = false;
var_dump($itIsTrue, $itIsFalse);

به عنوان خروجی هم داریم:

bool(true) bool(false)

همواره به خاطر داشته باشیم که کلیدواژگان true و false را هرگز نمی‌بایست داخل علائم ” ” و یا ‘ ‘ قرار داد:

$itIsTrue = "true";
$itIsFalse = 'false';
var_dump($itIsTrue, $itIsFalse);

به عنوان خروجی داریم:

string(4) "true" string(5) "false"

در حقیقت، وقتی که کلیدواژگان true و false را داخل دابل کوتیشن یا سینگل کوتیشن قرار می‌‌دهیم، آنها را از حالت بولین خارج ساخته و به استرینگ تبدیل می‌کنیم (همچنین به خاطر داشته باشیم معادل عددی true عدد ۱ و معادل عددی false عدد ۰ است).

آشنایی با متغیرهای اصطلاحاً Non-scalar
در زبان PHP دو نوع متغیر به اصطلاح Non-scalar داریم که عبارتند از Array و Object که در ادامه با هر دوی آنها آشنا خواهید شد:

– آشنایی با Array در زبان PHP: آرایه دیتاتایپی است که این امکان را به دولوپر می‌دهد تا داده‌های مختلفی -که معمولاً با یکدیگر مرتبط هستند- را داخل یک متغیر و در کنار یکدیگر ذخیره سازد. به عنوان مثال، اگر بخواهیم متغیری داشته باشیم که اسامی تعدادی خودرو را داخل خود ذخیره سازد، می‌توانیم از آرایه استفاده کنیم:

$cars = array("Volvo","BMW","Toyota");
var_dump($cars);

به عنوان خروجی هم داریم:

array(3) {
  [0]=>
  string(5) "Volvo"
  [1]=>
  string(3) "BMW"
  [2]=>
  string(6) "Toyota"
}

می‌بینیم آرایه‌ای داریم که ۳ عضو دارد (لازم به ذکر است که مبحث آرایه‌ها در زبان PHP بسیار گسترده است و در فصول آتی، به تفصیل در مورد آنها صحبت خواهیم کرد).

– آشنایی با Object در زبان PHP: آبجکت (شییٔ) دیتاتایپی در زبان PHP است که مرتبط با مفهوم OOP (شییٔ‌‌گرایی) است که در فصول آینده به تفصیل در مورد آن صحبت خواهیم کرد اما در ادامه یک مثال کوچک از عملکرد آن خواهیم زد:

class MyClass
{
    public function showSomething() {
        echo "This is a method in a class.";
    }
}

$myObject = new MyClass;
var_dump($myObject);

به عنوان خروجی داریم:

object(MyClass)#1 (0) { }

آشنایی با Resource در زبان PHP
در واقع، Resource واقعاً یک دیتاتایپ نیست. در زبان PHP یکسری منابعی که خارج از اکوسیستم خود PHP هستند تحت عنوان Resource شناخته می‌شوند. به طور مثال، می‌توان ارتباط با دیتابیس MySQL را مثال زد که نوعی ریسورس محسوب می‌شود (در فصول آینده به تفصیل در مورد دیتابیس‌ بحث خواهیم نمود).

آشنایی با Null در زبان PHP
آخرین نوع از دیتاتایپ‌های زبان PHP اصطلاحاً Null نام دارد که یک دیتاتایپ خاص است که فقط و فقط یک مقدار می‌تواند در خود ذخیره سازد که آن هم Null است (البته این مقدار اصطلاحاً Case-insensitive است؛ لذا مقادیر null ،NULL و nUll هم مشابه Null هستند).به طور کلی، متغیری که دیتاتایپ آن Null باشد، متغیری است که حاوی هیچ‌گونه مقداری نبوده و تهی است. به طور مثال داریم:

$myNullVariable = null;
echo gettype($myNullVariable);

خروجی اسکریپت فوق برابر است با:

NULL

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

$myVariable = 123;
$myVariable = null;
var_dump($myVariable);

به عنوان خروجی داریم:

NULL

در حقیقت، در اسکریپت فوق ابتدا یک متغیر از جنس عدد صحیح داشته‌ایم اما در خط دوم مقدار آن را برابر با null قرار داده‌ایم. حال اگر با استفاده از فانکشن ()var_dump خروجی آن را مشاهده کنیم، می‌بنیم که مقدار NULL در معرض دیدمان قرار خواهد گرفت.به خاطر داشته باشیدهمان‌طور که پیش از این گفتیم که کلیدواژگان true و false را هرگز نمی‌بایست داخل علائم ” ” و یا ‘ ‘ قرار داد، این قانون در مورد کلیدواژهٔ Null هم صدق می‌کند و اگر آن را داخل این علائم قرار دهیم، دیگر مفهوم Null (تهی) بودن خود را از دست می‌داد و به یک استرینگ تبدیل می‌شود.

آشنایی با توابع ()isset و ()unset در PHP
وقتی پای متغیرها در زبان PHP در میان باشد، یکسری فانکشن‌ها (توابع) کاربردی هستند که می‌بایست با آنها آشنا باشیم که از آن جمله می‌توان به ()isset و ()unset اشاره کرد. به منظور روشن شدن کاربرد این توابع، کدهای زیر را مد نظر قرار می‌دهیم:

$firstName = 'Behzad';
$checkIfVariableIsSet = isset($firstName);
echo $checkIfVariableIsSet;

به عنوان خروجی اسکریپت فوق داریم:

1

در تفسیر اسکریپت فوق بایستی بگوییم که ابتدا متغیری تعریف کرده تحت عنوان firstName$ و مقداری پیش‌فرض هم برای آن در نظر گرفته‌ایم؛ سپس متغیری ساخته‌ایم تحت عنوان checkIfVariableIsSet$ و مقدار آن را برابر با فانکشن ()isset قرار داده‌ایم و متغیر firstName$ را به عنوان پارامتر ورودی این فانکشن پاس داده‌ایم. پس از اجرای این اسکریپت در مرورگر، می‌بینیم که مقدار ۱ بازگردانده می‌شود.

در حقیقت، خروجی فانکشن ()isset بولینی است؛ به عبارت دیگر، خروجی این فانکشن یا true است یا false که اگر true باشد مقدار ۱ و در غیر این صورت مقدار ۰ بازگردانده می‌شود (البته مقدار ۰ در خروجی نمایش داده نمی‌شود). نکتهدر برنامه‌نویسی از فعل Pass به معنی «پاس دادن» به کرات استفاده می‌شود. در واقع، زمانی که مثلاً پارامتری را به عنوان ورودی یک فانکشن در نظر می‌گیریم، اصطلاحاً گفته می‌شود که آن پارامتر به فانکشن مد نظر پاس داده شده است.

حال اسکریپت فوق را به صورت زیر ریفکتور می‌کنیم:

$firstName = 'Behzad';
$checkIfVariableIsSet = isset($firstName);
echo $checkIfVariableIsSet;
unset($firstName);
echo $firstName;

به عنوان خروجی اسکریپت فوق داریم:

1
Notice: Undefined variable: firstName in /var/www/sokanacademy-php-course/index.php on line 6

همان‌طور که می‌بینیم، پس از آپدیت، از فانکشن ()unset استفاده کرده و متغیر firstName$ را به عنوان پارامتر ورودی آن در نظر گرفته‌ایم. کاری که این فانکشن انجام می‌دهد این است که به کلی متغیر را از داخل حافظه پاک می‌کند؛ از این پس، اگر بخواهیم مجدد این متغیر را echo کنیم، می‌بینیم که با اروری مواجه می‌شویم حاکی از آنکه چنین متغیری اصلاً وجود خارجی ندارد!

آشنایی با فانکشن ()empty در زبان PHP
برای اینکه چک کنیم ببینیم آیا یک متغیر Empty (خالی) است یا خیر، می‌بایست از فانکشنی تحت عنوان ()empty استفاده کنیم:

$firstName = 'Behzad';
$checkIfVariableIsEmpty = empty($firstName);
echo $checkIfVariableIsEmpty;

به عنوان خروجی اسکریپت فوق هیچ چیزی مشاهده نمی‌شود چرا که متغیر مد نظر خالی نیست. در حقیقت اگر متغیر خالی باشد، این فانکشن مقدار true و اگر پر باشد مقدار false را باز می‌گرداند و از آنجا که در مثال فوق متغیر پر است، مقدار false بازگردانده شده که معادل عددی آن برابر با ۰ است که این مقدار هم در خروجی چاپ نخواهد شد. حال اسکریپت فوق را به صورت زیر آپدیت می‌کنیم:

$firstName = '0';
$checkIfVariableIsEmpty = empty($firstName);
echo $checkIfVariableIsEmpty;

به عنوان خروجی اسکریپت فوق داریم:

1

ما مقدار ۰ را برای متغیر خود در نظر گرفته‌ایم و زمانی که آن را به عنوان پارامتر ورودی به فانکشن ()empty پاس می‌دهیم، این فانکشن مقدار ۱ را باز می‌گرداند؛ به عبارت دیگر، این فانکشن به ما اعلام می‌کند که متغیر firstName$ خالی است اما این در حالی است که اینگونه نیست! هشداریک از رفتار‌های عجیب و غریب فانکشن ()empty این است که مقدار ۰ را خالی در نظر می‌گیرد و همین مسئله بسیاری از دولوپرهای تازه‌کار PHP را دچار سردرگمی می‌سازد. در همین راستا، فانکشن ()emtpy راه‌کار خوبی برای چک کردن اینکه یک متغیر آیا Set (مقداردهی) شده است یا خیر نمی‌باشد!

آشنایی با متغیر‌های Super Global
در زبان PHP یکسری متغیرهای از پیش تعریف شده داریم تحت عنوان Super Global که از هر جایی در اسکریپت در دسترس هستند که در جدول زیر به معرفی آنها به همراه عملکردشان پرداخته‌ایم:

توضیحاتنام
حاوی کلیهٔ اطلاعات فرم‌های HTML است که با استفاده از متد GET ارسال می‌شوند.GET_$
حاوی کلیهٔ اطلاعات فرم‌های HTML است که با استفاده از متد POST ارسال می‌شوند.POST_$
حاوی کلیهٔ متغیرهایی که در اسکوپ گلوبال موجود هستند.GLOBALS$
حاوی اطلاعات فایل‌هایی است که قرار است روی سرور آپلود شوند.FILES_$
حاوی ترکیبی از اطلاعات GET ،$_POST_$ و COOKIE_$ است.REQUEST_$
حاوی کوکی‌هایی است که از طرف مرورگر ارسال می‌شوند.COOKIE_$
حاوی اطلاعات ذخیره شده در سِشِن است.SESSION_$
حاوی اطلاعاتی همچون آدرس IP و دیگر اطلاعات مرتبط با سرور است.SERVER_$
حاوی اطلاعات مرتبط با Environment Variables است که برای PHP ارسال می‌شوند.ENV_$

به عنوان مثال، متغیر سوپر گلوبال SERVER_$ دارای چندین Key (کلید) مختلف است که حاوی اطلاعات ارزشمندی برای دولوپرها است که در ادامه بیشتر با آنها آشنا خواهید شد:

echo $_SERVER['SERVER_NAME'];
echo "
";
echo $_SERVER['SERVER_SOFTWARE'];
echo "
";
echo $_SERVER['REQUEST_METHOD'];
echo "
";
echo $_SERVER['REQUEST_TIME'];
echo "
";
echo $_SERVER['DOCUMENT_ROOT'];
echo "
";
echo $_SERVER['HTTP_USER_AGENT'];
echo "
";
echo $_SERVER['SCRIPT_NAME'];

به عنوان خروجی اسکریپت فوق داریم:

localhost
Apache/2.4.27 (Ubuntu)
GET
1513764118
/var/www
Chrome/63.0.3239.108 Safari/537.36
/sokanacademy-php-course/02/variable/index.php

– آشنایی با کلید SERVER_NAME: این کلید نام سروری که اسکریپت مد نظرمان داخل آن در حال اجرا است را باز می‌گرداند.

– آشنایی با کلید SERVER_SOFTWARE: این کلید اطلاعاتی در مورد نرم‌افزاری که اسکریپت‌مان روی آن در حال اجرا است را باز می‌گرداند.

– آشنایی با کلید REQUEST_METHOD: این کلید متدی که اسکریپت با استفاده از آن اجرا شده است را در معرض دید دولوپر می‌گذارد.

– آشنایی با کلید REQUEST_TIME: این کلید زمانی که اسکریپت مد نظر اجرا شده است را نشان می‌دهد.

– آشنایی با کلید DOCUMENT_ROOT: این کلید دایرکتوری روت (اصلی) که اسکریپت داخل آن قرار گرفته است را مشخص می‌سازد.

– آشنایی با کلید HTTP_USER_AGENT: این کلید اطلاعاتی در مورد مرورگری که اسکریپت از طریق آن اجرا شده است را مشخص می‌سازد.

– آشنایی با کلید SCRIPT_NAME: این کلید مسیر و نام اسکریپتی که در حال اجرا است را باز می‌گرداند.

برای کسب اطلاعات بیشتر، به لینک Superglobals در سایت رسمی PHP مراجعه نمایید.

آشنایی با مفهوم Constant در زبان PHP


Constant در لغت به معنای «ثابت» است و همچون متغیر، فضایی در حافظه است که مسئول ذخیره‌سازی چیزی است با این تفاوت که -همان‌طور که از نامش مشخص است- برخلاف متغیرها که مقادیر آنها قابل‌تغییر است، مقدار اولیهٔ کانستنت‌ها را نمی‌توان تغییر داد و به همین دلیل گفته می‌شود که کانستنت‌ها اصطلاحاً Immutable (تغییرناپذیر) هستند. نکتهدر میان دولوپرهای زبان PHP رایج است که نامگذاری کانستنت‌ها را تماماً با حروف بزرگ انجام داده و برای مجزاسازی بخش‌های مختلف نام از Underscore یا همان علامت _ استفاده می‌کنند. گرچه از حروف کوچک هم می‌توان استفاده کرد، اما برای آنکه به راحتی بتوان در طول زمان کانستنت‌ها را تشخیص داد، بهتر آن است که از حروف بزرگ در کل وب اپلیکیشن استفاده کرد.

شیوهٔ نام‌گذاری Constant در زبان PHP
روش نام‌گذاری کانستنت‌ها در این زبان دقیقاً مشابه نامگذاری متغیرها است بدین صورت که:
– نام کانستنت‌ می‌تواند ترکیبی از حروف، اعداد و _ باشد (مثلاً USER_AGENT)
– اولین حرف در نام کانستنت‌ باید یک حرف انگلیسی یا علامت _ باشد (مثلاً 1USER_AGENT مورد قبول نیست؛ البته پس از اولین حرف می‌توان از اعداد استفاده کرد مثلاً USER_1_AGENT).
– نام کانستنت‌‌ها در زبان PHP اصطلاحاً Case-sensitive است؛ به عبارت دیگر، مفسر این زبان به حروف بزرگ و کوچک در ارتباط با کانستنت‌‌ها حساس است (مثلاً از دید مفسر این زبان USER_AGENT با user_agent دو کانستنت مختلف محسوب می‌شوند).
– برای نام‌گذاری کانستنت‌ها از علامت – نمی‌توان استفاده کرد. هشداربه خاطر داشته باشید که برای نام‌گذاری کانستنت‌ها، هرگز از علامت $ استفاده نکنید.

چند نمونه از نام‌های اشتباه برای کانستنت‌ها در PHP عبارتند از:

2CONSTANT_NAME // Using a number at the beginning
CONSTANT-NAME // Using dash
$CONSTANT_NAME // Using a $ sign at the beginning

گرچه می‌توان کانستنتی مثلاً تحت عنوان __NAME__ ایجاد کرد، اما از آنجا که در هستهٔ زبان PHP یکسری کانستنت‌ها داریم که اصطلاحاً Magic Constant نامیده می‌شوند که شیوهٔ نام‌گذاری آنها بدین شکل است (یعنی استفاده از دو علامت __ در ابتدا و دو علامت __ در انتهای نام کانستنت)، توصیه می‌شود که از این شیوه استفاده نشود که اگر در آینده دولوپرهای PHP تصمیم گرفتند مجیک کانستنتی هم‌نام با کانستنت شما در این زبان بگنجانند، با مشکل برخورد نکنید.

آشنایی با روش‌های تعریف  Constant در زبان PHP
به منظور ساخت یک کانستنت در زبان PHP دو راه‌کار مختلف پیش روی ما است اما این در حالی است که این دو روش تفاوت‌هایی هم با یکدیگر دارند.

– استفاده از فانکشن ()define: راه‌کار اول استفاده از فانکشنی است تحت عنوان ()define. به طور مثال داریم:

define("SITE_NAME", "SokanAcademy");
echo SITE_NAME;

به عنوان خروجی داریم:

SokanAcademy

حال اسکریپت فوق را به صورت زیر بازنویسی می‌کنیم:

define("SITE_NAME", "SokanAcademy");
echo site_name;

به عنوان خروجی داریم:

Notice: Use of undefined constant site_name - assumed 'site_name' in /var/www/sokanacademy-php-course/02/02-variable/index.php on line 3

می‌بینیم که مفسر پی‌اچ‌پی به ما هشدار می‌دهد که چنین کانستنتی -site_name- قبلاً تعریف نشده است. پیش از این گفتیم که کانستنت‌ها همچون متغیرها، اصطلاحاً Case-sensitve هستند. حال اگر بخواهیم آنها را اصطلاحاً Case-insensitive کنیم به صورت زیر عمل می‌کنیم:

define("SITE_NAME", "SokanAcademy", true);
echo site_name;

به عنوان خروجی داریم:

SokanAcademy

در واقع، کاری که پارامتر سوم انجام می‌دهد (که به صورت پیش‌فرض معادل با false است) این است که قابلیت Case-insensitive را برای کانستنت ما فعال می‌سازد. به عبارت دیگر، از این پس می‌توانیم برای دستیابی به مقدار SokanAcademy از نام‌هایی همچون SITE_NAME ،site_name ،Site_Name و یا sITe_NamE استفاده کنیم اما به خاطر داشته باشید که علامت _ همواره می‌بایست سر جایش باقی بماند که در غیر این صورت با ارور مواجه خواهیم شد.

همان‌طور که در مثال فوق مشاهده می‌شود، از یک استرینگ به عنوان Value (مقدار) کانستنت خود استفاده کرده‌ایم. در زبان PHP از دیتاتایپ‌های مختلفی می‌توان به عنوان مقدار کانستنت‌ها استفاده کرد که عبارتند از integer ،float ،string ،boolean ،null و array (لازم به ذکر است که آرایه‌ها از نسخهٔ ۷ به بعد اضافه شده‌اند). هشداراگرچه از دیتاتایپ Resource که پیش از این با مفهومش در زبان PHP آشنا شدید می‌توان به عنوان مقدار کانستنت‌ها استفاده کرد، اما این کار اصلاً توصیه نمی‌شود چرا که در برخی مواقع نتایج غیرمنتظره‌ای مشاهده خواهد شد.

گفتیم که در نسخهٔ ۷ زبان PHP می‌توان از آرایه‌ها به عنوان مقدار کانستنت استفاده کرد. برای روشن‌تر شدن این مطلب، به اسکریپت زیر توجه کنید:

define('ANIMALS', array('dog','cat','bird'));
echo ANIMALS;

به عنوان خروجی اسکریپت فوق داریم:

Notice: Array to string conversion in /var/www/sokanacademy-php-course/02/02-variable/index.php on line 3

می‌بینیم که ارور دریافت کردیم. علت این مسئله آن است که دستور echo را نمی‌توان برای چاپ کردن یک آرایه مورد استفاده قرار داد. برای رفع این مشکل، یا می‌توان از فانکشن ()print_r و یا ()var_dump استفاده کرد:

define('ANIMALS', array('dog','cat','bird'));
print_r(ANIMALS); // or var_dump(ANIMALS)

حال به عنوان خروجی داریم:

Array
(
    [0] => dog
    [1] => cat
    [2] => bird
)

همچنین در نظر داشته باشید که برای تعریف کردن آرایه‌ها در زبان PHP از روش دیگری نیز می‌توان استفاده کرد:

define('ANIMALS', ['dog','cat','bird']);
var_dump(ANIMALS);

همان‌طور که ملاحظه می‌شود، به جای دستور ()array از علائم [ ] استفاده کرده‌ایم که به نظر خلاصه‌تر می‌آید.

– استفاده از کلیدواژهٔ const: با استفاده از const هم به سادگی می‌توان دست به ایجاد یک کانستنت زد. به عنوان مثال داریم:

const SITE_NAME = "SokanAcademy";
echo SITE_NAME;

به عنوان خروجی هم داریم:

SokanAcademy

می‌بینیم که عملکرد کاملاً مشابه است. اساسی‌ترین تفاوتی‌هایی که مابین کلیدواژهٔ const و فانکشن ()define برای ایجاد کانسنت‌ها در زبان PHP وجود دارد این است که const همواره Case-sensitive است. به عبارت دیگر، برخلاف فانکشن ()define که دیدیم پارامتر سوم‌اش این امکان را در اختیار ما می‌گذارد تا کانستنت خود را Case-insensitive کنیم.

همچنین گفته می‌شود که const در حین Compile-time ساخته می‌شود اما ()define در Run-time و همین منجر می‌گردد که کانستنت‌های ساخته شده با const کمی سریع‌تر باشند. باتوجه به اینکه const در زمان کامپایل ساخته می‌شود، مسلماً از آن همراه با دستورات شرطی نمی‌توان استفاده کرد:

if (!defined('SITE_NAME')) {
      const SITE_NAME = "SokanAcademy";
}
echo SITE_NAME;

به عنوان خروجی داریم:

Parse error: syntax error, unexpected 'const' (T_CONST) in /var/www/sokanacademy-php-course/02/02-variable/index.php on line

حال کد فوق را به صورت زیر ریفکتور می‌کنیم:

if (!defined('SITE_NAME')) {
    define('SITE_NAME', 'SokanAcademy');
}
echo SITE_NAME;

به عنوان خروجی داریم:

SokanAcademy

در تفسیر رفتار PHP در دو مورد فوق بایستی بگوییم که در اسکریپت اول، چون const در حین فرایند کامپایل ایجاد می‌گردد اما این در حالی است که دستور شرطی if در زمان Run-time بررسی می‌شود و مسلماً دیگر برای ساخت const دیر شده است (زیرا Compile پیش از Run صورت می‌گیرد)، با ارور مواجه می‌شویم اما در اسکریپت دوم به خاطر اینکه فانکشن ()define دقیقاً همان زمانی که دستور if بررسی می‌شود می‌تواند ساخته شود، بدون هیچ مشکلی برنامه به پیش خواهد رفت (البته تفاوت‌های const و ()define مراتب بیش از آن چیزی است که در بالا گفته شد که مناسب دولوپرهای حرفه‌ای PHP است).

نکته‌‌ای که در ارتباط با کانستنت‌ها می‌بایست مد نظر قرار داد این است که برخلاف متغیرها که محدود به Scope (اسکوپ یا حوزه) خاصی هستند، کانستنت‌ها اصطلاحاً Global (سراسری) بوده و فرقی نمی‌کند که کجا آنها را تعریف کنید، چرا که در تمامی اسکریپت شما قابل دستیابی می‌باشند.

نکتهٔ دیگری که در مورد کانستنت‌ها وجود دارد این است که از یک متغیر هرگز نمی‌توان به عنوان مقدار یک کانستنت استفاده کرد:

$siteName = 'SokanAcademy';
const SITE_NAME = $siteName;
echo SITE_NAME;

به عنوان خروجی اسکریپت فوق داریم:

Fatal error: Constant expression contains invalid operations in /var/www/sokanacademy-php-course/index.php on line 3

می‌بینیم که با چنین کاری اروری از جنس Fatal (وَخیم) دریافت می‌کنیم.

آشنایی با فانکشن‌های ()defined و ()get_defined_constants
دو فانکشن در زبان PHP وجود دارند که مرتبط با کانستنت‌ها هستند که آگاهی از عملکرد آنها خالی از لطف نیست (البته فانکشن‌های دیگری هم وجود دارند که خیلی کاربردی نیستند). پیش از این با فانکشن ()defined همراه با دستورات شرطی آشنا شدیم که این وظیفه را دارا است تا مشخص سازد که آیا کانستنتی که به عنوان پارامتر ورودی‌اش پاس داده‌ایم وجود دارد یا خیر. به عنوان مثال داریم:

if (defined('TEST')) {
    echo TEST;
}

در تفسیر دستور شرطی فوق بایستی بگوییم که چک کرده‌ایم ببینیم که آیا کانستنتی با نام TEST وجود دارد یا خیر؛ اگر وجود داشت که با دستور echo مقدار آن را چاپ خواهیم کرد و در غیر این صورت، هیچ اتفاقی رخ نخواهد داد.

فانکشن ()get_defined_constants هم همان‌طور که از نام‌اش پیدا است، این وظیفه را دارا است تا کلیهٔ کانستنت‌هایی که تاکنون در اسکریپت تعریف شده‌اند را در معرض دیدمان قرار دهد. اگر این فانکشن را به صورت (get_defined_constants(true مورد استفاده قرار دهیم، یعنی true را به عنوان پارامتر ورودی‌اش در نظر بگیریم، کلیهٔ‌ کانستنت‌ها به صورت دسته‌بندی شده در معرض دیدمان قرار خواهند گرفت.

آشنایی با کانستنت‌های به اصطلاح Predefined
در زبان PHP یکسری کانسنت‌های Predefined (از پیش تعریف شده) وجود دارند که اطلاعات خوبی در اختیار دولوپر قرار می‌دهند. به عنوان مثال،‌ برای آگاهی یافتن از نسخهٔ PHP نصب شده روی سیستم، می‌توان از کانستنت زیر استفاده کرد:

echo PHP_VERSION;

به عنوان خروجی داریم:

7.0.22-0ubuntu0.17.04.1

می‌بینیم که علاوه بر نسخهٔ PHP نصب شده روی سیستم‌عامل، نسخهٔ خود سیستم‌عامل را هم در اختیار ما قرار می‌دهد. به منظور آشنایی با کلیهٔ کانسنت‌های از پیش تعریف شده در زبان PHP می‌توانید به لینک Predefined Constants در سایت رسمی PHP مراجعه نمایید.

آشنایی با کانستنت‌های به اصطلاح Magic (جادویی) در PHP
در زبان PHP تعدادی کانستنت‌ از پیش تعریف شده وجود دارند که اصطلاحاً Magic (جادویی) نامیده می‌شوند که عبارتند از:

کاربردنام کانستنت جادویی
خطی از اسکریپت که در آن قرار داریم را نشان می‌دهد.__LINE__
مسیر کامل و نام فایلی که در حال اجرا است را نشان می‌دهد.__FILE__
دایرکتوری که فایل مد نظر داخل آن قرار دارد را نشان می‌دهد.__DIR__
نام فانکشنی که در حال اجرا است را نشان می‌دهد.__FUNCTION__
نام کلاسی که داخل آن قرار داریم را نشان می‌دهد.__CLASS__
نام تِریتی که داخل آن قرار داریم را نشان می‌دهد.__TRAIT__
نام متدی که داخل آن قرار داریم را نشان می‌دهد.__METHOD__
نِیم‌اسپیسی که داخل آن قرار داریم را نشان می‌دهد.__NAMESPACE__

به منظور درک ماهیت کانستنت‌های جادویی، چند مثال می‌زنیم:

<?php
echo __LINE__;

به عنوان خروجی داریم:

2

و یا:

<?php
echo __FILE__;

به عنوان خروجی داریم:

/var/www/sokanacademy-php-course/02/02-variable/index.php

به خاطر داشته باشیم که از کانستنت‌های به اصطلاح Magic (جادویی) می‌توان به عنوان مقدار یک کانستنت نیز استفاده کرد:

const DIRECTORY = __DIR__;
echo DIRECTORY;

به عنوان خروجی اسکریپت فوق داریم:

/var/www/sokanacademy-php-course/02

به خاطر داشته باشیدیادآوری این نکته ضروری است که بسته به جایی که از کانستنت‌های جادویی استفاده می‌کنیم، مقادیر آنها می‌توانند متفاوتباشند.

درآمدی بر اپراتورها در زبان PHP


پیش از این با مفهوم Data Type (دیتاتایپ یا نوع داده) آشنا شدیم. در اکثر زبان‌های برنامه‌نویسی من‌جمله PHP ما این امکان را داریم تا روی دیتاتایپ‌های مختلف یکسری عملیات خاص انجام دهیم که بسیاری از آنها به صورت Built-in (از پیش تعریف شده) در تمامی زبان‌های برنامه‌نویسی تعبیه شده‌اند. حال برای آنکه بتوانیم دست به انجام این عملیات بزنیم، نیاز داریم تا با مفهوم Operator (اپراتور یا عَملگر) آشنا شویم.

در واقع، اپراتورها یکسری دستورات در زبان‌های برنامه‌نویسی هستند که این امکان را در اختیار دولوپر قرار می‌دهند تا به سادگی بتوانند یکسری عملیات رایج -همچون ضرب، تقسیم، جمع، تفریق و غیره- را روی داده‌های مختلف پیاده کنند.

آشنایی با مفهوم Assignment Operator در زبان PHP
پیش از این به کرات از این Assignment Operator (عملگر انتصاب) در حین کار با متغیرها استفاده کرده‌ایم. به عنوان مثال داریم:

<?php
$carName = 'Lexus';

عملگر انتصاب یا همان علامت = مقداری را به یک متغیر اختصاص می‌دهد به طوری که از این پس هر کجا که از متغیر carName$ استفاده کنیم، مقدار استرینگ Lexux را در اختیار خواهیم داشت. هشدارهمواره به خاطر داشته باشید که برخلاف ریاضیات که علامت = نشانگر تساوی دو چیز است، در کدنویسی این علامت صرفاً برای اختصاص دادن Value (مقدار) مورد استفاده قرار می‌گیرد و چنانچه بخواهیم تساوی را نشان دهیم، می‌بایست از علائم == و === استفاده کنیم که در آینده بیشتر در این باره بحث خواهیم کرد.

آشنایی با مفهوم اپراتورهای به اصطلاح Arithmetic در زبان PHP
امروزه در بسیاری از وب اپلیکیشن‌ها همچون فروشگاه‌های آنلاین، سی‌آر‌ام و غیره نیاز است تا یکسری محاسبات -از محاسبات ابتدایی تا محاسبات پیچیده- را در اختیار کاربران قرار داد و اینجا است که بایستی با اپراتورهای اصطلاحاً Arithmetic (محاسباتی یا ریاضیاتی) آشنا شویم. این اپراتورها عبارتند از:

اپراتورکاربرد
+از این اپراتور جهت جمع کردن دو عملوند استفاده می‌شود.
از این اپراتور جهت کسر کردن دو عملوند استفاده می‌شود.
*از این اپراتور جهت ضرب کردن دو عملوند استفاده می‌شود.
/از این اپراتور جهت تقسیم کردن دو عملوند استفاده می‌شود.
%از این اپراتور برای نشان دادن باقیماندهٔ تقسیم دو عملوند بر یکدیگر استفاده می‌شود.
**از این اپراتور برای به توان رساندن عملوند سمت چپ به عملوند سمت راست استفاده می‌شود.

Operant (عملوند) به هر چیزی که در قسمت راست/چپ یک اپراتور قرار گیرد گفته می‌شود. حال به منظور درک بهتر اپراتورهای محاسباتی فوق، مثال‌های زیر را مد نظر قرار دهید:

<?php
$variableOne = 10;
$variableTwo = 3;

$addition = $variableOne + $variableTwo;
$subtraction = $variableOne - $variableTwo;
$multiply = $variableOne * $variableTwo;
$division = $variableOne / $variableTwo;
$modulus = $variableOne % $variableTwo;
$power = $variableOne ** $variableTwo;

var_dump($addition, $subtraction, $multiply, $division, $modulus, $power);

به عنوان خروجی اسکریپت فوق داریم:

int(13)
int(7)
int(13)
float(3.3333333333333)
int(1)
int(1000)

در تفسیر اسکریپت فوق بایستی بگوییم که در خط پنجم با استفاده از اپراتور +  حاصل‌جمع متغیرهای variableOne$ و variableTwo$ را به دست آورد‌ه‌ایم؛ در ادامه با استفاده از اپراتور – این دو متغیر را از یکدیگر کسر کرده‌ایم؛ اپراتور * هم این وظیفه را دارا است تا حاصل‌ضرب عملوندها را به دست آورد و علامت / هم به منظور تقسیم دو عملوند بر یکدیگر استفاده می‌شود و از علامت % هم استفاده کرده تا باقیماندهٔ حاصل تقسیم دو عملوند بر یکدیگر را به دست آوریم و در نهایت هم از اپراتور ** استفاده کرده تا عملوند سمت چپ را به توان عملوند سمت راست برسانیم.

در ارتباط با عملگرهای ضرب و تقسیم حتماً بایستی این نکته را مد نظر داشت که فقط و فقط از علائم * و / به ترتیب برای به دست آوردن حاصل‌ضرب و تقسیم دو عملوند استفاده نمود. به عنوان مثال نقض این قانون داریم:

$multiply = $variableOn × $variableTwo;
$division = $variableOne ÷ $variableTwo;

همان‌طور که مشاهده می‌شود، اگر برای این نوع عملیات از علائم × و ÷ استفاده کنیم، با ارور مواجه خواهیم شد.

آشنایی با نحوهٔ ادغام اپراتور Assignment با اپراتورهای Arithmetic
پیش از این با Assignment Operator (اپراتور انتصاب) آشنا شدیم. لازم به ذکر است که به منظور خلاصه‌نویسی کد، می‌توان اپراتور انتصاب را با اپراتورهای محاسباتی ادغام نمود:

<?php
$variableOne = 10;
$variableTwo = 3;

$variableOne += $variableTwo;
echo $variableOne;

به عنوان خروجی این اسکریپت عدد ۱۳ چاپ خواهد شد. در واقع کاری که در اسکریپت فوق انجام داده‌ایم این است که پس از نام متغیر variableOne$ علائم =+ را پشت سر هم نوشته سپس نام عملوند بعدی (variableTwo$) را نوشته‌ایم. به عبارت دیگر، به مفسر PHP دستور داده‌ایم که مقدار متغیر variableOne$ را در نظر گرفته‌ سپس مقدار متغیر variableTwo$ را با آن جمع کند و حاصل‌جمع را مجدد در متغیر variableOne$ ذخیره سازد. به همین منوال، برای عمل کسر داریم:

<?php
$variableOne = 10;
$variableTwo = 3;

$variableOne -= $variableTwo;
echo $variableOne;

 برای به دست آوردن حاصل‌ضرب داریم:

<?php
$variableOne = 10;
$variableTwo = 3;

$variableOne *= $variableTwo;
echo $variableOne;

برای به دست آوردن حاصل تقسیم داریم:

<?php
$variableOne = 10;
$variableTwo = 3;

$variableOne /= $variableTwo;
echo $variableOne;

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

<?php
$variableOne = 10;
$variableTwo = 3;

$variableOne ٪= $variableTwo; // We have an error here
echo $variableOne;

به عنوان خروجی اسکریپت فوق داریم:

Parse error: syntax error, unexpected '٪' (T_STRING) in /var/www/sokanacademy-php-course/index.php on line 5

مشکلی که در این اسکریپت وجود دارد این است که ما به اشتباه به جای علامت % از علامت ٪ استفاده کرده‌ایم که با کیبورد فارسی تایپ شده است! اکنون اسکریپت فوق را به صورت زیر تصحیح می‌کنیم:

<?php
$variableOne = 10;
$variableTwo = 3;

$variableOne %= $variableTwo;
echo $variableOne;

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

<?php
$variableOne = 2;
$variableTwo = 3;
echo $variableOne ** $variableTwo;

به عنوان خروجی اسکریپت فوق با عدد ۸ مواجه خواهیم شد چرا که در آن عدد ۲ را به توان ۳ رسانده‌ایم؛ به عبارت دیگر، عدد ۲ را ۳ بار در خودش ضرب کرده‌ایم (۲×۲×۲).

آشنایی با Concatenation Operator در زبان PHP
پیش از این دیدیم که با استفاده از علامت . به چه شکل می‌توان استرینگ‌ها را به یکدیگر چسباند؛ به عنوان مثال داریم:

<?php
$variableOne = 'First String ';
$variableTwo = 'Second String';
$total = $variableOne . $variableTwo;
echo $total;

به عنوان خروجی اسکریپت فوق داریم:

First String Second String

حال می‌توان اسکریپت فوق را به صورت خلاصه بدین شکل نوشت:

<?php
$variableOne = 'First String ';
$variableTwo = 'Second String';
$variableOne .= $variableTwo;
echo $variableOne;

همان‌طور که پیش از این دیدیم، با قرار دادن علامت . قبل از علامت = این دستور را به مفسر PHP داده‌ایم تا مقدار متغیر variableOne$ را در نظر گرفته سپس مقدار متغیر variableTwo$ را به آن اصطلاحاً Concat کند یا بچسباند و در نهایت مقدار اولیهٔ متغیر variableOne$ را آپدیت کرده و مقدار متغیرهای variableOne$ و variableTwo$ را در آن ذخیره سازد.

آشنایی با اپراتورهای Increment و Decrement در زبان PHP
گاهی‌اوقات ما نیاز داریم تا به متغیری یک واحد اضافه کرده و یا یک واحد از آن کسر کنیم که در چنین مواردی به سادگی می‌توان از اپراتورهای به اصطلاح Increment و Decrement استفاده کرد که به ترتیب به معنی «افزایش» و «کاهش» هستند:

<?php
$variableOne = 100;

echo $variableOne;
echo "<br>";

$variableOne++;
echo $variableOne;
echo "<br>";

$variableOne--;
echo $variableOne;

به عنوان خروجی اسکریپت فوق داریم:

100
101
100

در تفسر اسکریپت فوق بایستی بگوییم که متغیری ایجاد کرده‌ایم تحت عنوان variableOne$ با مقدار اولیهٔ ۱۰۰. با قرار دادن علائم ++ پس از نام این متغیر و چاپ کردن خروجی، می‌بینیم که مقدار اولیهٔ ۱۰۰ یک واحد افزایش یافته و به عدد ۱۰۱ تبدیل شده است؛ به همین منوال،‌ در آخر هم علائم — را پس از نام متغیر قرار داده و می‌بینیم که پس از یک واحد کم شدن از مقدار ۱۰۱، مجدد مقدار متغیر به عدد ۱۰۰ آپدیت می‌شود.

اهمیت محل قرارگیری اپراتورهای ++ و — در کنار متغیرها
اینکه اپراتورهای ++ و — قبل یا بعد از یک متغیر قرار گیرند از اهمیت بسزایی برخوردار است. برای روشن‌تر شدن این مسئله، مثال زیر را در نظر می‌گیریم:

<?php
$variable = 100;
echo $variable++ + 10;
echo "<br>";
echo $variable;

به عنوان خروجی اسکریپت فوق داریم:

110
101

در تفسیر رفتار فوق از مفسر PHP بایستی بگوییم که در خط سوم مفسر PHP ابتدا متغیر variable$ را با عدد ۱۰ جمع کرده سپس به دلیل قرار گرفتن علائم ++، یک واحد به آن اضافه می‌کند و به همین دلیل در دستور echo آخر می‌بینیم که مقدار پیش‌فرض این متغیر که ۱۰۰ بود، یک واحد افزایش یافته و به ۱۰۱ مبدل شده‌ است. حال شرایط زیر را در نظر می‌گیریم:

<?php
$variable = 100;
echo ++$variable + 10;
echo "<br>";
echo $variable;

به عنوان خروجی داریم:

111
101

در حقیقت، این بار مفسر PHP به دلیل اینکه علائم ++ قبل از متغیر آمده‌اند، ابتدا یک واحد به مقدار پیش‌فرض متغیر variable$ اضافه کرده که می‌شود ۱۰۱ سپس آن را با عدد ۱۰ جمع کرده است. این قانون در مورد علائم — هم صادق است:

<?php
$variable = 100;
echo $variable-- + 10; // Or --$variable
echo "<br>";
echo $variable;

به عنوان خروجی داریم:

110
99

می‌بینیم که در اسکریپت فوق ابتدا متغیر variable$ را با عدد ۱۰ جمع کرده سپس یک واحد از آن کم کرده‌ایم. نکتهدر نظر داشته باشیم که علائم ++ و یا — را هم‌ می‌توان بلافاصله پس از متغیر نوشت و هم با قرار دادن یک فاصله نوشت چرا که زبان PHP به فاصله حساس نیست. به طور مثال، هر دو حالت ++variable$ و ++ variable$ عملکرد یکسانی دارند.

آشنایی با اپراتورهای Comparison در زبان PHP
نتیجهٔ اپراتورهای Comparison (مقایسه) همواره یا true است یا false و به طور کلی به منظور مقایسهٔ دو مقدار مورد استفاده قرار می‌گیرند که این اپراتورها عبارتند از:

اپراتورتوضیحات
==برابری را نشان می‌دهد.
===برابری و دیتاتایپ یکسان را نشان می‌دهد.
=! یا <>نابرابری را نشان می‌دهد.
==!نابرابری و عدم برخورداری از دیتاتایپ یکسان را نشان می‌دهد.
<بزرگ‌تر بودن را نشان می‌دهد.
>کوچک‌تر بودن را نشان می‌دهد.
=<بزرگ‌تر یا مساوی را نشان می‌دهد.
=>کوچک‌تر یا مساوی را نشان می‌دهد.
<=>این اپراتور که تحت عنوان Combined Comparison یا Spaceship (سفینه) شناخته می‌شود، یک اپراتور مقایسه‌ای سه‌حالتی است. به عبارت دیگر، حالات «بزرگ‌تر از»، «کوچک‌تر از» و «مساوی با» را مابین عملوندها چک می‌کند. 

از این اپراتورها به کرات در دستورات شرطی (If/Else) استفاده می‌شود که در فصول آتی به تفصیل در مورد آنها بحث خواهیم کرد اما برای آنکه عملکرد آنها را متوجه شوید، در ادامه چند مثال از کاربرد آنها خواهیم زد:

<?php
$variableOne = 2;
$variableTwo = 3;
$variableThree = '3';
var_dump($variableOne == $variableTwo);

خروجی اسکریپت فوق (bool(false است زیرا مقادیر این دو متغیر اصلاً با یکدیگر برابر نیستند اما در ادامه قصد داریم ببینیم که اگر مقادیر متغیرهای variableTwo$ با variableThree$ را با یکدیگر مقایسه کنیم چه اتفاقی خواهد افتاد:

<?php
$variableOne = 2;
$variableTwo = 3;
$variableThree = '3';
var_dump($variableTwo == $variableThree);

می‌بینیم که مقدار (bool(true بازگردانده می‌شود. گرچه مقدار متغیر variableTwo$ یک عدد صحیح است (۳) و مقدار متغیر variableThree$ یک استرینگ یا رشته به صورت ‘۳’ است، اما مفسر PHP هر دو را یکسان تلقی می‌کند فلذا وقتی که با استفاده از اپراتور تساوی == آنها را می‌سنجیم، مقدار true بازگردانده می‌شود. حال اگر بخواهیم دیتاتایپ (نوع داده) را هم در این فرایند مد نظر قرار دهیم،‌ می‌توانیم از اپراتور === استفاده کنیم و اینجا است که تفاوت اپراتورهای == و === به خوبی مشخص خواهد شد:

<?php
$variableOne = 2;
$variableTwo = 3;
$variableThree = '3';
var_dump($variableTwo === $variableThree);

خروجی اسکریپت فوق (bool(false است زیرا مقادیر این دو متغیر اصلاً با یکدیگر برابر نیست؛ به عبارت دیگر، یکی از نوع عدد صحیح است و دیگری از نوع استرینگ (رشته). اکنون ببینیم که کاربرد اپراتورهای =! و ==! چگونه است:

<?php
$variableOne = 2;
$variableTwo = 3;
$variableThree = '3';
var_dump($variableOne != $variableTwo); // We can also use <> instead of !=

خروجی اسکریپت فوق (bool(true است زیرا همان‌طور که پیش از این اشاره کردیم، اپراتور =! مقادیر عملوندها را چک کرده و چنانچه آنها برابر نباشند، مقدار true را باز می‌گرداند (در این مثال هم مقادیر ۲ و ۳ با هم برابر نیستند). در ادامه قصد داریم کاربرد اپراتور ==! را مشاهده کنیم:

<?php
$variableOne = 2;
$variableTwo = 3;
$variableThree = '3';
var_dump($variableTwo !== $variableThree);

خروجی اسکریپت فوق (bool(true است زیرا اگرچه که مقادیر متغیرهای variableTwo$ و variableThree$ به نوعی یکسان است، اما گفتیم که اپراتور ==! علاوه بر چک کردن مقادیر، دیتاتایپ را هم چک می‌کند و اگر آنها باهم برابر نباشند، مقدار true را برمی‌گرداند و از آنجا که دیتاتایپ یکی عدد صحیح و دیگری استرینگ است، مقدار true بازگردانده شده است.

اپراتورهای < و > هم ماهیت‌شان کاملاً مشخص است به طوری که بزرگ‌تری/کوچکتری را چک می‌کنند. به عنوان مثال داریم:

<?php
$variableOne = 2;
$variableTwo = 3;
$variableThree = '3';
var_dump($variableTwo > $variableOne);

خروجی اسکریپت فوق (bool(true است زیرا نیاز به توضیح نیست که مقدار متغیر variableTwo$ بزرگ‌‌تر از variableOne$ است (در غیر این صورت، مقدار false بازگردانده خواهد شد). همچنین اپراتورهای =< (بزرگ‌تر یا مساوی) و => (کوچک‌تر یا مساوی) هم به صورت زیر به کار گرفته خواهند شد:

<?php
$variableOne = 2;
$variableTwo = 3;
$variableThree = '3';
var_dump($variableTwo >= $variableOne);

خروجی اسکریپت فوق (bool(true است زیرا مقدار متغیر variableTwo$ که برابر با ۳ است، بزرگ‌‌تر یا مساوی با مقدار متغیر variableOne$ است که برابر با ۲ می‌باشد. همچنین داریم:

<?php
$variableOne = 2;
$variableTwo = 3;
$variableThree = '3';
var_dump($variableTwo <= $variableThree);

مجدداً خروجی اسکریپت فوق (bool(true است زیرا مقدار متغیر variableTwo$ که برابر با ۳ است، کوچک‌تر یا مساوی با مقدار متغیر variableThree$ است که برابر با ‘3’ می‌باشد.

در نهایت به اپراتور Spaceship یا <=> می‌رسیم که در نسخهٔ ۷ زبان برنامه‌نویسی PHP در اختیار دولوپرها قرار گرفته است. به طور کلی، این اپراتور اگر عملوند سمت چپ کوچک‌تر باشد مقدار ۱-، اگر مقادیر برابر باشند مقدار ۰ و اگر عملوند سمت چپ بزرگ‌تر باشد مقدار ۱ را باز می‌گرداند. به عنوان مثال داریم:

<?php
var_dump(1 <=> 2);
var_dump(2 <=> 2);
var_dump(2 <=> 1);

به عنوان خروجی اسکریپت فوق داریم:

int(-1)
int(0)
int(1)

می‌بینیم با توجه به اینکه در اولین ()var_dump مقدار عملوند سمت چپ کوچک‌تر از مقدار عملوند سمت راست است، مقدار 1-، در دومین ()var_dump باتوجه به اینکه مقدار هر دو طرف معادله برابر است مقدار ۰ و در نهایت هم در سومین ()var_dump باتوجه به اینکه عدد ۲ (عملوند سمت چپ) از عدد ۱ (عملوند سمت راست) بزرگ‌تر است، مقدار ۱ باز گردانده شده است. در ارتباط با استرینگ‌ها نیز می‌توان از اپراتور <=> به صورت زیر استفاده نمود:

<?php
var_dump("x" <=> "x");
var_dump("x" <=> "y");
var_dump("y" <=> "x");

به عنوان خروجی اسکریپت فوق داریم:

int(0)
int(-1)
int(1)

در حین کار با استرینگ‌ها، عدد اختصاص یافته به کاراکترها در سیستم کدگذاری ASCII که پیش از این با آن آشنا شدید مبنا قرار داده می‌شود. در همین راستا، باتوجه به اینکه کد حرف x با کد حرف x در اولین ()var_dump یکسان است، مقدار ۰ بازگردانده شده است؛ در ()var_dump دوم باتوجه به اینکه کد حرف x که برابر با ۱۲۰ است از کد حرف y که برابر با ۱۲۱ است کوچک‌تر است، مقدار 1- بازگردانده شده و در نهایت در ()var_dump سوم باتوجه به اینکه مقدار عملوند سمت چپ (کد حرف y) از مقدار عملوند سمت راست (کد حرف x) بزرگ‌تر است، مقدار ۱ بازگردانده شده است.

آشنایی با اپراتورهای Logical در PHP
عملگرهای Logical (منطقی) به منظور ترکیب چندین Condition (شرط) در کنار یکدیگر مورد استفاده قرار می‌گیرند:

اپراتورتوضیحات
and یا &&این اپراتور به معنی «و» است و چنانچه دو طرف آن true باشد، مقدار true بازگردانده خواهد شد.
or یا ||این اپراتور به معنی «یا» است و چنانچه یکی از عملوندهای راست یا چپ این اپراتور true باشد، مقدار true بازگردانده خواهد شد.
xor یا ^در صورتی که یکی از عملوندها true باشد (نه هر دوی آنها)، این اپراتور مقدار true را باز خواهد گرداند.
!این اپراتور مقدار true را باز خواهد گرداند چنانچه عملوند قرار گرفته پس از آن true نباشد!

به منظور درک بهتر اپراتورهای منطقی در زبان PHP، مثال‌های زیر را در نظر می‌گیریم:

<?php
$variableOne = true;
$variableTwo = false;
var_dump($variableOne and $variableTwo); // Alternatively we can use AND, And, &&
var_dump($variableOne or $variableTwo); // Alternatively we can use OR, Or, ||
var_dump($variableOne xor $variableTwo); // Alternatively we can use XOR, Xor
var_dump(! $variableTwo);

ابتدا به مشاهدهٔ خروجی اسکریپت فوق پرداخته، سپس به تفسیر کد می‌پردازیم:

bool(false)
bool(true)
bool(true)
bool(true)

همان‌طور که مشاهده می‌شود، مقدار اولین ()var_dump برابر با (bool(false است و دلیل این مسئله هم آن است که اپراتور منطقی and به معنی «و» چک می‌کند ببیند که آیا هر دو عملوند (متغیرهای راست و چپ) دارای مقدار true است یا خیر که اگر این‌گونه بود، مقدار true را باز می‌گرداند. در واقع، از آنجا که در این مثال مقادیر یکی true است و دیگری false، پس اپراتور and هم به درستی مقدار false را بازگردانده است.

در ()var_dump دوم از اپراتور or به معنی «یا» استفاده کرده‌ایم که این وظیفه را دارا است که اگر یکی از عملوندها مقدار true داشت، مقدار true را باز گرداند و در این مثال هم می‌بینیم که به درستی مقدار true بازگردانده شده است چرا که مقدار یکی از متغیرها true و دیگری false است.

در ()var_dump سوم هم که می‌بینیم مقدار (bool(true بازگردانده شده است زیرا اپراتور xor در صورتی که یکی از عملوندها true باشد (نه هر دوی آنها)، مقدار true را باز خواهد گرداند.

در نهایت هم کاربرد اپراتور ! که معادل انگلیسی آن می‌شود Not به معنی «نَه» را می‌بینیم. کاربرد این اپراتور بدین شکل است که این اپراتور مقدار true را باز خواهد گرداند چنانچه عملوند قرار گرفته پس از آن true نباشد. در همین راستا، باتوجه به اینکه مقدار متغیر variableTwo$ که حاوی مقدار false است را پس از علامت ! قرار داده‌ایم، می‌بینیم که مقدار (bool(true بازگردانده شده است. به عبارت دیگر، گفته‌ایم که اگر مقدار متغیر variableTwo$ برابر با true نبود (که این‌گونه هم هست)، مقدار true بازگردانده شود. نکتهلازم به ذکر است که علامت ^ در انگلیسی Caret یا Up Arrow Head گفته می‌شود.

مسئلهٔ بسیار مهمی در ارتباط با اپراتورهای منطقی وجود دارد و آن هم تفاوت رفتار اپراتورهای and و or با معادل‌‌های سمبلیک && و || است. برای روشن‌تر شدن این مسئله، مثال زیر را در نظر بگیرید:

<?php
$thisIsTrue = true;
$thisIsFalse = false;
$result = $thisIsTrue and $thisIsFalse;
var_dump($result);

به عنوان خروجی اسکریپت فوق داریم:

bool(true)

حال کدهای فوق را به صورت زیر تغییر می‌دهیم:

<?php
$thisIsTrue = true;
$thisIsFalse = false;
$result = $thisIsTrue && $thisIsFalse;
var_dump($result);

در واقع، تنها کاری که کرده‌ایم این است که اپراتور and را با معادلش که && است جایگزین کرده‌ایم. حال مجدد اسکریپت را اجرا می‌کنیم:

bool(false)

می‌بینیم که این بار در کمال تعجب، مقدار false بازگردانده می‌شود! در تفسیر این رفتار در ظاهر عجیب و غریب مفسر PHP اما در باطن کاملاً منطقی، بایستی بگوییم که Precedence (اولویت) اپراتورهای and و && با یکدیگر کاملاً متفاوت است (برای درک بهتر این موضوع،‌ به جدولی که در ادامه آمده توجه نمایید).

در واقع، در مثال اول که از اپراتور and استفاده کردیم، از آنجا که اپراتور = اولویت بیشتری از اپراتور and دارا است، لذا ابتدا به ساکن مقدار متغیر result$ برابر با مقدار thisIsTrue$ که true است قرار داده شده و در ()var_dump هم این مقدار چاپ شده است اما در مثال دوم که از اپراتور && استفاده کرده‌ایم، اولویت این اپراتور نسبت به اپراتور = بیشتر است، لذا کد به درستی کار می‌کند. برای رفع این مشکل، یا می‌توان از اپراتور && استفاده کرد و یا کدهای فوق را به صورت زیر بازنویسی کرد:

<?php
$thisIsTrue = true;
$thisIsFalse = false;
$result = ($thisIsTrue and $thisIsFalse);
var_dump($result);

می‌بینیم که با استفاده پرانتز،‌ اولویت اپراتور and را نسبت به = که به صورت پیش‌فرض کمتر است، بیشتر نمودیم و نتیجهٔ قابل‌ انتظار مشاهده می‌شود.به خاطر داشته باشیدباتوجه به چنین رفتاری، همواره توصیه می‌شود که از اپراتورهای && و || به ترتیب به جای and و or استفاده نمایید.

به منظور درک بهتر اپراتورهای منطقی، مثال زیر را مد نظر قرار می‌دهیم:

<?php
$sheIsBeautiful = true;
$sheIsSlim = false;
$sheIs24YearsOld = true;
$sheHasBA = true;
$sheIsRich = false;

var_dump($sheIsBeautiful && $sheIsSlim && $sheIs24YearsOld && $sheIsRich);
var_dump($sheIsBeautiful || $sheIsRich && $sheHasBA);
var_dump($sheIsBeautiful xor $sheIsSlim);

به عنوان خروجی اسکریپت فوق داریم:

bool(false)
bool(true)
bool(true)

حال شروع می‌کنیم به تفسیر اسکریپت فوق بدین صورت که ابتدا پنج متغیر تعریف کرده‌ایم که به ترتیب از بالا به پایین به معنی «او زیبا است»، «او خوش اندام است»، «او ۲۴ ساله است»، «او تحصیلات کارشناسی دارد» و «او پولدار است» و به ترتیب مقادیر درست، غلط، درست، درست و غلط را به عنوان مقدار اولیهٔ آنها در نظر گرفته‌ایم. فرض کنیم که پسرهایی داریم که خواهان ازدواج با دختر خانم فرضی سناریوی فوق هستند.

در ()var_dump اول پسری را در نظر گرفته‌ایم که برایش زیبایی، خوش ‌اندامی، سن ۲۴ سال و پولدار بودن مهم است اما این پسر نمی‌تواند با این دختر ازدواج کند زیرا وی تمامی معیارها را دارا است به جز معیار آخر (پولدار بودن) و همین می‌شود که خروجی false است.

در ()var_dump دوم پسری را در نظر گرفته‌ایم که ترجیح می‌دهد با دختری ازدواج کند که حتماً لیسانس داشته باشد و همچنین از میان معیارهای زیبایی یا ثروتمند بودن، حداقل یکی وجود داشته باشد و از آنجا که دختر لیسانس دارد و زیبا است، جواب true دریافت خواهد شد و می‌تواند با وی ازدواج کند.

در ()var_dump آخر هم پسری را مد نظر قرار داده‌ایم که دختر مد نظرش یا باید زیبا باشد یا خوش اندام و از آنجا که این دختر فرضی صرفاً زیبا است، پس مقدار true بازگردانده شده و می‌تواند با وی ازدواج کند.

اولویت اپراتورها در زبان PHP
به طور کلی، در اکثر زبان‌های برنامه‌نویسی من‌جمله PHP اپراتورها به ترتیب خاصی اعمال می‌شوند که این قوانین تحت عنوان Operator Precedence & Associativity شناخته می‌شوند اما اگر بخواهیم Order (ترتیب) از پیش تعریف شده این زبان را تغییر داده و ترتیب مد نظر خودمان را در معادله اعمال کنیم، می‌توانیم از پرانتز استفاده کنیم که در ادامه با ذکر چند مثال، این موضوع را بررسی خواهیم کرد اما ابتدا نگاهی به جدول Operator Associativity در زبان PHP می‌اندازیم (لازم به ذکر است که حرف R بدان معنا است که اعمال اپراتور از سمت راست صورت می‌گیرد، حرف L بدان معنا است که اعمال اپراتور از سمت چپ صورت می‌گیرد و عبارت NA که مخفف Non Associative است بدان معنا است که اپراتور از هیچ سمتی اولویت ندارد):

اپراتور (Operator)وابستگی (Associativity)
**R
++R
R
(int)R
(float) R
(string)R
(bool)R
(array)R
(object)R
??R
!R
*L
/L
%L
+L
L
.L
=<NA
<NA
=>NA
>NA
==NA
===NA
=!NA
==!NA
<>NA
<=>NA
&&L
||L
=R
=+R
=-R
=*R
=**R
=/R
=.R
=%R
andL
xorL
^L
orL

برای روشن‌تر شدن این مسئله، معادلهٔ زیر را در نظر می‌گیریم:

<?php
$foo = 5 * 10 - 1;
echo $foo;

پیش از اجرای کد فوق، به عنوان خروجی اسکریپت فوق چند حالت مختلف را می‌توانیم در نظر بگیریم؛ در واقع، اگر ابتدا عدد ۵ را در ۱۰ ضرب کرده سپس عدد ۱ را از حاصل‌ضرب کسر کنیم، با عددی همچون ۴۹ مواجه خواهیم شد اما اگر ابتدا به ساکن عدد ۱ را از ۱۰ کسر کرده سپس نتیجه را در عدد ۵ ضرب کنیم، با عددی همچون ۴۵ مواجه خواهیم شد. حال اسکریپت را اجرا کرده تا ببینیم کدام حالت صدق می‌کند:

49

می‌بینیم که ترتیب اول اتخاذ شده است؛ به عبارت دیگر،‌ اول عمل ضرب سپس عمل تفریق صورت گرفته است و این روشی است که در زبان PHP برای ترتیب اجرای اپراتورها در نظر گرفته شده است. 

پیش از این گفتیم که با استفاده از پرانتز می‌توان این ترتیب را عوض کرد. برای روشن‌تر شدن مسئله، اسکریپت فوق را به صورت زیر بازنویسی می‌کنیم:

<?php
$foo = 5 * (10 - 1);
echo $foo;

در اسکریپت فوق دستور داده‌ایم تا مفسر PHP ابتدا نتیجهٔ معادلهٔ‌ داخل پرانتز را محاسبه کند؛‌ لذا خروجی اسکریپت فوق ۴۵ خواهد بود.

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

<?php
$foo = 5 - 5 - 5;
echo $foo;

در واقع، مقدار متغیر foo$ را می‌توان به دو شکل مختلف در نظر گرفت: 5 – (5 – 5) یا (5 – 5) – 5 و بسته به اینکه کدام یک توسط مفسر PHP در نظر گرفته شود، خروجی دو چیز کاملاً متفاوت خواهد شد: ۵- یا ۵.

پاسخ درست عدد ۵- است به این دلیل که جهت اجرای اپراتورها در اینجا تعیین‌کننده است. به عبارت دیگر، در دو طرف عدد پنجی که در وسط قرار گرفته است علامت منفی قرار دارد اما از آنجا که – اصطلاحاً Left Associative است (به جدول فوق مراجعه شود)، عملیات سمت چپ ابتدا صورت می‌گیرد. در واقع، ابتدا ۵ – ۵ شده که حاصل می‌شود 0 سپس داریم ۵ – ۰ که نتیجهٔ ۵- نشان داده می‌شود. هشداردر زبان PHP ما این اجازه را نداریم تا اپراتورهایی که از Precedence (ترتیب) برابر برخوردار بوده و اولویتی نسبت به یکدیگر ندارند در کنار یکدیگر استفاده کنیم. به عبارت دیگر،‌ معادلهٔ 1 < 2 > 1 هرگز درست نیست و ارور دریافت خواهیم کرد اما معادلهٔ 1 == 1 => 1 درست است زیرا == از اولویت کمتری نسبت به => برخوردار است.

در ارتباط با چهار عمل اصلی جمع، تفریق،‌ ضرب و تقسیم اولویت اول با ضرب، سپس با تقسیم، جمع و در نهایت تفریق است:

<?php
$foo = 7 * 2 / 2 + 3 - 3;
echo $foo;

خروجی اسکریپت فوق عدد ۷ است. در واقع، ابتدا عدد ۷ در ۲ ضرب شده که می‌شود ۱۴؛ سپس حاصل‌ضرب بر عدد ۲ تقسیم شده که می‌شود ۷؛ در ادامه عدد ۷ با عدد ۳ جمع می‌شود که حاصل‌جمع آنها می‌شود ۱۰ و در نهایت هم عدد ۳ از ۱۰ کم شده که نتیجه می‌شود ۷. اگر بخواهیم با استفاده از پرانتز ترتیب اجرای اپراتورهای فوق را نشان دهیم خواهیم داشت:

<?php
$foo = ((((7 * 2) / 2) + 3) - 3);
echo $foo;

در تفسیر اسکریپت فوق بایستی بگوییم که داخلی‌ترین پرانتزها همواره اول اجرا می‌شوند. به عبارت دیگر، ابتدا پرانتزهای دور اعداد (2 * 7)، سپس پرانتزهای دور (2 / 14)، سپس پرانتزهای دور (3 + 7) و در نهایت پرانتز دور (3 – 10) اعمال می‌گردد. 

در جدول فوق، Operator Associativity در زبان PHP را معرفی کردیم. حال به منظور درک این مفهوم، چند مثال کاربردی می‌زنیم:

<?php
$myVariable = 10;
$foo = $myVariable = 4;
echo $foo;

دستور echo مقدار ۴ را چاپ خواهد کرد زیرا همان‌طور که در جدول فوق مشخص است، اپراتور = اصطلاحاً Right Associative است؛‌ به عبارت دیگر، از سمت راست اعمال می‌شود. در واقع،‌ ابتدا عدد ۴ به متغیر myVariable$ اختصاص یافته سپس مقدار این متغیر به متغیر foo$ اختصاص می‌یابد. به عنوان مثالی دیگر داریم:

<?php
$foo = (string) (float) (int) 4;
var_dump($foo);

به عنوان خروجی اسکریپت فوق داریم:

string(1) "4"

در حقیقت از آنجا که Casting که در آموزش‌های گذشته با مفهوم آن آشنا شدیم در زبان PHP اصطلاحاً Right Associative است، ابتدا عدد ۴ به دیتاتایپ int کَست می‌شود، سپس به دیتاتاپیت float و در نهایت string و از آنجا که کَست شدن به استرینگ در مرحلهٔ آخر قرار داشته و کَستی پس از آن صورت نمی‌گیرد، دیتاتاپ استرینگ برای عدد ۴ باقی می‌ماند. نکتهنوع دیگری از اپراتورها در زبان PHP داریم که تحت عنوان Bitwise شناخته می‌شوند که امکان انجام محاسبات روی بیت‌های یک عدد صحیح را فراهم می‌آورند (Bit کوچک‌ترین واحد ذخیره‌سازی در سیستم‌های کامپیوتری است که مقدار آن ۰ یا ۱ می‌تواند باشد). از آنجا که این نوع اپراتورها مناسب دولوپرهای بسیار حرفه‌ای است، از پرداختن به این نوع اپراتور در این دوره خودداری می‌کنیم.

آشنایی با اپراتور Ternary در زبان PHP
در زبان PHP اپراتوری داریم تحت عنوان Ternary که با علامت ? تعریف می‌شود. به نظر می‌رسد که ذکر یک مثال، به خوبی کاربرد این متغیر را مشخص سازد:

<?php
$isMale = true;
$result = $isMale ? 'Male' : 'Female';
echo $result;

به عنوان خروجی اسکریپت فوق داریم:

Male

حال کدهای فوق را به صورت زیر ریفکتور می‌کنیم:

<?php
$isMale = false;
$result = $isMale ? 'Male' : 'Female';
echo $result;

اکنون به عنوان خروجی اسکریپت فوق داریم:

Female

در تفسیر نحوهٔ عملکرد Ternary Operator بایستی بگوییم که اگر Condition (شرط) یا همان عملوندی که در سمت چپ ? قرار می‌گیرد true بود، عملوندی که در سمت راست اپراتور ? قرار گرفته بازگردانده می‌شود و در غیر این صورت، هر چیزی که پس از علامت : قرار گرفته باشد بازگردانده خواهد شد. در فصول آتی با دستورات شرطی در زبان PHP آشنا خواهید شد اما اگر بخواهیم اپراتور ? را با If/Else جایگزین کنیم، خواهیم داشت:

<?php
$isMale = true;
if ($isMale) {
    $result = 'Male';
} else {
    $result = 'Female';
}
echo $result;

آشنایی با اپراتور Null Coalescing در زبان PHP
Null Coalescing Operator به نوعی همان Ternary Operator است با این تفاوت که فانکشن ()isset هم در آن گنجانده شده است که این وظیفه را دارا است تا چک کند متغیر ورودی اصطلاحاً Set (مقداردهی) شده است یا خیر. به عنوان مثال داریم:

<?php
$firstName = 'Behzad';
$result = $firstName ?? 'Unknown';
echo $result;

به عنوان خروجی اسکریپت فوق داریم:

Behzad

حال کدهای فوق را به صورت زیر بازنویسی می‌کنیم:

<?php
$firstName;
$result = $firstName ?? 'Unknown';
echo $result;

باتوجه به اینکه متغیر firstName$ اصطلاحاً Set (مقداردهی) نشده است، عملوند قرار گرفته پس از اپراتور ?? به متغیر result$ اختصاص می‌یابد (برای آشنایی بیشتر با این اپراتور، به مقالهٔ آشنایی با اپراتور Null Coalesce در PHP نسخهٔ ۷مراجعه نمایید).

آشنایی با اپراتور Reference در زبان PHP
Reference Operator مبحث گسترده‌ای در زبان PHP است که برای آشنایی بیشتر با این اپراتور، توصیه می‌کنیم به مقالهٔ آشنایی با تفاوت Pass by Value و Pass By Reference در زبان PHP مراجعه نمایید.

آشنایی با اپراتور @ در زبان PHP
برای روشن‌تر شدن کاربرد اپراتور @ در زبان PHP، ابتدا کدهای زیر را در نظر بگیرید:

<?php
$variable = 12;
if ($variable) {
   echo 'It`s set';
}

در اسکریپت فوق متغیری داریم تحت عنوان variable$ که مقدار ۱۲ برای آن در نظر گرفته شده است؛ سپس با یک دستور شرطی، سنجیده‌ایم که اگر این متغیر مقداردهی شده بود، با دستور echo استرینگی را چاپ کنیم. حال کدهای فوق را به صورت زیر تغییر می‌دهیم:

<?php
//$variable = 12;
if ($variable) {
   echo 'It`s set';
}

به عنوان خروجی اسکریپت فوق داریم:

Notice: Undefined variable: variable in /var/www/sokanacademy-php-course/02/index.php on line 3

در حقیقت، با کامنت کردن متغیر مد نظر، مفسر قادر به دیدن این متغیر نخواهد بود و همان‌طور که در اخطار فوق می‌بینیم، مفسر PHP به ما اخطار می‌دهد که هیچ متغیری تحت عنوان variable$ تعریف نشده است. حال اگر بخواهیم Notice (اخطار) فوق را از بین ببریم، می‌توانیم اپراتور @ را به صورت زیر مورد استفاده قرار دهیم:

<?php
//$variable = 12;
if (@$variable) {
   echo 'It`s set';
}

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

آشنایی با اپراتور `whoami` در زبان PHP
اگر دستور (‘shell_exec(‘whoami را در وب‌ سرورهای Apache یا Nginx اجرا کنیم، خروجی www-data در معرض دیدمان قرار خواهد گرفت. در زبان PHP اپراتوری داریم که اصطلاحاً Backtick Operator نامیده می‌شود که دقیقاً همین کار را انجام می‌دهد:

<?php
echo `whoami`;

لازم به ذکر است که اگر این اپراتور را در محیط کامندلاین اجرا کنیم، نام کاربری که لاگین است چاپ خواهد شد:

$ php -r 'echo `whoami`;'

به عنوان خروجی اسکریپت فوق داریم:

behzadmoradi

مطالب مرتبط

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *