ویژگی تصویر

تابع is_string() در PHP

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

در PHP تابع is_string() برای بررسی این‌که یک متغیر از نوع رشته (string) است یا نه استفاده می‌شود. این تابع مقدار بولی بازمی‌گرداند: در صورتی که متغیر از نوع string باشد true و در غیر این صورت false.

سینتکس و مقدار بازگشتی

سینتکس تابع ساده است:

bool is_string ( mixed $var )

تابع یک مقدار نوع bool برمی‌گرداند. در خروجی فقط نوع داده بررسی می‌شود و هیچ تبدیل خودکاری انجام نمی‌گیرد.

مثال‌های پایه

<?php
$a = "hello";
$b = 123;
$c = "123";
$d = null;

var_dump(is_string($a)); // true
var_dump(is_string($b)); // false
var_dump(is_string($c)); // true
var_dump(is_string($d)); // false
?>

در این قطعه کد، متغیرهای $a و $c به‌عنوان رشته تشخیص داده می‌شوند، حتی اگر $c محتوای عددی داشته باشد؛ زیرا نوع آن string است.

موارد کاربرد و نکات مهم

  • تشخیص قبل از استفاده از توابع رشته‌ای: قبل از اجرای توابعی مانند strlen یا strpos بهتر است بررسی کنید متغیر رشته باشد تا از هشدارها یا رفتار غیرمنتظره جلوگیری شود.
  • تمایز بین رشته‌ی عددی و عدد: is_string("123") true است اما is_numeric("123") هم true خواهد بود؛ بنابراین هر تابع نقش متفاوتی دارد.
  • اقلامی که تبدیل خودکار نمی‌شوند: اگر متغیر از نوع شیء باشد—even اگر متد __toString() داشته باشد—تابع is_string() مقدار false باز می‌گرداند. برای بررسی چنین اشیایی باید از instanceof Stringable (در PHP 8+) یا روش‌های دیگر استفاده کنید.
  • رشته‌های باینری و encoding: is_string() صرفا نوع را بررسی می‌کند و به encoding یا محتوای چندبایتی توجهی ندارد.

مقایسه با توابع مرتبط

تابعهدف
is_string()بررسی این‌که متغیر دقیقا از نوع string است
is_numeric()بررسی این‌که مقدار عددی یا رشته‌ای عددی است
is_scalar()بررسی آیا متغیر یکی از انواع ساده (int, float, string, bool) هست
gettype()برگرداندن نوع متغیر به‌صورت رشته‌ای

مثال‌های پیشرفته و بررسی اشیاء قابل تبدیل به رشته

<?php
class User {
    private $name;
    public function __construct($name) { $this->name = $name; }
    public function __toString() { return $this->name; }
}

$user = new User("Ali");

// is_string will be false even though object can be cast to string
var_dump(is_string($user)); // false

// explicit cast makes it a string
var_dump(is_string((string)$user)); // true

// In PHP 8+, check for Stringable interface
var_dump($user instanceof Stringable); // true (in PHP 8+ if __toString exists)
?>

در این نمونه، شیء $user متد __toString() دارد، اما به‌عنوان شیء شناخته می‌شود؛ بنابراین is_string($user) خطا یا هشدار نخواهد داد اما false برمی‌گرداند. اگر می‌خواهید رشته‌ای شدن شی را قبول کنید، باید آن را صراحتاً تبدیل کنید یا وجود رابط Stringable را بررسی کنید.

مثال کاربردی: اعتبارسنجی ورودی

<?php
declare(strict_types=1);

function processName($name) {
    if (!is_string($name)) {
        throw new InvalidArgumentException('Name must be a string.');
    }
    // حالا می‌توانیم عملیات رشته‌ای را با خیال راحت انجام دهیم
    return strtoupper($name);
}

echo processName("sara"); // SARA
?>

در اینجا پیش از اعمال توابع رشته‌ای، نوع ورودی چک شده تا از خطا جلوگیری شود. جایگزین این روش در نسخه‌های جدید استفاده از نوع‌دهی در امضا (مثل function processName(string $name)) است که با declare(strict_types=1) خطاهای نوع را به صورت صریح اعمال می‌کند.

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

  • عملکرد: is_string() بسیار سبک و سریع است زیرا فقط نوع متغیر را می‌خواند.
  • اجتناب از چک‌های زائد: اگر از نوع‌دهی پارامتری استفاده می‌کنید یا از فریم‌ورک‌هایی که اعتبارسنجی انجام می‌دهند، ممکن است نیازی به فراخوانی مکرر is_string() وجود نداشته باشد.
  • در پردازش‌های حجیم: استفاده از is_string() در حلقه‌ها مسئله‌ای ندارد اما از تبدیل‌های غیرضروری خودداری کنید (مثلا همیشه (string) نکنید مگر لازم باشد).

الگوهای پیشنهادی

  • اگر می‌خواهید قبول کنید که هم رشته و هم اشیاء قابل تبدیل به رشته معتبرند:
    if (is_string($v) || $v instanceof Stringable) {
        // valid string-like value
    }

    این الگو در PHP 8 و بالاتر مناسب است.

  • برای تضمین نوع در لایه‌های عمومی از type hints استفاده کنید و در لایه ورودی (مثلاً API) جداگانه اعتبارسنجی کنید.

نتیجه‌گیری

تابع is_string() یکی از ابزارهای ساده و مفید برای تشخیص نوع داده در PHP است. این تابع زمانی که نیاز دارید مطمئن شوید عملیاتی مخصوص رشته را روی داده انجام می‌دهید کاربرد زیادی دارد. با این حال، باید تفاوت میان «رشته واقعی» و «قابل تبدیل به رشته» را در نظر داشته و در موارد لازم از تبدیل صریح یا بررسی رابط‌های مرتبط مانند Stringable استفاده کنید.

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

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