ایجاد: ۱۲:۴۰ ۱۳۹۲/۱۰/۷
ویرایش: ۲۰:۱۷ ۱۳۹۳/۱۲/۱۶

یادداشت‌ها

»

قلمرو متغیرها در پی اچ پی و جاوا اسکریپت

انواع قلمرو متغیر در PHP

خارج از بحث شئ‌گرایی و کلاس، در php یک متغیر تعریف شده در بیرون توابع، در همه جا قابل دسترس است. برای در دسترس بودن یک متغیر در درون یک function لازم است در ابتدای تعریف تابع نام آن متغیرها با کلیدواژه global معرفی شوند:
$a=1;
$b=2;
function{
    global $a, $b;
    ...
}
در مورد متغیرها و متدهای یک کلاس نیز قبلا در جزوه آموزش مبحث شئ‌گرایی در PHP توضیحات کافی داده شد.

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

function counter(){
    static $c=0;
    $c++;
    echo $c;
}
counter(); // echo 1
counter(); // echo 2
counter(); // echo 3

انواع قلمرو متغیر در JavaScript

در جاوا اسکریپت، قلمرو متغیرها را توابع تعیین می‌کنند. متغیرهای بیرون توابع، سراسری هستند. متغیرهای تعریف شده داخل توابع با کلیدواژه var، فقط در همان تابع و توابع زیرمجموعه آن قابل دسترسی هستند. اگر در یک تابع متغیری بدون کلیدواژه var تعریف شود، سراسری خواهد بود. به این مثال توجه کنید:
var global = 'یک متغیرعمومی و سراسری';
function scopeFunction() {
   alsoGlobal = 'تعریف شده var این متغیر نیز سراسری است (البته به شرط اجرای تابع فوق) چون بدون کلیدواژه';
   var notGlobal = 'این متغیر فقط در این تابع و توابع زیرمجموعه آن قابل دسترسی است';
   function subFunction() {
      alert(notGlobal); // این تابع زیرمجموعه تابع فوق است لذا به متغیر خصوصی آن دسترسی دارد
      stillGlobal = 'متغیر عمومی - البته به شرط اجرای تابع فوق';
      var isPrivate = 'subFunction متغیری خصوصی فقط برای همین تابع';
   }
   alert(stillGlobal); // منجر به بروز خطا میشود چون هنوز تابع مربوطه اجرا نشده که این متغیر تعریف شده باشد
   subFunction();
   alert(stillGlobal); // بدون خطا
   alert(isPrivate);   // منجر به بروز خطا میشود چون متغیر مذکور فقط داخل آن تابع قابل دسترس است
   alert(global);      // بدون مشکل اجرا میشود
}
alert(global);      // بدون خطا
alert(alsoGlobal);  // منجر به بروز خطا میشود چون هنوز تابع مربوطه اجرا نشده که این متغیر تعریف شده باشد
scopeFunction();
alert(alsoGlobal);  // بدون خطا
alert(notGlobal);   // منجر به بروز خطا میشود چون متغیر مذکور فقط داخل آن تابع قابل دسترس است

ارسال متغیرها با اشاره‌گر به آدرس (Pass variable by Reference)

زمانی که بخواهیم یک متغیر سنگین (مثل یک آرایه چندبعدی حجیم) را به یک تابع ارسال کنیم، برای بهبود کارایی و سرعت برنامه، روش منطقی این است که بجای خود آن متغیر، آدرس آن را ارسال کنیم:
function a(&$b){...}
$c=array(...);
a($c);
که این امر در بسیاری از زبان‌های برنامه‌نویسی (از جمله PHP) نیز مرسوم است و نکته مهمی هم که در اینجا وجود دارد این است که به دلیل ارسال آدرس، هر تغییری که در آن آرایه درون تابع انجام شود، در واقع به آرایه اصلی اعمال می‌شود. (چون فقط آدرس آن ارسال شده و لذا نام b در کد فوق، صرفا نام دیگر آرایه c است)
اما تفاوت مهمی که جاوا اسکریپت با سایر زبان‌ها دارد؛ این است که جاوا اسکریپت آرایه را همیشه با آدرسش به توابع ارسال می‌کند:
var Arr = [7, 8, 9];
alert(Arr[1]); // عدد هشت را چاپ میکند
function F(myArr){
   myArr[1] = 20;
}
F(Arr);
alert(Arr[1]); // عدد بیست را چاپ میکند
نه فقط برای ارسال به تابع، بلکه در انتساب یک آرایه به یک متغیر دیگر! نیز فقط آدرس آن لحاظ می‌شود و در واقع یک Alias از آن آرایه ایجاد میشود نه یک کپی از آن؛
var Arr = [7, 8, 9];

