رفتن به مطلب

تعریف تابع تو در تو


پست های پیشنهاد شده

تابع هایی که تو در تو هستند رو چرا نمیشه بیش از یک بار فراخوانی کرد ؟

پس فایده ی اونها چیه ؟


function a() {
function b() {
echo 'I am b';
}
echo 'I am a';
}
a();
a();

تو منوال نوشته :

As you might NOT expect, the second call to a() fails with a "Cannot redeclare b()" error. This behaviour is correct, insofar as PHP doesn't "allow functions to be redefined."

بعد اینطور هم نوشته :


function a() {
if ( ! function_exists('b') ) {
function b() {
echo 'I am b';
}
}
echo 'I am a';
}

ولی باز هم نمیشه دو بار فراخوانی کرد ؟ علتش چیه ؟ و کاربردش ؟

ممنونم.

لینک به ارسال

برای اینکه php هنگام ساخت صفحه توابعش رو می خونه و بر اساس شرایط اونها صفحه را می سازه یعنی یا صفحه را بر اساس روال


if ( ! function_exists('b')

می سازه و یا برای حالت else در فراخوانی دوم شرط عملا وجود نداره برای توابع اینچنینی باید تابع را در جاوا اسکریپت ساخت که کل کد همیشه همراه صفحه باشه و یا در تعریف تابع تو برای هر نتیجه یک تابع مجزا هم نوشت

لینک به ارسال

میدونید , خوب متوجه نشدم !

کد دوم میگه اگر فانکشن b وجود نداره اونو ایجاد کن , ولی باز هم تابع a رو نمیشه بار دوم فراخوانی کرد ..

لینک به ارسال

کد کار میکنه


function a() {
if ( !function_exists('b')) {
function b() {
echo "This is function b.<br />";
}
}
echo "This is function a.<br />";
}
a();
a();
a();

اینم خروجیش


http://69.195.223.90/0e355-2/

لینک به ارسال

یه جاش رو اشتباه نوشتم


function a() {
if ( !function_exists('b')) {
function b() {
echo "This is function b. ---";
}
}
b();
echo "This is function a.<br />";
}
a();
a();
a();

خروجی


http://69.195.223.90/26b68-2/

لینک به ارسال

درسته.

سوال من اینه که چرا تو کد اول , دفعه ی اول نمیگه b رو نمیشناسه , ولی دفعه ی دوم میگه .

وقتی ما تابع a رو صدا میکنیم , همزمان باهاش تابع b هم ساخته میشه , نمیشه ؟

حالا چه بار اول باشه چه بار دوم , سوم و ...


function a() {
function b() {
echo 'I am b';
}
echo 'I am a';
}
a();
b();
a();

ما هیچ وقت در حالت معمولی , اول تابع رو چک نمیکنیم که ببینیم وجود داره یا نه , که اگر وجود نداشت اونو ایجاد کنیم .

ما همین که ایجاد میکنیم و فراخوانی , ساخته میشه دیگه.

لینک به ارسال

من فکر کنم هنوز هم متوجه منظور شما نشدم

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

اما در حالتی که b را مثلا شرطی کنید پاسخ شنما می شود اگر فرمول b اجرا شد پاسخ فرمول a هم فرمول b باشد و الا پاسخ a چیز دیگریست

لینک به ارسال

سوال من اینه که چرا دفعه ی اول که a رو صدا میزنم خطا نمیگیره , ولی دفعه ی دوم به بعد خطا میگیره . ( کد اول )

ویرایش شده توسط pary_daryayi
لینک به ارسال

دلیل استفاده تابع بصورت NESTED چیه ؟ بعضی از دلایل واقعا جالب نیستند

مثلا این دلیل :


namespace String;

if (\MULTIBYTE_MODE) {
function Length($string) {
return strlen($string);
}
} else {
function Length($string) {
return mb_strlen($string);
}
}

استفاده از تابع به این صورت فقط از ذهن یک الگوریتم اشتباه بر میاد ,چرا که میشه همین کد رو بسیار زیباتر و تمیز تر نوشت تا اینکه بخوایم تابع ها رو به این صورت به سخره بگیریم ! چرا که تابع ها رفتار یک کلاس رو تعریف میکنند و در زمان های معین شاید رفتار های متفاوت از خود بروز دهند , جالبه استفاده تابع بصورت Nested یعنی شما رفتار رو بیرون از تابع تعریف میکنی و فقط به تابع میگید که اون کار رو انجام بدید ,

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

ببینید :


static void Main()
{
Console.WriteLine("Hello from main.");

Func<int, int> NestedMethod =
(x) =>
{
Console.WriteLine("In nested method. Value of x is {0}.", x);
return x;
};

int result = NestedMethod(3);
}

لینک به ارسال

این رو تست کن


<?php
function a() {
if ( ! function_exists('b') ) {
function b() {
echo 'I am b';
}
}
else {
echo 'I am a';
}
}
a();
a();
?>

لینک به ارسال

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...