اولین بار فانکشن compact را در فریمورک لاراول استفاده کردم و برای ارسال اطلاعات به ویو، چنین چیزی داشتیم:
$posts = Post::all(); return view('view_name', compact('posts');
کار این فانکشن این است که متغیرهایی را دریافت میکند و آنها را در آرایهای میریزد؛ نام هر متغیر key و مقدار آن value میشود. به این مثال دقت کنید:
$name = 'John'; $age = 27; $arr = compact('name', 'age'); echo 'Your name is ' . $arr['name'] . ' and you are ' . $arr['age'];
فانکشن compact میتواند حداقل یک پارامتر بگیرد و هر پارامتر، نام یک متغیر است. شما میتوانید پارامترها را به صورت رشتههایی که هر کدام نام یک متغیر باشند وارد کنید (مانند مثالی که گذشت) و یا اینکه از آرایهای از رشتهها استفاده کنید و خروجی نیز همانطور که مشاهده کردید، یک آرایه است.
این فانکشن، برعکس compact عمل میکند و از یک آرایه، متغیرهایی میسازد. نام هر متغیر، از کلیدهای آرایه (keys) گرفته شده و مقدار متغیر به مقادیر (values) بستگی دارد.
$arr = [ 'name' => 'john', 'age' => 27 ]; extract($arr); echo $name . ' is ' . $age;
پارامتر دوم این فانکشن، اختیاری و مربوط به flagهاست:
برای مشاهدهی دیگر فلگها به برگهی مربوط به extract در مستندات PHP مراجعه کنید.
کلاسی به نام View ساختهایم که با استفاده از compact و extract میتواند یک قالب را با دادههای واردشده نشان دهد:
$title = 'Hello, world!'; $author = 'WebPajooh'; View::make('view1', compact('title', 'author'));
کدهای این مثال را به طور کامل در این مخزن آپلود کردهام و دیدن کدهای کوتاه اما مهم View.php را توصیه میکنم.
اگر ورودی این فانکشن را از کاربر بگیرید، خطر در کمین شماست! در مستندات آمده است:
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 را فراموش نکنید!