ویژگی تصویر

تابع isset() در PHP

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

تابع isset() یکی از ابزارهای پایه‌ای و پراستفاده در PHP است که برای بررسی «وجود» و «غیر-null بودن» متغیرها یا اندیس‌های آرایه به کار می‌رود. در این مقاله به‌صورت دقیق رفتار، موارد استفاده، تفاوت‌ها با توابع مشابه و نکات ظریف پیرامون isset() را بررسی می‌کنیم و چند مثال عملی و قابل اتکا خواهیم آورد.

تعریف و رفتار پایه‌ای

isset(mixed $var): bool — این تابع مقدار true برمی‌گرداند اگر متغیر تعریف شده باشد و مقدارش null نباشد. در غیر این صورت false برمی‌گرداند. نکته مهم: isset یک زبان‌ساخت (language construct) است و برخلاف دسترسی مستقیم به متغیر، خطای Notice برای متغیر تعریف‌نشده ایجاد نمی‌کند.

مثال ساده

<?php
$a = 0;
$b = null;
var_dump(isset($a)); // true
var_dump(isset($b)); // false
var_dump(isset($c)); // false — بدون Notice
?>

در این مثال: $a وجود دارد و مقدار 0 است (که معتبر و غیر-null محسوب می‌شود)، بنابراین isset($a) برابر true است. $b مقدار null دارد، پس false برمی‌گردد. برای $c که هرگز تعریف نشده هم false برمی‌گردد ولی هیچ اخطاری تولید نمی‌شود.

بررسی چند متغیر با یک isset

isset می‌تواند چند آرگومان هم بگیرد: isset($a, $b, $c). در این حالت اگر و فقط اگر همه متغیرها تعریف شده و غیر-null باشند، true برمی‌گرداند.

<?php
$a = 1;
$b = 2;
var_dump(isset($a, $b)); // true
$c = null;
var_dump(isset($a, $b, $c)); // false
?>

کاربرد این حالت وقتی است که بخواهیم به‌صورت همزمان چند ورودی را چک کنیم، مثلاً پارامترهای ضروری یک فرم.

isset و آرایه‌ها

برای بررسی وجود یک کلید در آرایه نیز می‌توان از isset استفاده کرد. اما توجه کنید که اگر کلید وجود داشته باشد ولی مقدارش null باشد، isset کلید را غیرموجود حساب می‌کند.

<?php
$data = ['name' => 'Ali', 'age' => null];
var_dump(isset($data['name'])); // true
var_dump(isset($data['age']));  // false
var_dump(array_key_exists('age', $data)); // true
?>

برای زمانی که می‌خواهید تشخیص دهید آیا کلید در آرایه تعریف شده حتی اگر مقدارش null باشد، از array_key_exists استفاده کنید (مقایسه بعدی را ببینید).

isset در برابر empty و is_null و array_key_exists

تابعرفتارمناسب برای
isset()بررسی وجود و غیر-null بودنچک‌کردن وجود مقدار معتبر
empty()بررسی «خالی» بودن (0, “”, null, false, [], و غیره) — بدون Noticeچک‌کردن مقادیر قابل‌اعتبار به لحاظ محتوایی
is_null()بررسی دقیق null بودن — متغیر باید وجود داشته باشدوقتی می‌خواهید مطمئن شوید مقدار null است
array_key_exists()بررسی وجود کلید در آرایه حتی اگر مقدارش null باشدوقتی null هم مقدار معتبر محسوب می‌شود

مثال عملی: استفاده در پردازش فرم

<?php
// فرض کنید فرم با متد POST ارسال شده
$name = isset($_POST['name']) ? $_POST['name'] : 'مهمان';
$email = $_POST['email'] ?? null; // PHP 7+: null coalescing
?>

توضیح: در خط اول از الگوی قدیمی ternary+isset استفاده شده تا اگر نام ارسال نشده، مقدار پیش‌فرض قرار بگیرد. در خط دوم از عملگر null coalescing (??) که معادل مختصر isset است، استفاده شده است. پیشنهاد می‌شود از ?? برای خوانایی و کوتاهی استفاده کنید.

isset و اشیاء — متد جادویی __isset

برای خواص (properties) آبجکت‌ها، اگر یک property وجود داشته باشد اما مقدار آن null باشد، isset آن را false می‌کند. اگر کلاس متد جادویی __isset را پیاده‌سازی کند، هنگام فراخوانی isset روی آن property این متد فراخوانی می‌شود و می‌تواند رفتار سفارشی برگرداند.

<?php
class User {
  private $data = ['name' => 'Sara'];
  public function __isset($prop) {
    return array_key_exists($prop, $this->data) && $this->data[$prop] !== null;
  }
}
$u = new User();
var_dump(isset($u->name)); // true (فراخوانی __isset)
var_dump(isset($u->email)); // false
?>

در این مثال __isset کنترل وجود و null بودن را برای خواص مجازی انجام می‌دهد. این الگو برای کلاس‌هایی مفید است که داده‌ها را به‌صورت داخلی در آرایه‌ای نگهداری می‌کنند.

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

  • isset خیلی سریع است چون یک ساختار زبان است — مناسب برای چک‌های مکرر در حلقه‌ها.
  • isset هیچ‌گاه Notice برای متغیر تعریف‌نشده تولید نمی‌کند؛ این ویژگی برای پردازش ورودی‌های نامطمئن مفید است.
  • اگر نیاز دارید وجود کلید در آرایه حتی با مقدار null را تشخیص دهید، از array_key_exists استفاده کنید.
  • در PHP 7+ از عملگر ?? (null coalescing) برای جایگزینی الگوهای رایج isset + ternary استفاده کنید؛ خواناتر و خلاصه‌تر است.

مثال: استفاده از ?? به‌جای isset + ternary

<?php
// قدیمی
$username = isset($_GET['user']) ? $_GET['user'] : 'guest';

// بهتر (PHP 7+)
$username = $_GET['user'] ?? 'guest';
?>

در حالت دوم اگر $_GET[‘user’] تعریف نشده یا مقدار null داشته باشد، ‘guest’ جایگزین می‌شود. این روش کوتاه‌تر و کم‌تر در معرض خطا است.

موارد هشدارآمیز

  • isset متغیر را مقداردهی نمی‌کند؛ فقط چک می‌کند.
  • برای زنجیره‌های پیچیده دسترسی به اندیس‌ها بهتر است با is_array یا توابع دیگر ایمنی را بالا ببرید تا از خطاهای منطقی یا نوع داده جلوگیری شود.
  • در نسخه‌های جدید PHP (مثل ویژگی خواص تایپ‌شده و uninitialized properties)، رفتار isset ممکن است با موارد uninitialized متفاوت باشد؛ بنابراین در کلاس‌های حاوی خواص تایپ‌شده مراقب باشید.

جمع‌بندی

isset یک ابزار ضروری و پرکاربرد در PHP است برای تشخیص وجود و غیر-null بودن متغیرها و اندیس‌ها. با شناخت تفاوت آن با توابعی مثل empty یا array_key_exists و آگاهی از قابلیت‌هایی مانند چندآرگومانی و سازگاری با متد جادویی __isset، می‌توانید از آن در کدنویسی امن‌تر و خواناتر استفاده کنید. در پروژه‌های مدرن PHP از عملگر ?? هم استفاده کنید تا الگوهای شرطی مبتنی بر isset را مختصر و مؤثر کنید.

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

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