পিএইচপি-তে প্যারামিটার হিসাবে ফাংশন গ্রহণ করুন


104

আমি ভাবছিলাম যে পিএইচপি-তে প্যারামিটার হিসাবে কোনও ফাংশন পাস করা সম্ভব কিনা; আপনি যখন জেএস-এ প্রোগ্রাম করছেন তখন আমি এমন কিছু চাই:

object.exampleMethod(function(){
    // some stuff to execute
});

আমি যা চাই তা হ'ল মেথডের কোথাও সেই ফাংশনটি সম্পাদন করা। এটি কি পিএইচপি সম্ভব?


সংশ্লিষ্ট: stackoverflow.com/questions/47502068/...
alseether

উত্তর:


150

আপনি যদি পিএইচপি 5.3.0 বা তার বেশি উচ্চতর ব্যবহার করে থাকেন তবে এটি সম্ভব possible

ম্যানুয়ালটিতে বেনামে ফাংশন দেখুন ।

আপনার ক্ষেত্রে, আপনি এটি সংজ্ঞায়িত করবেন exampleMethod:

function exampleMethod($anonFunc) {
    //execute anonymous function
    $anonFunc();
}

9
জঘন্য, আমি জানি এটা সম্ভব ছিল। উত্তর দিতে যাচ্ছিল, তবে প্রথমে লিঙ্ক করার জন্য কিছু ডকুমেন্টেশন সন্ধান করতে চেয়েছিল এবং এটি ঠিক কী বলা হয়েছিল তা জানেনি। আহ ভাল, এখন আমি জানতে হবে যখন আমারও এটি করা দরকার। ধন্যবাদ।
রব

3
5.3 এর আগে আপনি ব্যবহার করতে পারবেনcreate_function
গর্ডন

তোমাকে অনেক ধন্যবাদ. যেহেতু আমাকে পিএইচপি 4.3 এর জন্য এটি করতে হবে আমার ধারণা আমি অন্য যুক্তি ব্যবহার করে যা করতে চাই তা করতে হবে।
ক্রিশ্চিয়ান

1
@ ক্যাসিডিয়াবলো - জেজের উত্তর দেখুন, আপনি সম্ভবত কিছু করতে সক্ষম হবেন create_function()। এটি একেবারে একরকম নয়, আপনাকে কোডের একটি স্ট্রিং হিসাবে আপনার ফাংশনটি পাস করতে হবে, যা পরে eval()পর্দার আড়ালে চলে যায়। আদর্শ নয়, তবে আপনি এটি ব্যবহার করতে সক্ষম হতে পারেন।
জুমব্যাট

1
কীভাবে ডাকবেন? আপনি কি বিদ্যমান ফাংশনটির একটি নাম দিতে পারেন? উদাহরণ:exampleMethod(strpos);
sumid

51

অন্যকে যুক্ত করার জন্য, আপনি একটি ফাংশনের নাম পাস করতে পারেন:

function someFunc($a)
{
    echo $a;
}

function callFunc($name)
{
    $name('funky!');
}

callFunc('someFunc');

এটি পিএইচপি 4 এ কাজ করবে।


17

আপনি ভেরিয়েবল হিসাবে কোনও ফাংশন তৈরি করতে এবং এটিকে পাশ কাটাতে create_function ব্যবহার করতে পারেন । যদিও, আমি বেনাম ফাংশনগুলির অনুভূতিটি আরও ভাল পছন্দ করি। জম্বাটে যান।


বিকল্পের জন্য +1 করুন। মনে হচ্ছে ওপিটির এটির প্রয়োজন হতে পারে।
জুমব্যাট

ধন্যবাদ! আমি একটি পুরানো পিএইচপি 5.2 ইনস্টলেশন সাথে আটকে থাকতে হবে এবং অ্যানোমোইস ফাংশনগুলি সেখানে কাজ করে না।
ডায়োসনি

সতর্কতা: এই ফাংশনটি পিএইচপি 7.2.0 হিসাবে অবহিত করা হয়েছে। এই ফাংশন উপর নির্ভর করা অত্যন্ত নিরুৎসাহিত করা হয়।
শমসীন

15

কেবল এটির মতো কোড করুন:

function example($anon) {
  $anon();
}

example(function(){
  // some codes here
});

এটি দুর্দান্ত হবে যদি আপনি এর মতো কিছু আবিষ্কার করতে পারেন (লারাভেল আলোকিত দ্বারা অনুপ্রাণিত):

Object::method("param_1", function($param){
  $param->something();
});

ঠিক আমি যা খুঁজছিলাম
হার্ভে

5

পিএইচপি সংস্করণ> = 5.3.0

উদাহরণ 1: বেসিক

function test($test_param, $my_function) {
    return $my_function($test_param);
}

test("param", function($param) {
    echo $param;
}); //will echo "param"

উদাহরণ 2: স্ট্যান্ড অবজেক্ট

$obj = new stdClass();
$obj->test = function ($test_param, $my_function) {
    return $my_function($test_param);
};

$test = $obj->test;
$test("param", function($param) {
    echo $param;
});

উদাহরণ 3: অ স্থিত শ্রেণীর কল

