phpتابعی – قسمت ۱ – Anonymous functions در php5.3
پنجشنبه, ۲۹ مرداد ۱۳۸۸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
<?php
$lambda = function() { echo "anonymous function"; };
echo gettype($lambda) . '<br />';
// Output: object
echo get_class($lambda) . '<br />';
// Output: Closure
?>