آشنایی با scope یا حوزه تعریف متغیرها در php

تاریخ: 14 تیر 1399

قبلا به صورت مفصل در مورد متغیرها در php صحبت کردیم.

یکی از مفاهیم مهم در مورد متغیرها، حوزه تعریف متغیرها می باشد. حوزه تعریف متغیر یا 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

 

آموزش بعدی >> آشنایی با انواع داده ها در php

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

طراحی افزونه وردپرس