رتبه موضوع:
  • 1 رای - 1 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
آموزش مرحله به مرحله PHP - جلسه چهارم
#1
استفاده از توابع در PHP
دومین مفهوم مهم در هر زبان برنامه نویسی (بعد از متغیر)، تابع است. برنامه نویس خوب، کسانی است که برنامه را با استفاده از توابع مختلف می نویسد. توابع به برنامه نویس در درک بهتر برنامه و اشکال زدایی و تغییر آن، کمک می کنند. برای مثال، حالتی را درنظر بگیرید که قرار است اطلاعات خاصی در خروجی نشان داده شود. حال اگر این اطلاعات را بخواهیم در چند قسمت از صفحه نمایش دهیم، باید در مکانهای موردنظر دستورات محاسبه و نمایش اطلاعات را درج کنید. این مسأله ممکن است ما را با مشکل مواجه کند زیرا احتمال بروز خطا، به تعداد دفعات تکرار کد مربوطه، افزایش خواهد یافت. مثلاً اگر کد موردنظر دارای خطا باشد و در 5 قسمت از برنامه آن کد را کپی کرده باشیم، باید هر 5 قسمت را ویرایش کنیم. ضمناً اگر بخواهیم شیوه نمایش اطلاعات را تغییر دهیم و یا هرگونه ویرایش دیگری روی کد موردنظر اعمال کنیم نیز باید هر 5 قسمت را اصلاح نماییم.

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

تعریف تابع
برای تعریف یک تابع در PHP از کلمه کلیدی function استفاده می کنیم و سپس، نام تابع و علامت پرانتز باز و در ادامه، اسامی پارامترهای ورودی تابع را می نویسیم که با کاما , از هم جدا می شوند و درنهایت، علامت پرانتز بسته را ذکر می کنیم. اگر تابع دارای پارامتر ورودی نباشد، فقط به ذکر پرانتزهای باز و بسته اکتفا می کنیم. با این کار، عنوان تابع ایجاد می شود. حال کافی است بدنه تابع را بین دو علامت آکولاد باز { و بسته } بنویسیم:
function greeting($name, $type)
{
    $switch($type) {
    case 0:
        $greeting = 'Welcome';
        break;
    case 1:
        $greeting = 'Goodbye';
        break;
    default:
        $greeting = '';
        break;
    }
    echo '<p align="center">' . $greeting . ' ' . $name . '.</p>' . PHP_EOL;
}

در مثال فوق، تابع greeting دو پارامتر ورودی به نام name$ و type$ دریافت می کند و آنرا درون یک پارامتر وسط چین، بر اساس type$ همراه با عبارت Hello یا Goodbye (یا هیچکدام) نمایش می دهد. بعنوان مثالی از فراخوانی تابع فوق، به کد زیر دقت کنید:
greeting('PHP User', 0); // output: Welcome PHP User.
greeting('PHP User', 1); // output: Goodbye PHP User.

نقل قول:نکته: اگر متغیری را درون بدنه یک تابع تعریف کنید، خارج از آن تابع نمی توانید به مقدار آن دسترسی داشته باشید. به متغیرهای داخلی توابع، متغیرهای محلی (Local Variables) می گویند.

تعیین خروجی یک تابع
توابع نه تنها می توانند کارهای خاصی را انجام دهند، بلکه این امکان نیز وجود دارد که پس از انجام کارهای خود، یک مقدار را نیز به عنوان نتیجه بازگردانند. به این مقدار، خروجی یا مقدار بازگشتی تابع می گویند. برای تعیین مقدار بازگشتی تابع، از دستور return و در ادامه، مقداری که باید بازگردانده شود استفاده می کنیم:
function sum($a, $b)
{
    return $a + $b;
}

نکته: دقت کنید که به محض اجرا شدن دستور return، برنامه از تابع خارج شده و مقدار مشخص شده را باز می گرداند. به عبارت دیگر، دستورات بعد از return اجرا نخواهد شد. می توانید از این امر، به نفع خود استفاده کنید:
function divide($x, $y)
{
    if($y == 0) {
        return 'Error';
    }
    return $x / $y;
}

در مثال فوق، اگر y$ برابر با صفر باشد، عبارت Error بازگردانده شده و دیگر دستور return $x / $y; اجرا نخواهد شد. اگر نخواهید تابع شما مقداری را بازگرداند، می توانید از دستور return استفاده نکنید. البته شکل خاصی از دستور return وجود دارد که برای خروج ضروری از تابع می توانید از آن استفاده کنید:
function displayDivide($x, $y)
{
    if($y == 0) {
        return;
    }
    echo ($x / $y) . '<br />' . PHP_EOL;
}

محدوده متغیر (Variable Scope)
در PHP هر متغیری که خارج از توابع تعریف شود، متغیر سراسری است و در تمامبرنامه معتبر خواهد بود. در مقابل، متغیرهای درون توابع، محلی هستند و فقط درون تابعی که در آن تعریف شده‌اند اعتبار دارند. درصورتی که درون یک تابع، متغیری همنام با یکی از متغیرهای سراسری برنامه تعریف کنید، دو متغیر با آن نام وجود خواهد داشت: یکی سراسری و دیگری محلی و هرکدام مقادیر خاص خودشان را خواهند داشت:
$x = 5;
function test()
{
    $x = 7;
    echo '<p>' . $x . '</p>' . PHP_EOL;
}
test(); // output: 7
echo '<p>' . $x . '</p>' . PHP_EOL; // output: 5

