تابع printf() در PHP
تابع printf() یکی از توابع پردازش و نمایش رشتهها در PHP است که قالببندی (formatting) خروجی را شبیه توابع printf در زبان C امکانپذیر میکند. این تابع برای نمایش مقادیر با کنترل دقیق بر قالب (مانند عرض، دقت اعشار، پرکردن با صفر و غیره) بسیار مفید است.
نحو کلی و رفتار تابع
نحو عمومی:
int printf(string $format [, mixed $args [, mixed $... ]])این تابع متن قالب را پردازش کرده، مقادیر جایگزین را در آن قرار میدهد و نتیجه را مستقیماً به خروجی میفرستد. مقدار بازگشتی تعداد بایتهای نوشته شده است (طول خروجی).
مزایا و موارد کاربرد
- قالببندی دقیق اعداد اعشاری و رشتهها.
- قابلیت تعیین عرض حداقل، پرکردن با کارکتر خاص یا صفر.
- مناسب برای تولید متنهای قالببندی شده در گزارشها یا لاگها.
- وقتی نیاز به رشته خروجی دارید اما میخواهید آن را ذخیره کنید، از sprintf استفاده کنید (sprintf مشابه printf است اما مقدار را برمیگرداند).
نمونه پایه — چاپ رشته و عدد
<?php
$price = 29.95;
printf("Price: $%0.2fn", $price);
?>در این مثال “%0.2f” مشخص میکند که عدد اعشاری با 2 رقم بعد از ممیز نمایش داده شود و در صورت نیاز با صفر پر شود. خروجی: Price: $29.95
ساختار فرمت (Format string)
هر جایگیر (placeholder) در قالب معمولاً از اجزای زیر تشکیل میشود:
- argnum$ (اختیاری) — شماره آرگومان برای جابجایی ترتیب
- flags — پرچمهایی مانند “-“, “+”, “0”, ” ” و “#”
- width — حداقل عرض فیلد
- .precision — دقت برای اعداد اعشاری یا حداکثر طول برای رشتهها
- specifier — نوع داده مانند s, d, f, x و …
پرچمها و گزینههای رایج
- – : چپچین کردن محتوا در فیلد
- 0 : پر کردن با صفر تا رسیدن به عرض تعیینشده
- + : همیشه نشانگر علامت را نمایش میدهد (+ یا -)
- (space) : در صورت مثبت بودن عدد، یک فاصله قرار میدهد
- # : برای برخی مبدلها پیشوند مناسب اضافه میکند (مثلاً 0x برای hex)
نمونه پیشرفته — عرض و دقت و پرچمها
<?php
$val1 = 123;
$val2 = 3.14159;
printf("Int: |%08d|n", $val1); // پرکردن با صفر تا طول 8
printf("Float: |%7.2f|n", $val2); // حداقل عرض 7 با 2 رقم اعشار
printf("Left: |%-10s|n", "left"); // چپچین در عرض 10
?>توضیح: مثال اول عدد صحیح را با صفر از سمت چپ تا عرض 8 پر میکند. مثال دوم عدد اعشاری را با دو رقم اعشار و حداقل عرض 7 نمایش میدهد. مثال سوم رشته را در فیلدی به عرض 10 چپچین میکند.
استفاده از آرگومانهای مرتبشده (positional arguments)
<?php
printf("%2$s %1$sn", "first", "second"); // خروجی: second first
?>با استفاده از argnum$ میتوان ترتیب آرگومانها را در رشته قالببندی تغییر داد — کاربردی برای ترجمهها یا زمانی که ترتیب در زبانهای مختلف متفاوت است.
مقایسه کوتاه با sprintf و vprintf
- printf — نتیجه را چاپ میکند و طول خروجی را برمیگرداند.
- sprintf — مشابه printf اما خروجی را به صورت رشته برمیگرداند (برای ذخیره یا پردازش بیشتر).
- vprintf — مانند printf اما آرایهای از آرگومانها را میپذیرد (برای زمانی که آرگومانها دینامیکاند).
جدول خلاصه مبدلهای معمول (format specifiers)
| مبدل | معنی | مثال |
|---|---|---|
| %s | رشته (string) | printf(“%s”, “text”) |
| %d, %i | عدد صحیح دهدهی (integer) | printf(“%d”, 42) |
| %f | عدد اعشاری (float) | printf(“%.2f”, 3.14) |
| %o | عدد به صورت اکتال | printf(“%o”, 10) |
| %x, %X | هگزادسیمال (lower/upper) | printf(“%x”, 255) |
| %c | نمایش کاراکتر از کد ASCII | printf(“%c”, 65) |
| %% | یکی از علامتهای درصد | printf(“%%”) |
نکات امنیتی و بهترین شیوهها
- به هیچ وجه قالب (format) را مستقیماً از ورودی کاربر نگیرند. فرمت میتواند اکسپلویت یا خطا ایجاد کند. اگر نیاز دارید ورودی کاربر را چاپ کنید، از printf(“%s”, $userInput) استفاده کنید تا از تفسیر نگهداری شود.
- برای قالببندی اعداد برای نمایش محلی (locale-aware) از توابع مانند number_format یا کلاس NumberFormatter از افزونه intl استفاده کنید؛ printf به صورت پیشفرض براساس لوکال، جداکننده هزارگان را اضافه نمیکند.
- برای عملکرد: اگر فقط قرار است یک رشته ساده را چاپ کنید، echo سریعتر از printf است. از printf زمانی استفاده کنید که قالببندی لازم است.
مثال: جلوگیری از آسیبپذیری قالببندی
<?php
// ناامن: قالب مستقیماً از ورودی کاربر
$format = $_GET['fmt'] ?? '%s';
printf($format, "data");
// امنتر: همیشه قالب کنترلشده
$user = $_GET['name'] ?? 'guest';
printf("Name: %sn", $user);
?>در مثال اول، ورودی کاربر میتواند قالب خطرناک ارسال کند و باعث رفتارهای ناخواسته یا خطا شود. در مثال دوم قالب ثابت است و تنها مقدار کاربر به عنوان رشته چاپ میشود.
بهینهسازی و نکات حرفهای
- برای تولید خروجیهای بزرگ از توابع خروجیسازی پُرسرعتتر یا buffering استفاده کنید تا فراخوانیهای متعدد printf باعث افت کارایی نشوند.
- برای قالبهای تکرارشونده، از sprintf برای ساخت رشته و سپس یک بار echo کردن آن استفاده کنید تا خوانایی و قابلیت تست افزایش یابد.
- در توسعه بینالمللیسازی (i18n)، از positional specifiers (%2$s) استفاده کنید تا ترجمهها بتوانند ترتیب آرگومانها را تغییر دهند.
نتیجهگیری
تابع printf() در PHP ابزاری قدرتمند برای چاپ رشتهها و اعداد با قالببندی دقیق است. در موقعیتهایی که نیاز به کنترل کامل روی نمایش دارید بسیار مناسب است؛ ولی باید با احتیاط (خصوصاً از نظر امنیتی و سازگاری با locale) استفاده شود. در مواردی که نیاز به ذخیره خروجی دارید یا بهینهسازی مدنظر است، توابع جایگزینی مثل sprintf و number_format یا کلاسهای حرفهایتر را در نظر بگیرید.
آیا این مطلب برای شما مفید بود ؟



