آشنایی با اپراتور Null Coalesce در PHP نسخهٔ ۷

آشنایی با اپراتور Null Coalesce در PHP نسخهٔ ۷

بخش لاینفک هر زبان برنامه‌نویسی، دستورات شرطی است و ساختار If/Else را به سادگی می‌توان برای این منظور مورد استفاده قرار داد اما برخی دولوپرهایی که عادت به کوتاه‌نویسی کرده‌اند نیز می‌توانند از ساختار کوتاه‌شدهٔ If/Else استفاده کنند که اصطلاحاً Ternary Operator گفته می‌شود.

Ternary Operator در PHP چیست؟
به طور خلاصه اگر بخواهیم دستورات شرطی را در زبان PHP به صورت خلاصه و کوتاه بنویسیم، می‌بایست از ساختاری که اصطلاحاً Ternary Operator نامیده می‌شود استفاده نماییم که کد ما را به مراتب ساده‌تر می‌سازد. Ternary Operator از سه بخش مجزا تشکیل شده است که ساختار کلی آن به صورت زیر است:

(Condition) ? (true return value) : (false return value)

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

if($variableIsSet) {
    $x = 'yes';
} else {
    $x = 'no';
}
echo $x;

همان‌طور که در کد فوق مشاهده می‌شود، به عنوان مقدار ورودی شرط if از متغیری تحت عنوان variableIsSet$ استفاده کرده‌ایم و این در حالی است که اگر این متغیر اصطلاحاً Set (مقداردهی) شده باشد، مقدار yes به متغیر x$ اختصاص می‌یابد و در غیر این صورت وارد بلوک else شده و مقدار no به این متغیر اختصاص می‌یابد:

no

پس از اجرای کد فوق، می‌بینیم که دستور echo مقدار no را به درستی چاپ می‌کند. واقعیت امر آن است که نوشتن ساختار شرطی ساده‌ای بدین شکل کمی کد را شلوغ می‌کند و این در حالی است که با استفاده از Ternary Operator که پیش از این با ساختار آن آشنا شدیم، می‌توان به مراتب کد تمیزتر و خواناتری نوشت. برای این منظور داریم:

$x = $variableIsSet ? 'yes' : 'no';
echo $x;

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

no

می‌بینیم که به درستی مقدار no به عنوان خروجی نمایش داده می‌شود. در تفسیر کد فوق بایستی بگوییم که ابتدا مقدار متغیر variableIsSet$ بررسی می‌شود؛ اگر این متغیر اصطلاحاً Set شده باشد، مقدار قرار گرفته پس از علامت ? که برابر با yes است به متغیر x$ اختصاص می‌یابد و در غیر این صورت، مقدار قرار گرفته پس از علامت : که برابر با no است به متغیر x$ اختصاص می‌یابد. گاهی‌اوقات هم قصد داریم تا اگر متغیری Set شده بود، مقدار همان متغیر را -به جای مثلاً yes- برگردانیم. به عنوان مثال:

$variableIsSet = 'has value';
$x = $variableIsSet ? $variableIsSet : 'no';
echo $x;

در اسکریپت فوق، ابتدا متغیر variableIsSet$ را مقداردهی کرده‌ایم (مقدار has value) سپس در دستور شرطی خود گفته‌ایم که اگر این متغیر Set شده بود، مقدارش نمایش داده شود و در غیر این صورت، استرینگ no بازگردانده شود. به عنوان خروجی اسکریپت فوق خواهیم داشت:

has value

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

$variableIsSet = 'has value';
$x = $variableIsSet ?: 'no';
echo $x;

