محدوده متغیرها در PHP

محدوده متغیرها در PHP

PHP Variable Scope
محدوده متغیر چیست؟
محدوده یا Scope مشخص می‌کند یک متغیر در کدام قسمت از برنامه قابل دسترسی و استفاده است. یک متغیر ممکن است در کل فایل PHP قابل استفاده باشد یا فقط در داخل یک تابع در دسترس باشد.

انواع محدوده متغیرها در PHP

به‌طور کلی در PHP با سه نوع مهم از محدوده متغیرها روبه‌رو هستیم:

  • متغیرهای محلی
  • متغیرهای سراسری
  • متغیرهای استاتیک
نوع متغیر محدوده دسترسی ویژگی
محلی داخل تابع فقط در همان تابع قابل استفاده است
سراسری خارج از توابع برای استفاده داخل تابع باید به آن دسترسی داده شود
استاتیک داخل تابع مقدار خود را بین فراخوانی‌های تابع حفظ می‌کند

متغیر محلی

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

<?php

function myFunction() {
$name = "Ali";
echo $name;
}

myFunction();

?>

خروجی

Ali

متغیر $name داخل تابع ایجاد شده است؛ بنابراین خارج از آن تابع در دسترس نیست.

دسترسی نداشتن به متغیر محلی خارج از تابع

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

<?php

function myFunction() {
$name = "Ali";
}

myFunction();

echo $name;

?>
توجه: متغیر $name در داخل تابع تعریف شده است و خارج از تابع قابل استفاده نیست. بنابراین استفاده از آن در خارج از تابع باعث ایجاد خطا یا هشدار مربوط به متغیر تعریف‌نشده می‌شود.

متغیر سراسری

اگر متغیری خارج از تابع تعریف شود، به آن متغیر سراسری یا Global گفته می‌شود. این متغیر در محدوده اصلی برنامه قرار دارد.

<?php

$name = "Ali";

function myFunction() {
echo $name;
}

myFunction();

?>

در این مثال ممکن است انتظار داشته باشیم مقدار $name داخل تابع نیز در دسترس باشد؛ اما متغیرهای سراسری به‌صورت خودکار داخل توابع قابل دسترسی نیستند.

نکته مهم: محدوده متغیر در PHP به محل تعریف آن وابسته است. تعریف یک متغیر خارج از تابع به این معنی نیست که آن متغیر بدون هیچ دستور اضافی داخل همه توابع قابل استفاده خواهد بود.

استفاده از کلمه کلیدی global

برای دسترسی به یک متغیر سراسری از داخل یک تابع می‌توان از کلمه کلیدی global استفاده کرد.

<?php

$name = "Ali";

function myFunction() {
global $name;
echo $name;
}

myFunction();

?>

خروجی

Ali

با نوشتن global $name; داخل تابع، PHP می‌فهمد که منظور همان متغیر سراسری $name است.

استفاده از چند متغیر سراسری

می‌توان چند متغیر سراسری را نیز در یک تابع در دسترس قرار داد.

<?php

$firstName = "Ali";
$lastName = "Ahmadi";

function showName() {
global $firstName, $lastName;

```
echo $firstName . " " . $lastName;
```

}

showName();

?>

خروجی

Ali Ahmadi

تغییر مقدار متغیر سراسری داخل تابع

با استفاده از global می‌توان مقدار متغیر سراسری را نیز از داخل تابع تغییر داد.

<?php

$count = 10;

function increaseCount() {
global $count;
$count = 20;
}

increaseCount();

echo $count;

?>

خروجی

20

متغیرهای استاتیک

متغیر استاتیک متغیری است که داخل یک تابع تعریف می‌شود، اما برخلاف یک متغیر محلی معمولی، مقدار خود را پس از پایان اجرای تابع حفظ می‌کند.

برای تعریف چنین متغیری از کلمه کلیدی static استفاده می‌شود.

<?php

function counter() {
static $count = 0;

```
$count++;

echo $count . "<br>";
```

}

counter();
counter();
counter();

?>

خروجی

1
2
3

در این مثال، متغیر $count پس از پایان هر بار اجرای تابع مقدار خود را حفظ می‌کند. بنابراین در فراخوانی دوم مقدار آن از 1 به 2 و در فراخوانی سوم به 3 می‌رسد.

نکته مهم: متغیر static همچنان محلی است و خارج از تابع قابل دسترسی نیست؛ تفاوت آن این است که مقدارش بین فراخوانی‌های تابع حفظ می‌شود.

مقایسه متغیر معمولی و استاتیک

<?php

function normalCounter() {
$count = 0;
$count++;

```
echo $count . "<br>";
```

}

function staticCounter() {
static $count = 0;
$count++;

```
echo $count . "<br>";
```

}

normalCounter();
normalCounter();

echo "
"; staticCounter(); staticCounter(); ?>

خروجی

1
1

1
2

در تابع اول، متغیر در هر بار اجرای تابع دوباره مقداردهی می‌شود؛ اما در تابع دوم، متغیر استاتیک مقدار قبلی خود را حفظ می‌کند.

یک مثال کاربردی

فرض کنید می‌خواهیم تعداد دفعات اجرای یک عملیات را در یک تابع بشماریم. متغیر استاتیک برای چنین کاری بسیار مناسب است.

<?php

function visitCounter() {
static $visits = 0;

```
$visits++;

echo "This function has been called " . $visits . " times.<br>";
```

}

visitCounter();
visitCounter();
visitCounter();

?>

خروجی

This function has been called 1 times.
This function has been called 2 times.
This function has been called 3 times.

نکات مهم این درس

  • محدوده متغیر مشخص می‌کند متغیر در کدام قسمت برنامه قابل دسترسی است.
  • متغیری که داخل تابع ایجاد شود، معمولاً محلی است.
  • متغیرهای تعریف‌شده خارج از تابع، سراسری هستند.
  • متغیر سراسری به‌صورت خودکار داخل تابع قابل استفاده نیست.
  • با کلمه کلیدی global می‌توان متغیر سراسری را داخل تابع در دسترس قرار داد.
  • متغیرهای static داخل تابع قرار دارند اما مقدار خود را بین فراخوانی‌های تابع حفظ می‌کنند.
  • انتخاب محدوده مناسب متغیر باعث خوانایی و مدیریت بهتر برنامه می‌شود.

تمرین

برنامه‌ای بنویسید که یک تابع برای شمارش تعداد دفعات اجرای خود داشته باشد.
  1. یک متغیر static برای شمارنده ایجاد کنید.
  2. در هر بار اجرای تابع، مقدار شمارنده را یک واحد افزایش دهید.
  3. تابع را پنج بار اجرا کنید.
  4. در هر بار اجرا، شماره اجرای فعلی را نمایش دهید.

جمع‌بندی

محدوده متغیرها یکی از مفاهیم مهم PHP است. متغیرهای محلی فقط در محدوده تابع خود قابل استفاده هستند، متغیرهای سراسری خارج از توابع تعریف می‌شوند و برای دسترسی به آن‌ها از داخل تابع می‌توان از global استفاده کرد. همچنین متغیرهای استاتیک با وجود محلی بودن، مقدار خود را بین فراخوانی‌های مختلف تابع حفظ می‌کنند.

درس بعدی: در درس بعد با روش‌های نمایش خروجی در PHP و استفاده از echo و print آشنا می‌شویم.