حوزه و طول عمر متغیر، توابع بی نام در php
در php معمولا حوزه (Scope) متغیرها از جایی که اعلان شدهاند شروع می شود و تا پایان آن صفحه هم دوام میآورند. در واقع حوزه یا Scope نشان میدهد که متغیری که تعریف کردهایم در چه مکانهایی قابل دسترس هست و طول عمر آنها (Life Time) مشخص میکند که تا چه زمان قابل دسترس هستند.
ما دارای دو حوزه می باشیم:
- محلی یا Local
- سراسری یا Global
زمانی که در یک فایل فایل php متغیری ایجاد میکنید، متغیر در طول اجرای آن فایل قابل دسترس هست و دارای حوزه سراسری یا global می باشد. ولی متغیری که در یک تابع تعریف میشود دارای حوزه محلی یا Local میباشد. یعنی فقط درون همان فانکشن قابل دسترس است.
برای مثال فایلی به نام test.php با محتوای زیر ایجاد میکنیم.
$var1 = 'Global varibale'; // متغیر سراسری
function f1() {
$var2 = 'Local Varibale'; // متغیر محلی
}
همانطور که در کد بالا مشخص هست دو متغیر با حوزههای Local و Global داریم.
دسترسی به متغیر سراسری با دستور global
دسترسی به یک متغیر سراسری از داخل یک تابع امکانپذیر نیست. بنابراین اگر در داخل تابع متغیری همنام با متغیر سراسری تعریف کنیم، انگار در درون متغیر یک متغیر جدید با حوزه Local تعریف کردهایم که فقط در داخل تابع قابل دسترس است. مثال زیر را ببینید.
$name = 'Morteza'; // متغیر سراسری
function f1() {
$name = 'Parsa'; // متغیر محلی
echo $name;
}
f1(); // خروجی: Parsa
echo "\n";
echo $name; // خروجی: Morteza
در کد بالا مشاهده میکنید که خروجی مقدار متغیر name که در تابع f1 چاپ میشود مقدار Parsa هست. مقدار Parsa جایگزین مقدار Morteza در متغیر سراسری نشده است، خط آخر ثابت کننده حرف ما میباشد که مقدار خروجی Morteza میباشد.
ولی میتوان با استفاده از کلمه کلیدی global در php به متغیر های سراسری در حوزه های Local دسترسی داشته باشیم. مثال زیر را ببینید
$name = 'Global value'; // متغیر سراسری
function f1() {
global $name;
echo $name;
}
f1(); // خروجی: Global value
در تابع f1 که با استفاده از کلمه کلیدی global توانستیم به متغیر سراسری دسترسی پیدا کنیم.
نکته مهم در استفاده از متغیر های سراسری با استفاده از کلمه کلیدی global این است که هر تغییری در مقدار متغیر سراسری باعث تغییر متغیر اصلی خواهد شد. مثال زیر موضوع را روشن میکند.
$message = 'Hello'; // متغیر سراسری
function f1() {
global $message;
$message .= ' World';
}
f1();
echo $message; // خروجی: Hello World
بعد از فراخوانی تابع f1 رشته World به متغیر message الحاق میشود و روی متغیر سراسری تاثیر میگذارد.
دسترسی به متغیر های سراسری با آرایه سراسری $GLOBALS
روش دیگر در دسترسی به متغیر ها از حوزه سراسری،استفاده از آرایه از پیش تعریف شده GLOBALS است. کد زیر عملکردی مشابه کد بالا دارد.
$message = 'Hello'; // متغیر سراسری
function f1() {
$GLOBALS['message'] .= ' World';
}
f1();
echo $message; // خروجی: Hello World
همانطور که مشخص است از آرایه GLOBALS در php استفاده کردیم. آرایه های سراسری php در هرکجای برنامه قابل دسترس هستند.
بیشتر بخوانید: آرایه ها در php
نکته مهم: در PHP و برخلاف بسیاری از زبانهای برنامهنویسی، ساختارهای کنترلی (مثل حلقه ها و دستورات شرطی) دارای حوزه متغیر شخصی نیستند. بنابراین متغیری که در بلوک کدی شبیه به بلوک زیر تریف شوند، با پایان یافتن اجرای کد از بین نخواهد رفت.
$var1 = 'Global varibale.';
if (true) {
$var1 = 'Global varibale. New value.';
}
echo $var1; // خروجی: Global varibale. New Value.
توابع بینام یا Anonymous Function
این نوع توابع در PHP نسخه 5.3 معرفی شدند که باعث میشود تابع را به عنوان آرگومان انتقال دهیم و یا آنها را به عنوان مقدار متغیرها اختصاص دهیم.
تعریف این توابع مانند توابع معمولی انجام میشود و تنها تفاوتشان در این است که برای توابع بینام، نام مشخص تعیین نمیشود.
این توابع را می توان با ساختار دستوری معمولی عملیات تخصیص به عنوان یک مقدار متغیر تخصیص داد.
$say = function($name) {
echo "Hello $name";
};
$say("Wordl"); // خروجی: Hello World
همانند تعریف توابع معمولی انجام می شود با این تفاوت که نام ندارند و در یک متغیر تعریف میشوند و در هنگام فراخوانی شبیه به فراخوانی یک متغیر با ارسال آرگومان میباشد.
یک تابع بینام میتواند از حوزهای که در آن تعریف شده، متغیر هایی را ارث ببرد. چنین متغیرهای ارث برده شده با کلمه کلیدی use در هدر تابع مشخص میشوند.
$x = 1;
$y = 2;
$callback = function($z) use ($x, $y) {
return $x + $y + $z;
};
echo $callback(3); // عدد 6 چاپ میشود
بیشتر بخوانید: توابع در php قسمت اول
Overloading تابع در PHP
در php شما نمیتوانید یک تابع را چندین مرتبه با پارامترهای متفاوت تعریف کنید. این کار اضافه بار کردن تابع یا Overloading تابع میباشد که به تابع اجاز میدهد تا پارامتر های گوناگونی را مدیریت نماید.
این رفتار در php امکانپذیر نیست اما می توان رفتار مشابهی را به کار گرفت. در php میتوانیم از تابع func_get_args استفاده کنیم تا تعداد پارامتر های تابع به صورت داینامیک تعریف کرده باشیم تا بتوانیم Overloading را شبیه سازی کنیم.
function f1() {
$parameters = func_get_args();
foreach($parameters as $row) {
echo $row;
}
}
f1(2, 3, 6, 6); // خروجی: 2366 چاپ میشود
توابع داخلی یا Built-in Functions
این توابع به صورت پیش فرض در زبان برنامهنویسی php تعریف شده اند و همیشه در دسترس و قابل استفاده هستند. برای مثال تابع abs یا تابع eval نمونه کوچکی از توابع داخلی در php هستند.
این توابع بستگی به extension های فعال شده برای php بستگی دارد. برای مثال extension مربوط به پایگاه داده MySQL باعث میشود تا توابع داخلی مربوط به برقراری ارتباط با پایگاه داده در دسترس قرار بگیرند. اطلاعات تکمیلی درباره فهرست کامل توابع داخلی در PHP در لینک زیر قابل مشاهده است.
https://www.php.net/en/funcref.php