WebPajooh
WebPajooh
خواندن ۲ دقیقه·۴ سال پیش

توابع compact و extract در PHP

اولین بار فانکشن compact را در فریم‌ورک لاراول استفاده کردم و برای ارسال اطلاعات به ویو، چنین چیزی داشتیم:

$posts = Post::all(); return view('view_name', compact('posts');

اما compact چه کار می‌کند؟

کار این فانکشن این است که متغیرهایی را دریافت می‌کند و آنها را در آرایه‌ای می‌ریزد؛ نام هر متغیر key و مقدار آن value می‌شود. به این مثال دقت کنید:

$name = 'John'; $age = 27; $arr = compact('name', 'age'); echo 'Your name is ' . $arr['name'] . ' and you are ' . $arr['age'];

فانکشن compact می‌تواند حداقل یک پارامتر بگیرد و هر پارامتر، نام یک متغیر است. شما می‌توانید پارامترها را به صورت رشته‌هایی که هر کدام نام یک متغیر باشند وارد کنید (مانند مثالی که گذشت) و یا اینکه از آرایه‌ای از رشته‌ها استفاده کنید و خروجی نیز همانطور که مشاهده کردید، یک آرایه است.

فانکشن extract

این فانکشن، برعکس compact عمل می‌کند و از یک آرایه، متغیرهایی می‌سازد. نام هر متغیر، از کلیدهای آرایه (keys) گرفته شده و مقدار متغیر به مقادیر (values) بستگی دارد.

$arr = [ 'name' => 'john', 'age' => 27 ]; extract($arr); echo $name . ' is ' . $age;

پارامتر دوم این فانکشن، اختیاری و مربوط به flagهاست:

  • فلگ EXTR_OVERWRITE: اگر متغیری به همان نام موجود باشد، آنچه درون آرایه باشد را جایگزین می‌کند.
  • فلگ EXTR_SKIP: اگر متغیری به همان نام موجود باشد، جایگزینی رخ نمی‌دهد.
  • فلگ EXTR_PREFIX_SAME: اگر تداخلی باشد، به آنچه درون آرایه باشد، پیشوندی اختصاص می‌دهد. پیشوند، پارامتر سوم است و اگر برای مثال کلید آرایه age$ باشد و پیشوند'new' را برای پارامتر سوم در نظر گرفته باشیم، مقدار آن کلید در متغیر new_age$ ریخته می‌شود.
  • فلگ EXTR_PREFIX_ALL: چه تداخلی باشد و چه نباشد، از طریق پارامتر سوم به تمامی متغیرها یک پیشوند اختصاص می‌دهد.

برای مشاهده‌ی دیگر فلگ‌ها به برگه‌ی مربوط به extract در مستندات PHP مراجعه کنید.

مثالی عملی برای compact و extract

کلاسی به نام View ساخته‌ایم که با استفاده از compact و extract می‌تواند یک قالب را با داده‌های واردشده نشان دهد:

$title = 'Hello, world!'; $author = 'WebPajooh'; View::make('view1', compact('title', 'author'));

کدهای این مثال را به طور کامل در این مخزن آپلود کرده‌ام و دیدن کدهای کوتاه اما مهم View.php را توصیه می‌کنم.

نکته‌ای امنیتی مربوط به extract

اگر ورودی این فانکشن را از کاربر بگیرید، خطر در کمین شماست! در مستندات آمده است:

Warning: Do not use extract() on untrusted data, like user input (i.e. $_GET, $_FILES, etc.). If you do, for example if you want to temporarily run old code that relied on register_globals, make sure you use one of the non-overwriting flags values such as EXTR_SKIP and be aware that you should extract in the same order that’s defined in variables_order within the php.ini.

هشدار داده است که از extract، روی داده‌های غیر قابل اعتماد مانند ورودی‌هایی که از کاربران می‌گیرید استفاده نکنید و اگر استفاده کردید، فلگی چون EXTR_SKIP را فراموش نکنید!

آموزش phpبرنامه نویسی وبنکات phpphp حرفه ایcompact
توسعه‌دهندۀ بک‌اند، امیدوار، خیال‌باف، علاقه‌مند به خواندن و نوشتن
شاید از این پست‌ها خوشتان بیاید