آرایه را زمین بگذار!

یکی از دوست‌نداشتنی‌های PHP، استفاده از کروشه (bracket) برای دو منظور مختلفه.
ما با دو نوع داده انتزاعی آرایه و دیکشنری (آرایه ربطی، نگاشت) آشنا هستیم: آرایه، مجموعه‌ای از عناصره که هر عضو با یه شماره (اندیس، index) قابل دسترسیه و دیکشنری، مجموعه از جفت‌هاست که هر مقدار به یک کلید منحصر به فرد ربط داده شده. در دیگر زبان‌های اسکریپتی مثل Python، Ruby و JavaScript آرایه رو با کروشه [ ] و دیکشنری رو با آکولاد { } مشخص می‌کنن. اما خالق «Personal Home Page» تصمیم گرفته از یک نماد برای این دو نوع داده استفاده بکنه.🤦‍♂️

خب نماد آرایه و دیکشنری یکی باشه، چی میشه مگه؟

توی تعریف قرارداد (interface)، با اعلام array به عنوان ورودی یا خروجی نمیشه فهمید انتظار کدوم نوع داده رو داریم! و در شرایطی می‌تونن به سادگی به جای هم ارائه بشن. برای مثال این تکه کد رو ببینین:

$prices = [];
foreach ($products as $p) {
    $prices[$p->name] = $p->price;
}
echo json_encode($prices);    // may print [ ] or { "car": 1000 } 

در شرایطی که هیچ محصولی وجود نداره، خروجی به صورت Array ارائه می‌شه و زمان‌های دیگه به صورت Object!

حالا چه کنیم؟!

اول: حتی سن یه عدد (صحیح) نیست! پس اولویت استفاده از Value Objectهاست. استفاده نکردن از Array مزایای دیگه‌ای هم داره؛ مثل: تغییرناپذیری (immutability)، ایمنی نوع (type safety) و لفافه‌بندی (encapsulation)

دوم:‌ در جایی که انتظار Object داریم، برای جلوگیری از تفسیر Associative Array به Indexed Array، از نوع مناسب استفاده کنیم یا به صورت صریح ریخته‌گری (Casting)‌ کنیم:

$always_object = (object) $prices;

// OR

$prices = new stdClass;
foreach ($products as $p) {
     $prices->{$p->name} = $p->price;
}


تمیز کد بنویسیم و غر نزنیم!

هر تکنولوژی، کمتر یا بیشتر، دشواری‌های خودش رو داره. اگر بلد باشيم چطور از این بزن‌گاه‌ها عبور کنیم، می‌تونیم كد خوب و با کیفیت بنویسیم و تقصیرها رو گردن زبان نیندازیم.