محدوده متغیر

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

   1:<?php
   2:
   3:    function firstLocalVariable()
   4:    {
   5:        $number = 10;
   6:        echo $number;
   7:    }
   8:
   9:    function secondLocalVariable()
  10:    {
  11:        $number = 5;
  12:        echo $number;
  13:    }
  14:
  15:    firstLocalVariable ();
  16:    echo '<br/>';
  17:    secondLocalVariable ();
  18:
  19:?>
10
5

مشاهده می کنید که حتی اگر ما دو متغیر با نام یکسان تعریف کنیم (خطوط 5 و 11) که دارای محدوده های متفاوتی هستند، می توان به هر کدام از آنها مقادیر مختلفی اختصاص داد. متغیر تعریف شده در داخل متد firstLocalVariable() هیچ ارتباطی به متغیر داخل متد secondLocalVariable() ندارد. وقتی به مبحث کلاسها رسیدیم در این باره بیشتر توضیح خواهیم داد. php دارای چهار محدوده است:

  • متغیرهای محلی (Local)
  • متغیرهای سراسری (Global)
  • متغیرهای ایستا (Static)

 

متغیرهای محلی

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

   1:<?php
   2:
   3:    function LocalVariable()
   4:    {
   5:        $number = 10;
   6:        echo $number;
   7:    }
   8:
   9:    LocalVariable ();
  10:    echo $number;
  11:
  12:?>
10
Notice: Undefined variable: number in C:\wamp\www\test.php on line 10

همانطور که مشاهده می کنید با فراخوانی متد در خط 9 مقدار متغیر number چاپ می شود ولی در خط 10 که سعی در چاپ مقدار این متغیر داریم با پیغام خطا مواجه می شویم چون طول عمر این متغیر تا زمانی است که تابع به پایان نرسیده است. با پایان تابع متغیر و مقدار آن هم از بین می رود در نتیجه در خارج از تابع نمی توان مقدار آن را چاپ کرد.

 

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

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

   1:<?php
   2:
   3:    $firstNumber  = 10;
   4:    $secondNumber = 5; 
   5:    $Sum;              
   6:
   7:    function GlobalVariable()
   8:    {
   9:        global $firstNumber,$secondNumber,$Sum;
  10:        $Sum = $firstNumber + $secondNumber;
  11:    }
  12:
  13:    GlobalVariable ();
  14:    echo $Sum;
  15:
  16:?>
15

متغیرهای firstNumber و secondNember و Sum در بیرون تابع تعریف شده اند و از نوع سراسری هستند، در داخل تابع اگر بخواهیم به مقدار آنها دسترسی پیدا کنیم باید ابتدا با کلمه کلیدی global در تابع تعریف کنیم سپس از آن استفاده نماییم.روش دیگر برای دسترسی به متغیرهای سراسری استفاده از آرایه فوق سراسری GLOBALS$ است. یعنی کد بالا را به صورت زیر هم می توان نوشت :

<?php

    $firstNumber  = 10;
    $secondNumber = 5; 
    $Sum;              

    function GlobalVariable()
    {
        $GLOBALS["Sum"] = $GLOBALS["firstNumber"] + $GLOBALS["secondNumber"];
    }

    GlobalVariable ();
    echo $Sum;

?>

در مورد آرایه های فوق سراسری در درس های بعد توضیح می دهیم.
 

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

با اتمام اجرای تابع تمام متغیرها و آن تابع از بین می شوند، به غیر از متغیرهایی که بصورت static تعریف شده باشند، به مثال زیر توجه کنید:

   1:<?php
   2:
   3:    function StaticVariable()
   4:    {
   5:        static $firstNumber  = 10;
   6:        echo $firstNumber . '<br/>';
   7:        $firstNumber ++;
   8:    }
   9:
  10:    StaticVariable();
  11:    StaticVariable();
  12:    StaticVariable();
  13:
  14:?>
10
11
12

همانطور که در کد بالا مشاهده می کنید هر بار که تابع فراخوانی می‌شود، متغیر firstNumber که به صورت static تعریف شده، مقدار قبلی خود را حفظ می کند. بنابراین با هر بار فراخوانی، مقداری آن به اضافه 1 شده و ذخیره می‌گردد.در خطوط 8-3 یک متد و در داخل آن یک متغیر از نوع ایستا (static) تعریف شده است (خط 5). در خطوط 12-10 سه بار متد را فراخوانی کرده ایم. در فراخوانی اول مقدار 10 چاپ می شود. در خط 7 یک واحد به این متغیر اضافه می شود و این مقدار در فراخوانی دوم چاپ می شود (مقدار 11). در فراخوانی سوم هم یک واحد به مقدار قبلی اضافه شده (1+11) و این مقدار یعنی 12 چاپ می شود.

لطفا اگر نظر، پیشنهاد و یا انتقادی در باره مطلب بالا دارید در قسمت زیر مطرح بفرمایید.