20 سؤال مهم که در مصاحبه‌ی استخدامی PHP می‌پرسند!

در حین گشت و گذار در وب بودم، که کاملاً تصادفی به بیست و پنج سؤال مربوط به مصاحبه‌های استخدامی PHP برخوردم؛ سؤالات جالبی مطرح شده بود که حیفم آمد با شما عزیزان به اشتراک نگذارم، پس شروع به ترجمه‌ی بیست سؤال از بیست و پنج سؤال به همراه جواب‌هایشان کردم، امیدوارم مورد استفاده‌ی شما قرار گرفته و برایتان مفید باشد!


1) تفاوت بین include و require در چیست؟

جواب: هردو یک کار را انجام می‌دهند، منتها اگر خطایی رخ دهد، require یک fatal error را throw کرده و اجرای کدها را متوقف می‌کند، بر خلاف include که به اجرای اسکریپت ادامه می‌دهد.

2) تفاوت بین unset و unlink چیست؟

جواب: از unset برای نابودکردن متغیر(ها) استفاده می‌کنیم، اما unlink برای حذف فایل از فایل‌سیستم است.

3) مقادیر x و y پس از اجرای کد زیر، چه می‌شوند؟

$x = '7';
$y = &$x;
$y = "3$x"

جواب: مقدار هر دو، '37' می‌شود.

4) تفاوت Error با Exception در چیست؟

جواب: یک Exception می‌تواند پرتاب (Throw) شود و همچنین این امکان وجود دارد که از قبل در یک بلاک Try-Catch قرار گیرد، اما Errorها در PHP قابل بازگردانی نبوده و می‌توانند برنامه را متوقف کنند.

5) تفاوت میان درخواست GET و POST چیست؟

جواب:

  • در درخواست‌های نوع GET، داده‌های واردشده به URL اضافه می‌شوند و همچنین در تاریخچه‌ی مرورگر ذخیره خواهند شد، اما در POST چنین نیست و همین باعث می‌شود که امنیت POST از GET در هنگام ارسال اطلاعات حساس بیشتر باشد.
  • در متد GET محدودیت طول وجود دارد، اما POST محدودیتی ندارد.
  • از متد GET تنها برای دریافت اطلاعات استفاده می‌کنیم.

6) چرا باید بجای == از === استفاده کنیم؟

جواب: مورد دوم، علاوه بر مقدار، به بررسی تساوی نوع هم می‌پردازد؛ پس مورد اول ابتدا باید نوع دو طرف را یکسان‌سازی کند و تبدیل نوع را انجام دهد، بعد به بررسی مقایسه‌ای روی مقدار بپردازد، بنابراین === از == سریع‌تر است!

مثال: عبارت TRUE == 1 برابر TRUE می‌شود، اما TRUE === 1 چنین نیست و مقدارش FALSE می‌باشد.

7) عبارت 42 == 042 چه چیزی را برمی‌گرداند؟

جواب: خروجی FALSE است، زیرا ما یک 42 که هشت‌هشتی است را با یک 42 که ده‌دهی می‌باشد مقایسه کرده‌ایم، در نتیجه عبارت بعد از تبدیل 42 == 34 است که باید FALSE باشد!

8) بین ()array و [] چه تفاوتی وجود دارد؟

جواب: تفاوتی ندارند؛ حالت دوم، کوتاه‌شده‌ی array است که در پی‌اچ‌پی نسخه‌ی 5.4 معرفی شده، پس در نسخه‌های قدیمی‌تر قابل اجرا نبوده و موجب خطای در برنامه می‌شود.

9) بین 'text' و "text" چه تفاوتی وجود دارد؟

جواب: استفاده از دابل‌کوتیشن اجازه می‌دهد که در بین رشته، متغیرها را هم وارد کنیم، اما سینگل‌کوتیشن چنین قابلیتی ندارد. از آنجا که در صورت استفاده از دابل‌کوتیشن، عملیاتی صورت می‌گیرد تا متغیرها را در رشته شناسایی و بازیابی کند، سینگل‌کوتیشن سریع‌تر خواهد بود!

10) بین AND و && چه تفاوتی وجود دارد؟

جواب: && بر AND اولویت دارد.

11) فرق بین echo و print در چیست؟

