سؤال

هذا المثال مأخوذ من صفحة البرمجة الوظيفية في PhpTherightway.

<?php
/**
 * Creates an anonymous filter function accepting items > $min
 *
 * Returns a single filter out of a family of "greater than n" filters
 */
function criteria_greater_than($min)
{
    return function($item) use ($min) {
        return $item > $min;
    };
}

$input = array(1, 2, 3, 4, 5, 6);

// Use array_filter on a input with a selected filter function
$output = array_filter($input, criteria_greater_than(3));

print_r($output); // items > 3

ما هو الغرض من وجود return function() ?

لقد كتبت هذا وفعل الشيء نفسه.

array_filter($input, function($input) use ($min) {
    return $input > $min;
}); // items > 3

حتى لو قمت بتعيين رد الاتصال هذا على وظيفة ما ، فإن الوظيفة الثانوية تبدو غير ضرورية.

هل التغاضت عن شيء ما أم أنه يحتوي على غرض مختلف؟

هل كانت مفيدة؟

المحلول

إنه ضروري للغاية ل criteria_greater_than لإرجاع القيمة التي تريد إرجاعها. على سبيل المثال. للحصول على وظيفة لإرجاع القيمة 5:

function get_5() {
    return 5;
}

يمكنك استخدامه مثل $var = get_5();, ، ولكن إذا كنت تضعه على ثابت ، فستفعل فقط $var = 5; أو call_my_function(5). لاحظ أنك بحاجة إلى استخدام return من أجل إعادة أي شيء في وظيفة. الآن فكر في هذه الوظيفة:

function get_fx($x)
{
    return function () use ($x)
           {
               return $x;
           };
}

$v5 = get_fx(5);
$v6 = get_fx(6);

ماذا يكون $v5 و $v6؟ .. حسنًا ، إنها وظائف ، لأن هذا ما عادوا. في الواقع $v5() == get_5() صحيح ، ولكن 6 دولارات () == get_5 () خاطئ ، لأن get_fx إرجاع وظائف مختلفة (الإغلاق) تعتمد على الحجج التي تم تمريرها.

إذا كنت ستخطي الأول return لن تحصل على أي شيء من الوظيفة الأولى .. على سبيل المثال. لن يكون لدى $ V5 و $ V6 أي شيء تم تعيينه. إذا تخطيت الثانية return في الوظيفة التي تم إرجاعها ، لن يعيدوا أي شيء عند الاتصال ، أي. $v5() لن يعود 5 و $v6() لن يعود 6.

نصائح أخرى

المعلمة الثانية من array_filter هو callback. يمكنك تحديده في الداخل array_filter كما anonymous function أو تحديد اسم الوظيفة. بداخل anonymous function أنت تفعل التصفية ، لهذا السبب return تستخدم. العائد الثاني هو استخدام وظيفة مجهولة كرسالة رد فعل في array_filter يعيد المرجع على هذه الوظيفة.

تتيح لك الوظيفة الثانية تمرير ليس فقط رد الاتصال إلى Array_filter ولكن سياق الاتصال والترشيح ($ min) مرة واحدة. إنها طريقة مقنعة لإعادة استخدام الكود.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top