تابع isset() در 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 را مختصر و مؤثر کنید.
آیا این مطلب برای شما مفید بود ؟