جواب: echo هیچ مقداری را برنمی‌گرداند، اما print برای اینکه نشان دهد که عملیات با موفقیت انجام شده، 1 را برمی‌گرداند. همچنین شما می‌توانید که چندین پارامتر را به echo ارسال کرده و با کاما بینشان فاصله بگذارید تا همه را چاپ کند، اما print تنها یک پارامتر می‌گیرد.

12) خروجی این کد چیست؟

$str = 'PHP is my language.';
if (strpos($str, 'PHP')) {
   return true;
} else {
   return false;
}

جواب: خروجی FALSE است؛ تابع strpos به دنبال موقعیت رشته‌ی PHP در درون جمله می‌گردد و از آنجا که این کلمه در ابتدای جمله آمده است، عدد 0 برگردانده می‌شود و در نتیجه FALSE به خروجی فرستاده شود.

13) خطای زیر چه زمانی اتفاق می‌افتد؟

Warning: Cannot modify header information – headers already sent.

جواب: اگر بعد از نمایش چیزی در صفحه (مانند echoکردن، html، فاصله‌دادن پیش از تگ شروع PHP و...) هدرهای HTTP را (با ست‌کردن کوکی، سشن، Response Type، ریدایرکت‌کردن و...) تغییر دهید، این خطا به وجود می‌آید!

14) متدهای construct__ و destruct__ در کلاس چه وظیفه‌ای دارند؟

جواب: متد construct__ بلافاصله پس از ساختن یک نمونه از کلاس صدا زده می‌شود تا مشخصه‌های کلاس را اولیه‌سازی کند، اما متد destruct__ در زمان نابودکردن شیء ایجادشده از کلاس، وقتی که اجرای اسکریپت متوقف می‌شود، صدا زده می‌شود.

15) سه سطح از محدوده‌ها (Scopes) را نام برده و توضیح دهید.

جواب:

  • سطح Private: تنها در خودِ کلاس در دسترس می‌باشد.
  • سطح Public: در هرجا که دسترسی به کلاس موجود باشد، می‌توان به آن دسترسی داشت.
  • سطح Protected: در خودِ کلاس به علاوه‌ی فرزندان آن کلاس قابل دسترسی می‌باشد.

16) کلمه‌ی final چه کاربردی دارد؟

جواب: زمانی که متدِ یک کلاس به صورت final تعریف شود، فرزندهای آن کلاس نمی‌توانند آن متد را override کنند، و اگر کلیت کلاس به عنوان final تعریف گردد، دیگر نمی‌توان از آن فرزندی ساخت.

17) آیا PHP از ارث‌بری چندگانه پشتیبانی می‌کند؟

جواب: خیر، اما Traitها می‌توانند راه حلی برای این کمبود در PHP و زبان‌های دیگری باشند که از ارث‌بری چندگانه پشتیبانی نمی‌کنند.

18) اما Trait چیست؟!

جواب: Traitها در زبان‌هایی که از ارث‌بری چندگانه پشتیبانی نمی‌کنند، مکانیسمی هستند تا بتوان از کد در جاهای مختلفی استفاده کرد و به کلاس‌های مختلفی اضافه نمود تا قابلیت‌هایشان را افزایش دهد.

19) تفاوت Interface و Abstract چیست؟

جواب: Interface متدهایی که کلاس باید در خود داشته باشد را تعیین می‌کند، بدون اینکه به شیوه‌ی هندل‌شدن و منطق این متدها کاری داشته باشد! اما کلاس‌های Abstract، کلاس‌هایی هستند که حداقل یک متد Abstract در خود دارند و نمی‌توان از آنها نمونه‌ای ایجاد کرد، تنها می‌توان از آنها ارث‌بری کرد و متدهای این نوع باید در کلاس‌های فرزند هم ایجاد شوند. بر خلاف Interfaceها، می‌توانیم با Abstractها از قبل به تعریف متدهایی که کلاسِ فرزند باید از آنها استفاده کند بپردازیم.

20) درباره‌ی Composer توضیح دهید!

جواب: Composer ابزاری برای مدیریت وابستگی‌ها در PHP است، و به شما امکان این را می‌دهد که ابزارهای مورد نیاز در پروژه‌ی خود را تعیین کنید تا خود عهده‌دار نصب، به‌روزرسانی و بارگیری خودکار (Autoloading) شود!


منبع:

https://adevait.com/php/interview-questions