ویژگی تصویر

تابع printf() در PHP

  /  PHP   /  تابع printf() در PHP
بنر تبلیغاتی الف
آموزش 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نمایش کاراکتر از کد ASCIIprintf(“%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 یا کلاس‌های حرفه‌ای‌تر را در نظر بگیرید.

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

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