var NewArr = Arr;
NewArr[1] = 20;

alert(Arr[1]); // عدد بیست را چاپ میکند
شاید این امر برای پرفرمنس بالاتر در زبان js لحاظ شده باشد. به هر حال اگر جایی نیاز به خود آرایه داشتید (مثلا لازم بود خود آرایه را به تابع ارسال کنید یا یک کپی از آرایه ایجاد کنید) لازم است با کمک برخی متدهای آرایه (مثلا slice) یک کپی از آن ایجاد کنید:
var Arr = [7, 8, 9];
alert(Arr[1]); // عدد 8 را چاپ میکند
function F(myArr){
   myArr[1] = 20;
}
F(Arr.slice());
alert(Arr[1]); // عدد 8 را چاپ میکند

var NewArr = Arr.slice();
NewArr[1] = 20;

alert(Arr[1]); // عدد 8 را چاپ میکند

بالا بردن یا hoisting

زمانی که یک متغیر با کمک var در یک قلمرو تعریف می‌شود و همچنین یک تابع، در اینصورت به بالای آن قلمرو منتقل می‌شود. مثلا کد زیر را درنظر بگیرید:

var a = 2;
foo(); // این تابع در اینجا کار میکند چون تعریف تابع به بالای این قلمرو منتقل میشود
function foo() {
    a = 3;
    alert( a );   // 3
    // خط زیر در بالای این قلمرو (ابتدای تابع) درنظر گرفته میشود
    // و باعث میشود متغیری که در خط اول این تابع هست، سراسری نشود
    var a;
}
alert( a );   // 2

یادداشت‌های مرتبط
  1. سرویس های آنلاین رایگان برای نوشتن، تست و بهینه سازی کدهای برنامه نویسی
  2. لیست مواردی که برای امنیت برنامه PHP لازم است چک شود
  3. کاربردهای CURL در پی اچ پی
  4. روش های بهبود کیفیت آپلود فایل ها از طریق فرم های صفحات وب
  5. تشخیص و کشف نوع، نام و مشخصات مرورگر کاربران سایت
  6. دسترسی کامل به عناصر آدرس در جاوا اسکریپت
  7. درباره نود جی اس
  8. افکت های متن با جاوا اسکریپت و جی کوئری
  9. ارسال و دریافت ایمیل با PHP و ساختن اکانت ایمیل
  10. خطا در جاوا اسکریپت
  11. پایگاه داده در جاوا اسکریپت
  12. روش ها و تکنیک های پنهان کردن ایمیل
  13. تجزیه و ترکیب URL در PHP
  14. نکاتی در مورد نسخه جدید PHP 5.5
  15. زوم (zoom) و بزرگنمایی تصویر و متن با جاوا اسکریپت و پی اچ پی
  16. کشف فونت های نصب شده در کلاینت
  17. بازی با زمان!
  18. کار با تصاویر در سمت کاربر
  19. بهینه سازی آنلاین سی اس اس و جاوا اسکریپت
  20. استفاده از Media Queries ها و اصلاح عدم پشتیبانی IE6-8
  21. چند لینک جامع برای یادگیری جاوا اسکریپت
  22. انواع راه های تولید کد QR با پی اچ پی و جاوا اسکریپت

مدیریت

نام وسیله

اعتبار ورود

نام کاربری

رمز عبور

رمز یکبارمصرف

... لیست تمام یادداشت‌ها

تبلیغات

ربات‌های تلگرامی:
مجموعه ربات‌های تلگرامی ما برای ساده‌تر کردن کار با تلگرام و مدیریت کانال
دامنه‌های فروشی:
دامنه‌های زیر مربوط به ما یا مشتریان ماست که قابل واگذاری هستند. در صورت تمایل به داشتن یکی از آنها، با این اکانت تلگرامی مکاتبه نمایید.

دامنه‌هایی که می‌تواند مصرف تخصصی داشته باشد:
AnyDesk.ir, Firebase.ir, Angularjs.ir, 9px.ir alAdmin.ir, iQore.ir notion.ir, 3dn.ir,

دامنه‌هایی که می‌تواند مصرف فرهنگی/مذهبی داشته باشد:
mavaez.ir, 2aha.ir, babolelm.ir, mahjoor.ir

دامنه‌هایی که می‌تواند مصرف شخصی/عمومی داشته باشد:
azizami.ir, 90blog.ir