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