توابع در php

در این مقاله از سری مقالات آموزش PHP سایت نارنجک، با هم درمورد توابع در php صحبت میکنیم.
توابع داخلی در PHP
توابع تعریف شده توسط کاربر در PHP
- تابع مجموعهای از دستورات هستن که در یک بلوک قرار میگیرن و تو قسمتهای مختلف برنامه استفاده میشن.
- توابع موقع بارگزاری(load) صفحه، بصورت خودکار اجرا نمیشن.
- یه تابع زمانی اجرا میشه، که از تو کد فراخوانی بشه.
تعریف تابع در PHP
ما میتونیم تابع رو با کلمهکلیدی function تعریف کنیم. نحوهی نوشتن(syntax) توابع در php بصورت زیر هستش:
function functionName() { کدهای تابع در این قسمت نوشته میشه; }
نکته: نام تابع باید با یه حرف انگلیسی یا علامت underscore(آندرلاین_) شروع بشه. نام توابع به حروف بزرگ و کوچک حساس نیستن.
باید سعی کنیم به تابع نامی بدیم که کار اون رو منعکس کنه.
در مثال زیر، تابعی به نام ()sayHello رو تعریف میکنیم. بدنهی این تابع با علامت براکت باز( } ) شروع میشه و با علامت براکت بسته( { ) تموم میشه. و در بلوک تابع جملهی “Hello narenjak” رو در خروجی چاپ میکنیم. در ادامه با فراخوانی تابع ()sayHello دستورات اون اجرا میشن و جملهی “Hello narenjak” در خروجی چاپ میشه.
<?php function sayHello() { echo "Hello narenjak"; } sayHello(); // فراخوانی تابع ?>
آرگومانهای تابع در PHP
<?php function sayHello($name) { echo "Hello $name.<br>"; } sayHello("ali"); sayHello("sasan"); sayHello("world!"); // Hello ali. // Hello sasan // Hello world! ?>
در مثال بالا، تابع ()sayHello یک آرگومان به نام name$ داره که هر بار که تابع فراخوانی میشه، اسم موردنظر رو به تابع پاس میده. تابع در هر بار فراخوانی اسمی که توسط آرگومان بهش پاس دادیم رو در جمله “.Hello $name” به جای متغیر name$ قرار میده و نتیجه رو تو خروجی چاپ میکنه.
بسته به نیاز امکان داره تعداد آرگومانهای یه تابع بیش از یکی باشه.
در مثال بالا همچنین نیازی نبود نوع آرگومانهای تابع رو مشخص کنیم. زبان PHP بسته به مقدار اون، نوع داده رو به طور خودکار به متغیر مرتبط میکنه. از اونجایی که انواع دادهها به معنای دقیق تنظیم نشدن، میتونیم کارهایی مثل اضافه کردن یه رشته به یه عدد صحیح رو بدون ایجاد خطا انجام بدیم.
از نسخه PHP7 به بعد، نوع داده اضافه شد. این ویژگی به ما کمک میکنه که موقع تعریف تابع نوع داده هر کدوم از آرگومانها رو مشخص کنیم. با افزودن strict به اسکریپتمون هر کدوم از آرگومانها رو مجبور میکنیم بصورت دقیق همون نوع داده رو داشته باشن. و در صورت عدم تطابق نوع داده خطای “Fatal Error” نمایش داده میشه. به دو مثال زیر دقت کنین تا تفاوت دو حالت رو بررسی کنیم.
<?php function addNumbers(int $a, int $b) { return $a + $b; } echo addNumbers(5, "5 days"); // ۱۰ ?>
در مثال بالا، چون strict فعال نیست، آرگومان دوم یعنی “۵days” رو به عدد ۵ از نوع int تبدیل میکنه و در خروجی عدد ۱۰ چاپ میشه.
برای مشخص کردن strict باید عبارت declare(strict_types=1) رو اضافه میکنیم. این خط کد حتما باید در اولین خط اسکریپت phpمون نوشته بشه.
<?php declare(strict_types=1); // strict requirement function addNumbers(int $a, int $b) { return $a + $b; } echo addNumbers(5, "5 days"); ?>
همون مثال قبلی رو این بار با فعال کردن strict نوشتیم. چون باید نوع داده بصورت دقیق نوشته بشه و آرگومان دوم بجای عدد از نوع int متغیری از نوع string فرستاده شده پس خطای “Fatal Error” در خروجی نمایش داده میشه.
مقدار پیشفرض آرگومان در PHP
در بعضی از موارد نیاز داریم یک آرگومان رو بصورت اختیاری تعریف کنیم. یعنی اگه مقداری به آرگومان تابع فرستاده شد، مقدار آرگومان برابر اون قرار بگیره در غیر اینصورت آرگومان برابر مقدار پیشفرضی بشه که ما تعریف میکنیم. به مثال زیر توجه کنین:
<?php declare(strict_types=1); function setHeight(int $minheight = 50) { echo "قد شما برابر : $minheight است.<br>"; } setHeight(350); setHeight(); مقدار پیشفرض یعنی ۵۰ در خروجی نمایش داده میشه. ?>
در مثال بالا، مقدار پیشفرض آرگومان تابع برابر ۵۰ هست. در فراخوانی اول(خط ۶) تابع مقدار آرگومان برابر عدد وارد شده یعنی ۳۵۰ هستش. اما در فراخوانی دوم(خط ۷) چون مقدار آرگومان وارد نشده، مقدار آرگومان برابر مقدار پیشفرض یعنی ۵۰ میشه.
مقدار بازگشتی توابع در PHP
هر وقت نیاز داشتیم مقداری رو در تابع محاسبه کنیم و اون رو به جایی که تابع فراخوانی شد ارسال کنیم، از return استفاده میکنیم.
<?php declare(strict_types=1); 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); ?>
در مثال بالا، در خط ۷ تابع ()sum با دو آرگومان ۵ و ۱۰ فراخوانی میشه. تابع اجرا میشه دو آرگومان ورودی با هم جمع میشن و نتیجه توسط return به جاییکه تابع فراخوانی شد(خط ۷) برگردونده میشه.
نوع داده بازگشتی توابع در PHP
از نسخه ۷ به بعد در زبان PHP مانند تعریف نوع آرگومانها، نوع مقدار بازگشتی تابع رو هم میشه مشخص کرد. با فعال کردن strict در ابتدای اسکریپت php. و در صورت برابر نبودن نوع مقدار خروجی با نوعی که برای تابع در نظر گرفتیم با خطای “Fatal Error” مواجهه میشیم. برای تعریف نوع خروجی تابع، علامت ( : ) و نوع خروجی تابع رو سمت راست تعریف تابع و قبل از شروع بدنهی تابع( } ) قرار میدیم.
<?php declare(strict_types=1); function addNumbers(float $a, float $b) : float { return $a + $b; } echo addNumbers(1.2, 5.2); ?>
در مثال بالا، در خط ۲ خروجی تابع رو از نوع float تعریف کردیم.
نوع خروجی تابع میتونه با نوع آرگومانهای تابع تفاوت داشته باشه. اما باید مطمئن شیم نوع خروجی تابع صحیح باشه.
<?php declare(strict_types=1); function addNumbers(float $a, float $b) : int { return (int)($a + $b); } echo addNumbers(1.2, 5.2); // ۶ ?>
در مثال بالا، نوع خروجی تابع از نوع int هستش. در صورتی که آرگومانهای تابع از نوع float هستن. جمع دو عدد ورودی(۱.۲ و ۵.۲) برابر ۶.۴ میشه ولی چون خروجی تابع از نوع int هست. مقدار خروجی به نوع int تبدیل میشه و مقدار عدد ۶ رو برمیگردونه.
ارسال آرگومان با ارجاع(by Reference)
در زبان PHP آرگومانها پیشفرض با مقدار ارسال میشن. به این معنی که یه کپی از مقدار اون متغیر به تابع فرستاده میشه و هر تغییری در تابع روی آرگومان اتفاق بیوفته مقدار اصلی اون متغیر، تغییری نمیکنه. اما هر وقت متغیری با ارجاع به تابع فرستاده بشه هر تغییری روی اون، مقدار اصلی متغیر رو هم تغییر میده. اگه بخوایم یه متغیر رو با ارجاع به تابع بفرستیم، قبل از نام آرگومان در تعریف تابع از علامت & استفاده میکنیم.
<?php function add_five(&$value) { $value += 5; } $num = 2; add_five($num); echo $num; // ۷ ?>
در مثال بالا، در ابتدا مقدار متغیر num$ برابر عدد ۲ هستش. بعد از اون در خط ۷ متغییر رو به تابع میفرستیم. در تابع عدد ورودی با عدد ۵ جمع میشه. چون آرگومان با ارجاع به تابع فرستاده شده بود با تغییر عدد در تابع مقدار اصلی اون متغیر هم تغییر میکنه و در خروجی عدد ۷ رو نمایش میده.
خب این آموزش PHP هم تموم شد. امیدوارم براتون مفید بوده باشه.
دیدگاهتان را بنویسید