دستور echo یک تابع نیست ، اما برای مثال تابع بد نیست ، اگه ()echo رو یک تابع در نظر بگیریم ، می شه گفت کارش اینه که هر مقدار و یا رشته ای رو که بهش بدیم ، واسمون چاپ می کنه ، اگه متغیر a$ برابر با 20 باشه ،دستور (echo($a مقدار 20 رو برای من چاپ می کنه . و اگه من دستور('echo('Bonyanalam رو بدم ، عبارت Bonyanalam رو برای من نشون می ده . پس می بینیم کار این تابع اینطوره که هر مقداری رو داخل پرانتز بهش بدیم ، اونو چاپ می کنه .
مثالی که زدم ، مثال اجرای تابع بود ، حالا می خوام همین تابعی رو که مثال زدم ، خودم بسازم ، به تعریف تابع دقت کنید :
<?php
function chap_kon($meghdar)
{
echo $meghdar;
}
?>
تحلیل کد : این شکل ساده ی تعریف یک تابع بود ، هر تابع با کلمه ی کلیدی function شروع می شه و بعر نام تابع و پرانتز باز و بسته می شه ، درون پرانتز ممکنه پارامتر یا پارامترهائی وارد شه و یا بدون پارامتر باشه . بعد از اینها آکولاد { } باز و بسته میشن و درون این آکولاد ها (بدنه تابع) دستورات لازم نوشته می شه .
نکته 1 : برای اسامی تابع فقط می شه از حروف و اعداد (غیر از کاراکتر اول) و کاراکتر _ استفاده کرد ، همچنین اسامی تکراری توابع مجاز نیستن و از توابع خود php (مانند ()date) نمی شه به عنوان اسم تابع استفاده کرد .
نکته 2 : در بلاک دستورات تابع (بدنه تابع) ، آخر هر دستور باید از ; استفاده کنیم .
حالا من می خوام تابع رو با مقادیر (argument) مختلف فراخونی کنم :
<?php
function chap_kon($meghdar)
{
echo $meghdar;
}
chap_kon(5);
chap_kon(1+2);
chap_kon("Forums");
chap_kon(8/2);
?>
خروجی این توابع به ترتیب : 5 ، 3 ، Forums و 4 هستن . تحلیل گر php بعد از اجرای تابع ()chap_kon به دنبال تعریف تابع می گرده و بعد از پیدا کردنش ، مقدار (meghdar$) درون تابع رو به تعریف تابع می فرسته ( 5 و 2+1 و 'Forum' و 2/8 ) و پس از تجزیه و تحلیل خروجی به صورت echo $meghdar برگردونده می شه .
به عبارت دیگه مقدار متغیر meghdar$ به تعریف تابع فرستاده می شه و متغیر پس از اعمال دستورات در بلاک تابع { } ، پس از تجزیه و تحلیل مقدار جدیدی برگردونده می شه که دراینجا اگه در بلاک تابع { } دستور echo $meghdar + 2 رو می نوشتم ، مقدار فرستاده شده به علاوه ی 2 می شد و خروجی به ترتیب : 7 ، 5 ، 2 و 6 می شدند . از اونجائی که جمع 'Forums' و 2 بی معناست ، فقط 2 برگشت داده می شد .
لازمه که دستور return رو معرفی کنم ؛ دستور return درون بلاک توابع { } باعث خاتمه ی اجرای دستورات می شه و از اجرای ادامه ی دستورات صرفنظر می که . همچنین اگه این دستور با متغیری به کار برده بشه return $meghdar غیر از اینکه باعث اتمام اجرای دستورات می شه ، مقدار متغیر meghdar$ رو هم به تابع فراخونی شده می فرسته ، فرستادن به معنی چاپ مقدار متغیر نیست و فقط مقدار رو درون حافظه نگه می داره تا اینکه خودمون اون مقدار رو بازیابی کنیم ، به مثال زیر توجه کنید :
<?php
function be_tavane_2($adad)
{
return $adad * $adad;
echo ("in ebarat dige neshoon dade nemishe");
}
echo be_tavane_2(2);
?>
همونطور که می بینید ، کار این تابع برگردوندن توان دوی اعداده (عدد ضربدر خودش). جائی که return به کار برده شده ، عملا" حاصل متغیر دریافتی رو به توان 2 می رسونه و عدد حاصل رو برای تابع فراخونی شده می فرسته و از اجرای ادامه ی دستورات صرفنظر می کنه ، همونطور که گفتم return خالی بدون ارسال مقادیر از اجرای ادامه ی دستورات داخل بلاک تابع {} جلوگیری می کنه .
خروجی برنامه ی بالا عدد 4 هستش ، ما نتیجه ی تابع (2)be_tavane_2 رو به وسیله ی دستور echo نمایش دادیم . من برای درک بهتر ، مثال ها رو به فینگلیش نوشتم ، اما بعضا" ممکنه باعث گیج شدن بشه ، کد زیر دقیقا" کار بالا رو انجام می ده ، فقط نام تابع و نام متغیر دریافتی تابع عوض شده :
<?php
function abcd($value)
{
return $value * $value;
echo ("in ebarat dige neshoon dade nemishe");
}
echo abcd(2);
?>
اگه با برنامه نویسی javascript و actionscript آشنائی داشته باشید ، می بینید که تعاریف تابع خیلی شبیه به اون هاست ؛ همونطور که گفتم توابع ممکنه بدون مقدار و یا شامل چندین مقدار (argument) باشن ، همچنین می تونیم به تابع مقدار اولیه بدیم که اگه در فراخونی تابع مقداری فرستاده نشد ، مقدار اولیه جایگزین مقدار فرستاده شده باشه . 3 مثال زیر به ترتیب تعریف تابع بدون مقدار ، تعریف تابع با چند مقدار و تعریف تابع شامل مقدار اولیه هستن :
<?php
function salam_kon() //بدون مقدار
{
echo ("salam");
echo ('<br>');
}
function chape_3_kalameh( $k1 , $k2 , $k3) #چند مقدار
{
echo ($k1 . $k2 . $k3 );
echo ('<br>');
}
function chape_1_kalameh($k = 'meghdare_pishfarz') /* با مقدار پیشفرض */
{
echo ($k);
echo ('<br>');
}
salam_kon();
chape_3_kalameh( ' irani ' ,' mobtaker ' ,' ast ! ' );
chape_1_kalameh();
chape_1_kalameh(' har_chi ');
?>
نکته 1 : من از اسامی فارسی برای درک بهتر استفاده کردم ، همینطور از عبارت های string ، شما می تونین از اعداد استفاده کنید و به جای ادغام " . " از جمع " + " استفاده کنید .
نکته 2 : برای دادن چندین مقدار به تابع ، هر مقدار رو با کاما " , " از هم جدا می کنیم .
نکته ی 3 : در تابع ()chape_1_kalameh اگر مقادیری رو از طریق تابع ارسال نکنم ، مقدار پیشفرض جایگزین می شه .
نکته 4 : مقادیر فرستاده شده توسط تابع و دستورات درون بلاک می بایست هم نوع باشند ، به جای عبارات ، عدد بفرستید و ببینید چه اتفاقی می افته !
نکته 5 : در صورتي كه تابع مقداري رو درخواست مي كنه ؛ حتما" مي بايست مقداري رو واسش بفرستيم و برعكس ، اگه تابع مقداري رو نمي خواد ، غير منطقي هستش كه مقداري رو واسش بفرستيم .
حالا خروجی اسکریپت رو با هم می بینیم :
salam
irani mobtaker ast !
meghdare_pishfarz
har_chi
توابع تعریف شده توسط کاربر ریزه کاری ها و انواع و اقسام زیادی دارن (مثل توابع تو در تو ، آرایه ای و ...) که در تمرین های قسمت های آینده کاملا" باهاش آشنا می شید ، از انواع دیگه ی این نوع تابع ها ، نوعی تابع به نام بازگشتی داریم ، که تابع خودش رو در بلوک خودش فراخونی می کنه که بعد از مبحث دستورات شرطی توضیح می دم ، اما نوع دیگه ای از تابع هستش که کاربر تعریف می کنه و تابع تعریف شده ی php هستش و به دور از قواعدی که تا حالا گفتیم ، این نوع تابع به تابع بدون نام مشهوره ، به مثال زیر نگاه کنید :
<?php
$zarb = create_function( ' $x, $y ', ' return $x * $y; ');
echo $zarb(2, 3);
?>
توضیح خاصی نمی دم ، چون مفهومیه و می بایست با دقت کردن درکش کنید ، فقط علامت ' ' به معنای string نیست و جزو تعریف های تابع ()create_function هستش .
نوع دیگری از اجرای تابع (تعریف تابع نه !) به صورت زیر هستش که این هم مفهومیه توضیح خاصی نمی شه داد ، این مثال شکل دیگه ای از مثال ()salam_kon هستش :
<?php
function salam_kon()
{
echo "salam ";
}
$salam_kon_jadid = "salam_kon";
$salam_kon_jadid(); // khorooji : salam
?>
برای روشن شدن بهتر موضوع همین مثال رو با عدد می بینیم :
<?php
function tavane_2($adad)
{
echo $adad * $adad;
}
$jadid = "tavane_2";
$jadid(5); // khorooji : 25
?>
اجازه بدین یک مطلب دیگه رو راجع به توابع بگم و این مبحث رو تموم کنم ، به تابع زیر نگاه توجه :
<?php
$meghdar = 12;
function chap_kon()
{
echo $meghdar; //$meghdar payda nemishe !
}
chap_kon(); //hich chizi chap nemishe !
?>
همونطور که تو توضیحات اسکریپت نوشتم با اجرای فانکشن ()chap_kon هیچ اتفاقی نمی افته ! دلیلش اینه که متغیر meghdar$ بیرون از تابع تعریف شده در حالی که تعریف تابع فقط به داده هائی که بهش فرستاده می شه و متغیر هائی که درون بدنه ی تابع (بین } و { ) مقدار دهی شده دسترسی داره . اما php با دستوری به تابع می گه که متغیر های خارج از بدنه ی تابع رو هم جستجو کنه ، کد اصلاح شده رو ببینیم :
<?php
$meghdar = 12;
function chap_kon()
{
global $meghdar; // tarife moteghayere jahani !
echo $meghdar; //$meghdar payda shod !
}
chap_kon(); //12 chap mishe !
?>
حالا تابع به متغیر meghdar$ که بیرون از محدوده ی بدنه ی تابع هست دسترسی داره و برای تابع شناخته شده هست . به این دسترسی اصطلاحا" میدان دید می گن و با استفاده از دستور global میدان دید تابع وسیع تر می شه و بیرون تابع رو هم می تونه ببینه !
يه مثال ديگه : تابع زير يك متن دلخواه رو در تگ <p> با فونت ، رنگ و اندازه دلخواه نشون مي ده :
<?php
function pColored($text,$font,$color,$size)
{
print "<p style='font-family:$font;color:$color;font-size=$size'>$text</p>";
?>
تابع رو با مقادير زير فراخواني كرده و نتيجه رو هم در ظاهر و هم در سورس HTML مشاهده كنيد :
pColored("Bonyanalam","arial","blue","20pt");
pColored("Ghermez","tahoma","#ff0000","15px");
echo "\n\n\n";
pColored("WOW","comic sans ms","#ff00ff","180pt");
می دونم برای بعضی ها ، توابع کمی دیر هضمه ، اما باید تمرین کنید ؛ وقت بذارید و علاقه نشون بدین تا یه وب پروگرامر حرفه ای باشید ، گرچه اين پست فقط جهت آشنائي ضمني شما با توابع بودش ، خسته نباشید !
تمرین: با استفاده از تابع ، برنامه ای بنویسید که با گرفتن طول و عرض مستطیل ، محیط و مساحت اون رو چاپ کنه .