phpتابعی – قسمت ۱ – Anonymous functions در php5.3

Anonymous functions

What are Anonymous Functions and Closures?

Anonymous function ها که با نام closure ها نیز شناخته میشن بهمون اجازه میده توابعی بدون نام بسازیم و اونها رو تو متغیر ها بریزیم یا به عنوان CallBack ازشون استفاده کنیم و حتی میشه از تابعی دیگه اونها رو بازگشت داد . البته فقط در php 5.3 .
اونهایی که از جاوا اسکریپت استفاده می کنن حتما بارها از توابع بدون نام استفاده کردن.

<?php
echo preg_replace_callback('~-([a-z])~', function ($match) {
    return strtoupper($match[1]);
}, 'hello-world');
// outputs helloWorld
?>

 

<?php
$lambda = function() {
            echo "I am an anonymous function,
                  aka a lambda!<br />";
            };//متغیر با یک تابع بی نام مقدار دهی میشه
$anonymousFunction = $lambda; //تابع بی نام به متغیر دیگه ای نیز اختصاص میدیم دقیقا مثل یک رشته
$anonymousFunction();
// Output: I am an anonymous function, aka a lambda!

function nCallsTo($n, $function) {
    for($i = 0; $i < $n; $i++) {
        $function();
    }
    return function() { echo "I am also an anonymous function!<br />"; };
    //یک تابع بی نام توسط تابعی دیگه بازگشت داده میشه
}

$anotherAnon = nCallsTo(3, $anonymousFunction);
// Output:
// I am an anonymous function, aka a lambda!
// I am an anonymous function, aka a lambda!
// I am an anonymous function, aka a lambda!

$anotherAnon();
// Output: I am also an anonymous function!
?>

توابع بی نام دست برنامه نویسهای php رو برای استفاده از high-order function باز میزاره.nCallsTo دقیقا یک تابع high-order است.این نوع توابع یک کار از ۲ کار زیر رو حتما باید انجام بدن:
۱)تابعی رو به عنوان ورودی گرفته ۲)یک تابع رو برگشت بدن

از این تکنیک (توابع high-order ) میشه دقیقا در داخل دستور map / reduce استفاده کرد.نکته اینه که lambda و توابع بی نام دقیقا یک چیز هستند :توابع می تونن [داخل | مقدار] یک متغیر باشند.

اگر توابع [ یک مقدار | مقدار یک متغیر ] باشند،php نوعشونو چی تشخیص میده؟

<?php
$lambda = function() { echo "anonymous function"; };
echo gettype($lambda) . '<br />';
// Output: object
echo get_class($lambda) . '<br />';
// Output: Closure
?>

dojo.formToQuery

یکی از راههای ارسال مقادیر فرم ، استفاده از متد GET . و اگه برای ارسال مقادیر با متد GET در صفحاتی که به صورت ای جکس نوشته شده باشه مصر باشیم باید تمام node های یک فرم را اسکن کرده و با تابع encodeURI انکد کنیم.

تابع formToQuery دوجو دقیقا همین کارو انجام میده یعنی ID یک فرمو میگیره و مقداریو بر میگردونه که دقیقا GET میشه.نقطه قوتش اینه که از ورودی های hidden و آرایه ها و … کاملا پشتیبانی میکنه.