class obj{
    public function test($test_param, $my_function) {
        return $my_function($test_param);
    }
}

$obj = new obj();
$obj->test("param", function($param) {
    echo $param;
});

উদাহরণ 4: স্ট্যাটিক ক্লাস কল

class obj {
    public static function test($test_param, $my_function) {
        return $my_function($test_param);
    }
}

obj::test("param", function($param) {
    echo $param;
});

5

@ জম্বাটের উত্তর অনুসারে, প্রথমে বেনামে কাজগুলি যাচাই করা ভাল:

function exampleMethod($anonFunc) {
    //execute anonymous function
    if (is_callable($anonFunc)) {
        $anonFunc();
    }
}

বা পিএইচপি 5.4.0 সাল থেকে যুক্তি প্রকারের বৈধতা দিন:

function exampleMethod(callable $anonFunc) {}

3

পিএইচপি 5.3 জন্য পরীক্ষিত

আমি যেমন এখানে দেখছি, বেনামি ফাংশন আপনাকে সহায়তা করতে পারে: http://php.net/manual/en/funitions.anonymous.php

আপনার সম্ভবত যা প্রয়োজন এবং কোনও ফ্লাই-অন-ক্রিয়েড ফাংশনের অভ্যন্তরে মোড়ানো না রেখে কোনও ফাংশনটি কীভাবে পাস করবেন তার আগে এটি বলা হয়নি । আপনি পরে দেখতে পাবেন, আপনাকে প্যারামিটার হিসাবে একটি স্ট্রিংয়ে লেখা ফাংশনটির নামটি পাস করতে হবে, এর "কল্যাবিলিটি" পরীক্ষা করুন এবং তারপরে কল করুন।

কাজটি যাচাই করতে হবে:

if( is_callable( $string_function_name ) ){
    /*perform the call*/
}

তারপরে, এটিকে কল করতে এই কোডটির টুকরোটি ব্যবহার করুন (যদি আপনার পরামিতিগুলিরও প্রয়োজন হয় তবে এগুলিতে একটি অ্যারে রাখুন): http://php.net/manual/en/function.call-user-func.php

call_user_func_array( "string_holding_the_name_of_your_function", $arrayOfParameters );

এটি অনুসরণ করে (একইভাবে, প্যারামিটারহীন, উপায়ে):

    function funToBeCalled(){
        print("----------------------i'm here");
    }
    function wrapCaller($fun){
        if( is_callable($fun)){
            print("called");
            call_user_func($fun);
        }else{
            print($fun." not called");
        }
    }

    wrapCaller("funToBeCalled");
    wrapCaller("cannot call me");

এখানে কীভাবে অনুরূপ কিছু করা যায় তা বোঝানোর জন্য এখানে একটি শ্রেণি রয়েছে:

<?php
class HolderValuesOrFunctionsAsString{
    private $functions = array();
    private $vars = array();

    function __set($name,$data){
        if(is_callable($data))
            $this->functions[$name] = $data;
        else
            $this->vars[$name] = $data;
    }

    function __get($name){
        $t = $this->vars[$name];
        if(isset($t))
            return $t;
        else{
            $t = $this->$functions[$name];
            if( isset($t))
                return $t;
        }
    }

    function __call($method,$args=null){
        $fun = $this->functions[$method];
        if(isset($fun)){
            call_user_func_array($fun,$args);
        } else {
            // error out
            print("ERROR: Funciton not found: ". $method);
        }
    }
}
?>

এবং ব্যবহারের একটি উদাহরণ

<?php
    /*create a sample function*/
    function sayHello($some = "all"){
    ?>
         <br>hello to <?=$some?><br>
    <?php
    }

    $obj = new HolderValuesOrFunctionsAsString;

    /*do the assignement*/
    $obj->justPrintSomething = 'sayHello'; /*note that the given
        "sayHello" it's a string ! */

    /*now call it*/
    $obj->justPrintSomething(); /*will print: "hello to all" and
        a break-line, for html purpose*/

    /*if the string assigned is not denoting a defined method
         , it's treat as a simple value*/
    $obj->justPrintSomething = 'thisFunctionJustNotExistsLOL';

    echo $obj->justPrintSomething; /*what do you expect to print?
        just that string*/
    /*N.B.: "justPrintSomething" is treated as a variable now!
        as the __set 's override specify"*/

    /*after the assignement, the what is the function's destiny assigned before ? It still works, because it's held on a different array*/
     $obj->justPrintSomething("Jack Sparrow");


     /*You can use that "variable", ie "justPrintSomething", in both ways !! so you can call "justPrintSomething" passing itself as a parameter*/

     $obj->justPrintSomething( $obj->justPrintSomething );
         /*prints: "hello to thisFunctionJustNotExistsLOL" and a break-line*/

    /*in fact, "justPrintSomething" it's a name used to identify both
         a value (into the dictionary of values) or a function-name
         (into the dictionary of functions)*/
?>

2

ক্লাস ব্যবহার করে সাধারণ উদাহরণ:

class test {

    public function works($other_parameter, $function_as_parameter)
    {

        return $function_as_parameter($other_parameter) ;

    }

}

$obj = new test() ;

echo $obj->works('working well',function($other_parameter){


    return $other_parameter;


});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.