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

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

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

اولین کسی باشید که به این سؤال پاسخ می‌دهید

اگر بخواهیم دستورات شرطی را در زبان PHP به صورت خلاصه و کوتاه بنویسیم، باید از ساختاری که اصطلاحاً 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$ بررسی می‌شود؛ اگر این متغیر اصطلاحاً سِت شده باشد، مقدار قرار گرفته پس از علامت ? که برابر با yes است به متغیر x$ اختصاص می‌یابد و در غیر این صورت مقدار قرار گرفته پس از علامت : که برابر با no است به این متغیر اختصاص می‌یابد. گاهی‌ اوقات هم قصد داریم تا اگر متغیری سِت شده بود، مقدار همان متغیر را مثلاً به جای yes برگردانیم که برای این منظور داریم:

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

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

has value

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

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

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

- ساده‌تر شدن سورس‌کد
- کوتاه‌تر شدن سورس‌کد 
- امکان نوشتن دستورات شرطی در خلال کدهای HTML

همچنین در حین استفاده از ساختار 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 اصطلاحاً سِت نشده است. حال با استفاده از اپراتور ?? که به نوعی فانکشن ()isset داخلش گنجانده شده است اسکریپت فوق را به شکل زیر بازنویسی می‌کنیم:

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

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

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

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

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