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

در php سه نوع حوزه دسترسی وجود دارد:

  • سطح دسترسی محلی – local scope
  • سطح دسترسی عمومی – global scope
  • سطح دسترسی ایستا – static scope

سطح دسترسی محلی – local scope

زمانی که یک متغیر را درون یک تابع تعریف می کنیم، سطح دسترسی آن محلی و فقط درون همان تابع می باشد.

function name()
{
$x = 123;
echo $x;
}
 
name(); //output: 123

متغیر x در خارج از تابع قابل دسترسی نمی باشد و چنانچه از آن استفاده کنیم برای اجرا کننده برنامه ناشناخته خواهد بود:

function name()
{
$x = 123;
}
 
name();
 
echo $x; //output: error on undefined variable

تغییری که بر روی متغیر محلی انجام می دهیم تاثیری بر روی متغیر های خارج تابع ندارد:

$x = 2;
 
function name()
{
    $x = 1;
}
 
name();
 
echo $x; //output: 2

نکته:

در مورد متغیرهای محلی باید این نکته را در نظر داشته باشیم که php بعد از اتمام تابع و برای آزاد کردن حافظه، متغیرهای محلی را حذف می کند لذا در خارج از تابع قابل دسترس نیستند. (الا اینکه عمومی شوند)

سطح دسترسی عمومی یا global scope

اگر یک متغیر را خارج از تابع تعریف کنیم، سطح دسترسی آن عمومی می باشد.

$x = 2; //global variable
 
function name()
{
    $x = 1; //local variable
}
 
name();
 
echo $x; //output: 2

از متغیر عمومی فقط می توانیم خارج از تابع استفاده کنیم. اگر داخل تابع استفاده کنیم تعریف شده نبوده و با خطا مواجه خواهیم شد:

$x = 2; //global variable
$z = 3; //global variable
 
function name()
{
    echo $x+$z;
}
 
name(); //output: Error :: x, y is undefined variable

متغیرهای عمومی در حوزه عمومی فایل های ایمپورت شده در ادامه اسکریپت هم قابل دسترسی هستند:

$a = 2;
 
include 'header.php'; //we can use $a variable in header.php file

کلمه کلیدی global

این کلمه دو کاربرد اساسی دارد:

  1. با استفاده از آن می توانیم یک متغیر global را در سطح دسترسی محلی (درون تابع) استفاده کنیم:
$x = 2; //global variable
$z = 3; //global variable
 
function name()
{
    global $x, $z;
    echo $x+$z;
}
 
name(); //output: 5

2. با استفاده از آن می توانیم یک متغیر local را در سطح دسترسی عمومی (خارج از تابع) استفاده کنیم:

function name()
{
    global $x;
    $x = 2; //local variable
}
 
name();
 
echo $x; //output: 2

راه دیگر برای دسترسی متغیر عمومی در درون تابع (سطح دسترسی محلی) استفاده از آرایه ی GLOBALS$ می باشد:

$z = 4;
 
function name()
{
    echo $GLOBALS['z'];
}
 
name(); //output: 4

آرایه GLOBALS$ حاوی تمام متغیرهای عمومی از پیش تعیین شده و جدید اسکریپت ما می باشد. با استفاده از آن می توانیم به متغیرهای عمومی در هر حوزه تعریف دسترسی داشته باشیم.زمانی که یک متغیر را با استفاده از آرایه global عمومی می کنیم، آن متغیر به همان متغیر خارجی اشاره دارد:

$x = 4;
$z = 5;
 
function name()
{
    global $x, $z;
    $z = $x+$z;
}
 
name();
 
echo $z; //output: 9

آرایه GLOBALS$ در همه ی حوزه ها قابل استفاده می باشد. چون یک متغیر superglobal می باشد.همچنین حتی اگر متغیری از پیش تعریف شده نباشد، با استفاده از کلمه کلیدی global می توانیم آن را global کرده در هر جای برنامه با سطح دسترسی global آن را استفاده کنیم. هم چنین در همه ی سطح های دسترسی با استفاده از متغیر GLOBALS$ قابل استفاده خواهد بود:

global $x;
$x = 3;
function show_x(){
    echo $GLOBALS['x'];
}
show_x(); //output: 3

اصولا هر جا متغیر را با global بیاوریم، آن متغیر از طریق متغیر GLOBALS$ در همه جا قابل استفاده خواهد بود.

سطح دسترسی ایستا یا static

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

اگر متغیر استاتیک نباشد:

function name()
{
    $x = 4;
    $x++;
    echo $x;
}
 
name(); //output: 5
 
name(); //output: 5
 
name(); //output: 5

اما اگر استاتیک باشد:

function name()
{
    static $x = 4;
    $x++;
    echo $x;
}
 
name(); //output: 5
 
name(); //output: 6
 
name(); //output: 7

 

بدون دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *