انجمن‌های فارس وب

نسخه کامل: آموزش php - از آغاز تا پايان (بخش سوم)
شما در حال بازدید از بایگانی ارسال های انجمن هستید این نسخه کامل نیست : برای مشاهده نسخه کامل اینجا کلیک کنید
می خوام در مورد توابع صحبت کنم ، تابع (function) دقیقا" همون تعریفی رو داره که تو ریاضیات خوندیم . هر تابع مقادیری رو می گیره و پس از تحلیل کارائی روش انجام می ده و مقادیر دیگه ای رو به ما بر می گردونه ، تابع رو مثل چرخ گوشت در نظر بگیرید که ما گوشت رو به اون می دیم و گوشت چرخ کرده به ما تحویل می ده ! php چندین تابع از پیش تعریف شده داره ، گرچه که خود برنامه نویس هم می تونه تابع رو تعریف و اجرا کنه .

دستور 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(23);
?>

توضیح خاصی نمی دم ، چون مفهومیه و می بایست با دقت کردن درکش کنید ، فقط علامت ' ' به معنای 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"); 


می دونم برای بعضی ها ، توابع کمی دیر هضمه ، اما باید تمرین کنید ؛ وقت بذارید و علاقه نشون بدین تا یه وب پروگرامر حرفه ای باشید ، گرچه اين پست فقط جهت آشنائي ضمني شما با توابع بودش ، خسته نباشید !

تمرین: با استفاده از تابع ، برنامه ای بنویسید که با گرفتن طول و عرض مستطیل ، محیط و مساحت اون رو چاپ کنه .

مرجع آدرس ها