در واقع، اگر پارامتر دوم این دستور -یعنی همان چیزی که پس از علامت ? قرار می‌گیرد- دقیقاً همانند پارامتر اول -در مثال فوق متغیر variableIsSet$- باشد، می‌توان پارامتر دوم را حذف کرده و از علائم ;? استفاده کرد. در این صورت، اگر متغیر variableIsSet$ مقداردهی شده باشد، مقدارش بازگردانده می‌شود و در غیر این صورت هر چیزی که پس از علائم ;? قرار گرفته باشد بازگردانده می‌شود. به طور کلی، مزایای استفاده از این ساختار عبارتند از:
- ساده‌تر شدن سورس‌کد
- کوتاه‌تر شدن سورس‌کد 
- امکان نوشتن دستورات If/Else به صورت Inline

همچنین در حین استفاده از ساختار Ternary Operator نکات زیر را مد نظر داشته باشید:
- اگر در یک تیم کد می‌زنید، حتماً اطمینان حاصل کنید که دیگر دولوپرها با این ساختار آشنایی دارند.
- هرگز برای دستورات شرطی تو در تو از این ساختار استفاده نکنید چرا که کد را پیچیده‌تر می‌سازد و درک آن مشکل می‌شود.
- در صورت امکان، برای خوانایی بیشتر سورس‌کد از پرانتز دور بخش‌های مختلف این ساختار استفاده کنید.

نکتهٔ دیگری که در استفاده از Ternary Operator وجود دارد این است که شما می‌توانید این ساختار را در چندین خط متوالی مورد استفاده قرار دهید. به عنوان نمونه داریم:

$message = $isWinner
    ? "Congratulations! You just won a whole bunch of money and prizes!"
    : "Sorry, you didn't get any money or prizes this time.";

گرچه کد فوق به درستی کار خواهد کرد، اما خوانایی آن پایین است و توصیه می‌شود که در چنین شرایطی از همان ساختار سنتی If/Else استفاده شود!

آشنایی با ساختار Null Coalesce در PHP نسخهٔ ۷ 
در PHP 7، اپراتور جدیدی تحت عنوان Null Coalesce در اختیار دولوپرهای این زبان قرار گرفته است که باز هم منجر به نوشتن‌ کدهای به مراتب کوتاه‌تری می‌گردد. در واقع، ساختار ?? در نسخهٔ ۷ زبان پی‌اچ‌پی اضافه شد تا جایگزین فانکشن ()isset به همراه Ternary Operator شود که در بالا مورد بحث قرار گرفت.

به عبارت دیگر، اگر پارامتر اول وجود داشته باشد و Null نباشد، اپراتور ?? آن را برمی‌گرداند و در غیر این صورت، پارامتر دوم را برمی‌گرداند. برای روشن‌تر شدن این مسئله، ابتدا مثالی با ساختار ;? می‌زنیم سپس آن را با ساختار ?? ریفکتور می‌کنیم:

$username = isset($_GET['username']) ?: 'not passed';
echo $username;

در صورتی که اسکریپت فوق را اجرا کنیم، مقدار استرینگ not passed چاپ می‌شود چرا که مقدار username اصطلاحاً Set نشده است. حال با استفاده از اپراتور ?? که به نوعی فانکشن ()isset داخلش گنجانده شده، اسکریپت فوق را به شکل زیر بازنویسی می‌کنیم:

$username = $_GET['username'] ?? 'not passed';
echo $username;

اسکریپت فوق چک می‌کند که اولاً username وجود داشته باشد و ثانیاً این مقدار مخالف Null باشد. علاوه بر این، از چندین اپراتور ?? پشت سر هم نیز می‌توان به شکل زیر استفاده کرد:

$a = Null;
$b = Null;
echo $a ?? $b ?? 5;

خروجی اسکرپیت فوق عدد ۵ است؛ در واقع، مفسر پی‌اچ‌پی ابتدا به سراغ متغیر a$ می‌رود و آن را چک می‌کند تا ببینید که آیا Set شده و مقدار آن مخالف Null است یا خیر. اگر پاسخ مثبت بود، مقدار آن برگردانده می‌شود و در غیر این صورت، به سراغ متغیر b$ می‌رود و همین فرایند تکرار می‌شود و اگر پاسخ مثبت نبود، در نهایت مقدار 5 نمایش داده می‌شود.

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