قدرت واقعی زبان 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>
اطلاعات از طریق آرگومان ها به تابع می رسند. در واقع آرگومان ها نوعی متغیر هستند و نکته ی خاصی ندارند. اگر بخواهیم به تابع آرگومان بدهیم باید آن را داخل پرانتزها قرار دهیم. محدودیتی نیز برای تعداد آرگومان ها وجود ندارد و می توانید به تعداد دلخواه از آن ها استفاده کنید اما یادتان باشد که باید آن ها را با علامت ویرگول از هم جدا کنید.
در مثال زیر یک تابع داریم که یک آرگومان (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 نگفتیم قرار است چه نوع داده ای را به آرگومان بدهیم یا اینکه اصلا آرگومان چه نوع داده ای است (عدد صحیح، عدد اعشاری، رشته و ...). دلیلش این است که خود زبان 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); ?>
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.