ویژگی تصویر

تابع extract() در PHP — معرفی و کاربردها

  /  PHP   /  تابع extract() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع extract() در PHP به شما اجازه می‌دهد تا عناصر یک آرایهٔ انجمنی (associative array) را به متغیرهای محلی تبدیل کنید. این تابع در توسعهٔ سریع، قالب‌سازی (templating) و برخی الگوهای طراحی مفید است، اما دارای ریسک‌های امنیتی و نکات ظریف رفتاری نیز هست که در ادامه بررسی می‌کنیم.

نحو و پارامترها

قالب عمومی تابع:

int extract(array &$array, int $flags = EXTR_OVERWRITE, string $prefix = "")

توضیح پارامترها:

  • $array: آرایه‌ای که کلیدهای آن نام متغیرهایی می‌شوند که ساخته می‌شوند.
  • $flags: نوع رفتار هنگام برخورد با نام‌های متغیر تکراری یا نام‌های نامعتبر. مقادیر متداول شامل EXTR_OVERWRITE، EXTR_SKIP، EXTR_PREFIX_ALL، EXTR_PREFIX_SAME و… هستند.
  • $prefix: وقتی پرچمی نیاز به پیشوند داشته باشد، این مقدار استفاده می‌شود (مثلاً EXTR_PREFIX_ALL).

تابع عدد صحیحی برمی‌گرداند که تعداد متغیرهای استخراج‌شده است.

مثال ساده

$data = ['name' => 'Ali', 'age' => 30];
extract($data);
echo $name; // outputs 'Ali'
echo $age;  // outputs 30

در این مثال متغیرهای $name و $age در فضای محلی ایجاد می‌شوند و می‌توان مستقیم از آن‌ها استفاده کرد.

پرچم‌ها و رفتارها (Flags)

در جدول زیر برخی پرچم‌های مهم و توضیحات آن‌ها آمده است:

پرچمرفتار
EXTR_OVERWRITEبه‌صورت پیش‌فرض؛ متغیرهای موجود بازنویسی می‌شوند.
EXTR_SKIPچنانچه متغیری از قبل وجود داشته باشد، آن را نادیده می‌گیرد و بازنویسی نمی‌کند.
EXTR_PREFIX_SAMEاگر نامی تکراری باشد، با استفاده از پیشوند، متغیر جدید ساخته می‌شود.
EXTR_PREFIX_ALLبرای همهٔ کلیدها پیشوند اضافه می‌کند.
EXTR_PREFIX_INVALIDفقط برای نام‌های نامعتبر (مثلاً کلیدهای شروع‌شونده با عدد) پیشوند می‌زند.
EXTR_IF_EXISTSفقط در صورتی متغیر ساخته/بازنویسی می‌کند که از قبل آن متغیر وجود داشته باشد.
EXTR_REPLACE / EXTR_PREFIX_REPLACEجایگزین‌های دیگری برای کنترل بازنویسی و پیشوندگذاری.

مثال‌های پیشرفته و نکات عملی

// بازنویسی پیش‌فرض (مخاطره‌آمیز اگر متغیرهای مهم وجود دارند)
$a = 'original';
$data = ['a' => 'new', 'b' => 5];
extract($data);
// $a اکنون 'new' است

در این مثال، متغیر $a بازنویسی می‌شود. برای جلوگیری از این مشکل می‌توان از EXTR_SKIP استفاده کرد:

// جلوگیری از بازنویسی متغیرهای موجود
$a = 'original';
$data = ['a' => 'new', 'b' => 5];
extract($data, EXTR_SKIP);
// $a هنوز 'original' است

مثال با پیشوند برای ایمن‌تر کردن نام‌ها (مثلاً در قالب‌ها):

$viewData = ['title' => 'Home', 'user' => 'Sara'];
extract($viewData, EXTR_PREFIX_ALL, 'v_');
// متغیرها: $v_title, $v_user

این روش به‌ویژه در سیستم‌های قالب‌سازی (template engines) مفید است تا از تصادم نام‌ها جلوگیری شود.

موارد امنیتی و بهترین شیوه‌ها

  • هرگز مستقیم آرایه‌های ورودی کاربر مثل $_GET، $_POST یا $_REQUEST را بدون فیلتر و پیشوند extract نکنید. مهاجم می‌تواند با ارسال پارامترهایی متغیرهای حساس را دستکاری کند.
  • در صورت نیاز به استخراج داده‌های کاربر، از whitelist استفاده کنید: کلیدهای مجاز را صراحتاً انتخاب کرده و سپس extract را روی آرایهٔ فیلترشده اجرا کنید.
  • گزینهٔ بهتر اغلب این است که به‌صورت صریح مقادیر را تخصیص دهید (مثلاً $name = $data[‘name’] ?? null) تا کد خواناتر و امن‌تر باشد.
  • در قالب‌ها، استفاده از EXTR_PREFIX_ALL یا EXTR_PREFIX_INVALID همراه با پیشوند معنادار، ریسک برخورد نام‌ها را کاهش می‌دهد.

مثال: استخراج امن با whitelist

$input = $_POST;
$allowed = ['name', 'email'];
$filtered = array_intersect_key($input, array_flip($allowed));
extract($filtered, EXTR_PREFIX_ALL, 'in');
// حالا فقط $in_name و $in_email ساخته شده‌اند

در این کد ابتدا فقط کلیدهای مجاز فیلتر شده‌اند و سپس با پیشوند in_ استخراج صورت گرفته است تا متغیرهای ناخواسته ساخته نشوند.

کاربردهای معمول و نکات عملکردی

کاربردهای متداول extract عبارتند از:

  • تزریق متغیرها در قالب‌های HTML/PHP برای ساده‌تر شدن نوشتن قالب.
  • کاهش کد تکراری هنگام نگارش تست‌ها یا نمونه‌سازی سریع.
  • تبدیل آرایه‌های پیکربندی به متغیرهای محلی برای دسترسی کوتاه‌تر.

از نظر عملکرد، extract هزینهٔ کمی به دنبال دارد اما تفاوت آن با دسترسی مستقیم به عناصر آرایه معمولاً ناچیز است. با این حال برای خوانایی و امنیت، استفاده صریح ترجیح داده می‌شود.

مثال: استفاده در قالب (template)

// controller.php
$data = ['title' => 'About', 'content' => '...'];
include 'view.php';

// view.php
extract($data, EXTR_PREFIX_ALL, 't_');
echo "<h1>{$t_title}</h1>";

در این الگو، کنترلر آرایه‌ای از داده‌ها را فراهم می‌کند و در فایل view با پیشوند t_ استخراج می‌شود تا نام‌ها با متغیرهای محلی view برخورد نکنند.

خلاصه و توصیه‌ها

تابع extract ابزار قدرتمندی برای کاهش کدنویسی سریع است، اما باید با احتیاط و آگاهی استفاده شود. همواره موارد زیر را مدنظر داشته باشید:

  • از استخراج مستقیم داده‌های کاربر خودداری کنید یا حتماً فیلتر/پیشوند استفاده کنید.
  • در پروژه‌های بزرگ و حساس همچون اپلیکیشن‌های تولید، به جای extract از انتساب‌های صریح و خواناتر استفاده کنید.
  • از پرچم‌هایی مانند EXTR_SKIP، EXTR_PREFIX_ALL یا EXTR_IF_EXISTS برای جلوگیری از مشکلات ناخواسته بهره ببرید.

با در نظر گرفتن این نکات، extract می‌تواند ابزاری مفید در جعبه‌ابزار PHP شما باشد، به‌خصوص برای قالب‌سازی یا نمونه‌سازی سریع.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: