ویژگی تصویر

تابع var_export() در PHP

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

تابع var_export() در PHP ابزاری مفید برای تولید نمایشی از یک متغیر است که خروجی آن، «کدی معتبرِ PHP» است. این ویژگی باعث می‌شود بتوانید ساختار داده‌ها را به صورت کدی که مجدداً اجرا شود (eval/include) ذخیره یا در لاگ‌ها قرار دهید. در این مقاله کاربردها، تفاوت‌ها با توابع مشابه، نکات امنیتی و مثال‌های عملی را بررسی می‌کنیم.

چه کاری انجام می‌دهد و چرا مفید است

  • var_export متغیرها (آرایه‌ها، رشته‌ها، اعداد، شیءها و …) را به صورت PHP کدنویسی شده بازمی‌گرداند یا چاپ می‌کند.
  • اگر پارامتر دوم را true قرار دهید، خروجی به جای چاپ شدن به شکل رشته بازگردانده می‌شود.
  • به دلیل تولید کد PHP، می‌توان داده‌ها را در فایل پیکربندی ذخیره کرد و با include یا require دوباره بارگذاری کرد.

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

امضاء تابع به شکل زیر است:

mixed var_export ( mixed $expression [, bool $return = FALSE ] )

پارامترها:

  • $expression: متغیر یا مقدار مورد نظر
  • $return: اگر true باشد، خروجی به عنوان رشته بازگردانده می‌شود؛ در غیر این صورت چاپ می‌شود.

مثال ساده

$arr = ['name' => 'Ali', 'age' => 30];
var_export($arr); // چاپ خروجی
$str = var_export($arr, true); // ذخیره در رشته

در این مثال، var_export آرایه را به صورت array ( ‘name’ => ‘Ali’, ‘age’ => 30, ) تولید می‌کند. وقتی $return=true است، مقدار تولیدی در $str ذخیره می‌شود تا بتوان آن را در فایل یا لاگ نوشت.

ذخیره پیکربندی در فایل PHP

یکی از کاربردهای رایج، تولید فایل پیکربندی است که مستقیماً با include قابل بارگذاری باشد. این روش از eval امن‌تر است چون فایل تولید شده با require بارگذاری می‌شود.

$config = [
    'db' => ['host' => 'localhost', 'user' => 'root', 'pass' => 'secret'],
    'debug' => true
];

file_put_contents('config.php', "<?phpnreturn " . var_export($config, true) . ";n");

توضیح: کد بالا آرایه پیکربندی را به رشته قابل اجرأ PHP تبدیل می‌کند و در فایلی می‌نویسد که با require یا include می‌توان آن را بارگذاری و مقدار بازگشتی را دریافت کرد:

$cfg = require 'config.php';
echo $cfg['db']['host'];

این روش امن‌ترین راه برای بازگرداندن داده‌ها بدون نیاز به eval و با سازگاری بالا است.

کار با اشیاء و متد __set_state()

وقتی var_export شیءها را صادر می‌کند، خروجی به صورت فراخوانی static متد ClassName::__set_state(array(...)) تولید می‌شود. بنابراین برای بازیابیِ صحیح شیءها باید کلاس موردنظر متد استاتیک __set_state را پیاده‌سازی کند.

class Person {
    public $name;
    public $age;

    public static function __set_state($an_array) {
        $obj = new Person();
        $obj->name = $an_array['name'];
        $obj->age = $an_array['age'];
        return $obj;
    }
}

$p = new Person();
$p->name = 'Sara';
$p->age = 28;

$str = var_export($p, true);
echo $str; // خروجی: Person::__set_state(array('name' => 'Sara', 'age' => 28))

توضیح: برای این‌که فایلِ تولیدی هنگام include بتواند شیء را مجدداً بسازد، کلاس باید __set_state را داشته باشد. در غیر این صورت بارگذاری منجر به خطا یا شیء ناقص می‌شود.

تفاوت var_export با var_dump، print_r، serialize و json_encode

ویژگیvar_exportvar_dumpprint_rserializejson_encode
خروجی قابل اجرا به عنوان PHPبلهخیرخیرخیرخیر
قابلیت بازخوانی در PHPبله (با include/require)خیرخیربله (unserialize)بله (json_decode)
قابل استفاده برای نمایش دیباگبلهبله (خلاصه و ساختاری)بله (خوانا)خیر (فشرده و غیرقابل‌خواندن)خیر (فرمت JSON)
تطابق با اشیاءنیاز به __set_stateنمایش کاملنمایش کاملپشتیبانی کاملوابسته به ساختار

محدودیت‌ها و نکات امنیتی

  • var_export خروجی‌ای تولید می‌کند که اگر توسط eval اجرا شود می‌تواند نا امن باشد. به جای eval از produce file + include استفاده کنید.
  • نوع‌هایی مانند resources (مثلاً اتصال به دیتابیس یا فایل باز) قابل صادرات نیستند و در خروجی نمایش داده نمی‌شوند.
  • ارجاعات (references) به صورت دقیق حفظ نمی‌شوند؛ اگر منطق شما وابسته به ارجاعات باشد، var_export ممکن است رفتار را بازسازی نکند.
  • برای اشیاء حاوی داده‌های حساس (رمزها، کلیدها) از ذخیره‌سازی به صورت متن ساده خودداری کنید یا آن‌ها را قبل از صادرات محو/رمزنگاری کنید.

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

  • برای پیکربندی‌های کوچک و ثابت، تولید فایل PHP با var_export ساده و سریع است.
  • برای داده‌های بزرگ یا متقارن (deep graph) بهتر است از serialize یا json_encode همراه با فشرده‌سازی استفاده کنید.
  • همیشه قبل از include فایل تولید شده را اعتبارسنجی کنید و از نوشتن فایل توسط ورودی کاربران جلوگیری کنید.

مثال عملی: تولید و بارگذاری امن پیکربندی

// generate_config.php
$config = ['site' => 'MySite', 'cache' => true];
file_put_contents('app_config.php', "<?phpn// generated confignreturn " . var_export($config, true) . ";n");

// load_config.php
$config = require 'app_config.php';
var_dump($config);

توضیح: این نمونه نشان می‌دهد چگونه یک فایل پیکربندی تولید و سپس با require بارگذاری می‌شود. استفاده از require به مراتب امن‌تر از eval است و خواندن/نوشتن فایل به شما کنترل بیشتری می‌دهد.

جمع‌بندی

تابع var_export ابزاری قدرتمند برای تولید کد PHP از متغیرها است که برای ذخیره پیکربندی‌ها، دیباگ ساختارها و تولید کد قابل اجرا مناسب است. با این حال باید از محدودیت‌ها (عدم پشتیبانی از منابع و ارجاعات دقیق) و ملاحظات امنیتی آگاه باشید. در اغلب موارد ترکیب var_export با file_put_contents و require بهترین و امن‌ترین راه برای ذخیره و بازیابی داده‌ها در پروژه‌های PHP است.

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

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