یکی از دوستنداشتنیهای 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; }
هر تکنولوژی، کمتر یا بیشتر، دشواریهای خودش رو داره. اگر بلد باشيم چطور از این بزنگاهها عبور کنیم، میتونیم كد خوب و با کیفیت بنویسیم و تقصیرها رو گردن زبان نیندازیم.