برای دسترسی به هرکدام از متغیرهای سراسری در بدنه یک تابع، باید متغیری همنام با همان متغیر و به کمک کلمه کلیدی global تعریف کنید تا متغیر درون تابع، همان متغیر سراسری باشد (نه یک متغیر محلی). مثال:
$x = 5;
function test()
{
    global $x;
    $x = 7;
    echo '<p>' . $x . '</p>' . PHP_EOL;
}
test(); // output: 7
echo '<p>' . $x . '</p>' . PHP_EOL; // output: 7

استفاده از آرایه GLOBALS
در PHP یک آرایه خاص به نام GLOBALS$ نیز وجود دارد که می توانید از آن، بجای تعریف متغیرهای محلی با کمک کلمه کلیدی global (جهت استفاده از متغیرهای سراسری) استفاده کنید. برای درک بهتر، به مثال زیر توجه نمایید:
function test() {
    $foo = "local variable";

    echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n";
    echo '$foo in current scope: ' . $foo . "\n";
}

$foo = "Example content";
test();

/* Output:
$foo in global scope: Example content
$foo in current scope: local variable
*/

متغیرهای ایستا
به این تابع دقت کنید:
function test()
{
    $callCount = 0;
    $callCount++;
    echo "<p>This function is called {$callCount} time(s).</p>" . PHP_EOL;
}

test(); // output: This function is called 1 time(s).
test(); // output: This function is called 1 time(s).
test(); // output: This function is called 1 time(s).

با کمی دقت متوجه می شویم که بجای callCount$ در دستور echo همیشه عدد 1 نوشته خواهد شد. اگر بخواهیم تعداد فراخوانی های این تابع را بدست آوریم، باید متغیر callCount$ را بصورت ایستا تعریف کنیم. برای این کار از کلمه کلیدی static استفاده می کنیم. این متغیرها، کاملاً مشابه متغیرهای معمولی هستند؛ فقط با خروج از تابع، آخرین مقدار خود را حفظ می کنند و در فراخوانی های بعدی، مجدداً مقداردهی اولیه نخواهند شد. مثال:
function test()
{
    static $callCount = 0;
    $callCount++;
    echo "<p>This function is called {$callCount} time(s).</p>" . PHP_EOL;
}

در کد فوق، بدلیل آنکه متغیر callCount$ از نوع static تعریف شده است، فقط در اولین فراخوانی تابع test مقدار صفر را در خود ذخیره می کند و در دفعات بعد، این مقداردهی اولیه اجرا نخواهد شد و فقط هربار، به مقدار قبلی آن یک واحد افزوده می شود:
test(); // output: This function is called 1 time(s).
test(); // output: This function is called 2 time(s).
test(); // output: This function is called 3 time(s).

پارامترهای مقداری و ارجاعی
درصورتی که پارامترهای یک تابع را به روشی که تاکنون بیان کردیم تعریف کنید، با ارسال هر متغیر برای تابع مربوطه، فقط یک کپی از مقدار آن درون پارامتر ذخیره خواهد شد و درصورت تغییر پارامتر درون بدنه تابع، متغیر اصلی بیرون از تابع تغییر نخواهد کرد. مثال:
$x = 5;
function test($num)
{
    $num++;
}
test($x);
echo "<p>{$x}</p>" . PHP_EOL; // output: 5

در اینجا فقط یک کپی از مقدار x$ درون num$ قرار گرفته و سپس یک واحد افزایش داده شده است؛ اما متغیر x$ بیرون از تابع، بدون تغییر باقی خواهد ماند. به این گونه پارامترها «مقداری» می گویند. حال به کد زیر دقت کنید:
$x = 5;
function test(&$num)
{
    $num++;
}
test($x);
echo "<p>{$x}</p>" . PHP_EOL; // output: 6

در اینجا به دلیل استفاده از کارکتر & قبل از پارامتر num$، این پارامتر یک نام مستعار برای متغیرهایی خواهد شد که برای تابع ارسال می شوند (در اینجا x$). بنابراین، دستور ++num$ دقیقاً معادل دستور ++x$ است؛ زیرا num$ درحقیقت یک نام مستعار برای x$ است. به اینگونه پارامترها، ارجاعی می گویند.
پاسخ
تشکر شده توسط: fatima-php
#2
ببخشید مثل اینکه سه جلسه ی اول رو بازبینی و بازنویسی کردید و قرار بود بقیه را هم انجام بدید ولی مثل اینکه هنوز این کار انجام نشده. درسته؟
پاسخ
تشکر شده توسط:
#3
جلسه 4 و 5 هم انجام شده. منتها هنوز لینکش توی سایت اصلاح نشده. بقیه جلسات هم درحال بازنویسی هستن.
پاسخ
تشکر شده توسط: mahdirabbani




کاربران در حال بازدید این موضوع: 1 مهمان