توابع در زبان PHP

درسنامه درس 10 از سری آموزش PHP 7
توابع در زبان PHP

توابع در PHP 7

قدرت واقعی زبان PHP به خاطر تعداد توابع بالای آن است؛ این زبان بیش از 1000 تابع از پیش تعریف شده در اختیار شما قرار می دهد! با این حساب آشنایی با توابع PHP جزء جدا نشدنی یادگیری زبان PHP است و به همین خاطر در این قسمت با انواع جنبه های توابع در زبان PHP (مانند تعریف کردن توابع شخصی، آرگومان ها و ...) آشنا خواهیم شد.

تعریف توابع شخصی

در زبان PHP جدا از توابع از پیش تعریف شده، قابلیت تعریف توابع جدید نیز وجود دارد. ابتدا باید بگویم که تابع ها چیزی جز مجموعه ای از کد نیستند که می توانند بارها و بارها در یک برنامه مورد استفاده قرار گیرند.

توابع php به خودی خود یا هنگام بارگذاری صفحه اجرا نمی شوند بلکه باید فراخوانی (call) شوند. برای تعریف یک تابع شخصی باید از کلیدواژه ی function و ساختار کلی زیر استفاده کنیم:

function functionName() {
    code to be executed;
}

نام تابع می تواند با یک حرف انگلیسی یا علامت underscore (همان آندرلاین _) شروع شود اما نمی توانید آن را با یک عدد شروع کنید. باید نام هایی که برای تابع خود انتخاب می کنید توصیف گر باشند چرا که بعدا در کدهایتان گم می شوند و یادتان می رود هر تابع چه کاری می کرده است.

نام توابع case-sensitive نیستند بنابراین به بزرگی و کوچکی حروف حساس نیستند.

در مثال زیر تابعی به نام ()writeMsg تعریف کرده ایم. علامت } یعنی شروع کدهای تابع و علامت { یعنی پایان آن. تنها کاری که این تابع می کند نمایش عبارت !Hello world است. برای فراخوانی تابع نیز تنها کافی است که از علامت پرانتز استفاده کنید:

<!DOCTYPE html>
<html>
<body>

<?php
function writeMsg() {
    echo "Hello world!";
}

writeMsg();
?>

</body>
</html>

مشاهده ی خروجی

آرگومان ها (argument)

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

در مثال زیر یک تابع داریم که یک آرگومان (fname$) دارد. زمانی که تابع ()familyName فراخوانی شود باید یک نام هم به آن داده شود (به عنوان آرگومان) تا در کد های داخل استفاده شود:

<!DOCTYPE html>
<html>
<body>

<?php
function familyName($fname) {
    echo "$fname Refsnes.<br>";
}

familyName("Jani");
familyName("Hege");
familyName("Stale");
familyName("Kai Jim");
familyName("Borge");
?>

</body>
</html>

مشاهده ی خروجی

در مثال زیر یک آرگومان دیگر (سال تولد) هم به تابع اضافه کرده ایم:

<!DOCTYPE html>
<html>
<body>

<?php
function familyName($fname, $year) {
    echo "$fname Refsnes. Born in $year <br>";
}

familyName("Hege","1975");
familyName("Stale","1978");
familyName("Kai Jim","1983");
?>

</body>
</html>

مشاهده ی خروجی

PHP از زبان های Loosely Typed

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

در PHP 7 قابلیت type declaration (تعیین نوع داده) معرفی شده است. بنابراین می توانید تعیین کنید که یک متغیر قرار است چه نوع داده ای بگیرد و اگر داده برخلاف نوع تعیین شده بود (در صورتی که حالت strict فعال باشد) دچار خطای Fatal Error می شویم.

در مثال زیر حالت strict را غیر فعال کرده ایم:

<?php
function addNumbers(int $a, int $b) {
    return $a + $b;
}
echo addNumbers(5, "5 days"); 
// since strict is NOT enabled "5 days" is changed to int(5), and it will return 10
?>

مشاهده ی خروجی

از آنجا که حالت strict غیرفعال است رشته ی "5 days" تبدیل به عدد 5 شده و نتیجه عدد 10 خواهد شد!

اما اگر حالت strict فعال باشد:

<?php declare(strict_types=1); // strict requirement

function addNumbers(int $a, int $b) {
    return $a + $b;
}
echo addNumbers(5, "5 days"); 
// since strict is enabled and "5 days" is not an integer, an error will be thrown
?>

مشاهده ی خروجی

می بینید که با خطا مواجه شدیم.

اگر می خواهید strict را فعال کنید باید دستور ;(declare(strict_types=1 را در اولین خط فایل PHP بنویسید. این حالت بیان می کند که نوع داده ها باید دقیقا با حالت تعریف شده مطابقت داشته باشد. توجه داشته باشید که از این قسمت آموزش به بعد ما از حالت strict استفاده خواهیم کرد.

تعیین مقدار پیش فرض برای آرگومان ها

شما می توانید مقداری را به عنوان پیش فرض برای یک آرگومان تعریف کنید تا در صورتی که مقداری برای آن وارد نشد از مقدار پیش فرض استفاده شود. اگر تابع ()setHeight را در مثال زیر بدون آرگومان هایش صدا بزنیم، از مقدار پیش فرض استفاده می کند:

<?php declare(strict_types=1); // strict requirement ?>
<!DOCTYPE html>
<html>
<body>

<?php
function setHeight(int $minheight = 50) {
    echo "The height is : $minheight <br>";
}

setHeight(350);
setHeight();
setHeight(135);
setHeight(80);
?>

</body>
</html>

مشاهده ی خروجی

برگرداندن مقادیر

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

<?php declare(strict_types=1); // strict requirement ?>
<!DOCTYPE html>
<html>
<body>

<?php
function sum(int $x, int $y) {
    $z = $x + $y;
    return $z;
}

echo "5 + 10 = " . sum(5,10) . "<br>";
echo "7 + 13 = " . sum(7,13) . "<br>";
echo "2 + 4 = " . sum(2,4);
?>

</body>
</html>

مشاهده ی خروجی

تعیین نوع داده ی برگشتی

PHP 7 برای دستور return نیز از قابلیت Type Declaration (تعیین نوع داده) پشتیبانی می کند. در این حالت هم اگر strict فعال باشد و داده ی برگشتی با نوع داده ای که ما تعیین کرده ایم یکی نباشد دچار Fatal Error خواهیم شد. برای انجام این کار قبل از باز شدن } و نوشتن کدهای تابع، از علامت دو نقطه (:) و ذکر نوع داده ی برگشتی استفاده کنید:

<?php declare(strict_types=1); // strict requirement
function addNumbers(float $a, float $b) : float {
    return $a + $b;
}
echo addNumbers(1.2, 5.2); 
?>

مشاهده ی خروجی

نیازی نیست که نوع داده ی برگشتی با نوع آرگومان ها یکی باشد اما مطمئن شوید که نوع داده ی خروجی را درست مشخص کرده اید:

<?php declare(strict_types=1); // strict requirement
function addNumbers(float $a, float $b) : int {
    return (int)($a + $b);
}
echo addNumbers(1.2, 5.2); 
?>

مشاهده ی خروجی

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش PHP 7 توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.