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


115

আমার একটি পিএইচপি ফাংশন রয়েছে যা একটি পরিবর্তনশীল সংখ্যক আর্গুমেন্ট গ্রহণ করে (ব্যবহার করে func_num_args()এবং func_get_args()), তবে আমি যে ফাংশনটি পাস করতে চাই সেগুলি একটি অ্যারের দৈর্ঘ্যের উপর নির্ভর করে। পরিবর্তনশীল সংখ্যক আর্গুমেন্টের সাথে কোনও পিএইচপি ফাংশনকে কল করার কোনও উপায় আছে কি ?


1
: নতুন php5.6 একটি splat অপারেটর সম্পর্কে জানতে আমার উত্তর চেক করুন stackoverflow.com/a/23163963/1090562
সালভাডর দলি

উত্তর:


132

যদি আপনার অ্যারেগুলিতে আপনার যুক্তি থাকে তবে আপনি call_user_func_arrayফাংশনটির দ্বারা আগ্রহী হতে পারেন ।

আপনি যে আর্গুমেন্টগুলি পাস করতে চান তা যদি কোনও অ্যারের দৈর্ঘ্যের উপর নির্ভর করে তবে এর অর্থ সম্ভবত আপনি এগুলি তাদের নিজের মধ্যে প্যাক করতে পারেন - এবং এটি দ্বিতীয় প্যারামিটারের জন্য ব্যবহার করুন call_user_func_array

আপনি যে অ্যারে পাস করেছেন তার উপাদানগুলি তারপরে স্বতন্ত্র পরামিতি হিসাবে আপনার ফাংশনটি দ্বারা গ্রহণ করবে।


উদাহরণস্বরূপ, যদি আপনার এই ফাংশনটি থাকে:

function test() {
  var_dump(func_num_args());
  var_dump(func_get_args());
}

আপনি আপনার প্যারামিটারগুলিকে এইভাবে অ্যারেতে প্যাক করতে পারেন:

$params = array(
  10,
  'glop',
  'test',
);

এবং, তারপরে, ফাংশনটি কল করুন:

call_user_func_array('test', $params);

এই কোডটি আউটপুট দেবে:

int 3

array
  0 => int 10
  1 => string 'glop' (length=4)
  2 => string 'test' (length=4)

অর্থাত্, 3 পরামিতি; ঠিক যেমন ফাংশনটি এইভাবে বলা হয়েছিল:

test(10, 'glop', 'test');

1
হ্যাঁ, আপনাকে ধন্যবাদ. কল_ইউজার_ফানক_আরে () হ'ল ফাংশনটি আমি সন্ধান করছি।
নোহাত

কোনও অবজেক্ট মেথড কল দিয়ে কল_উজার_ফুনক_আর্রে () ব্যবহার করা কি সম্ভব?
নোহাত

6
@ নাহাত: আপনাকে স্বাগতম :-) ;; কোনও অবজেক্টের একটি পদ্ধতি ব্যবহার সম্পর্কে: হ্যাঁ, আপনি প্রথম প্যারামিটার হিসাবে অ্যারে ($জেজ, 'মেথডনাম') এর মতো কিছু ব্যবহার করতে পারেন ;; প্রকৃতপক্ষে, আপনি যে ফাংশনটি করতে চান কোনও "কলব্যাক" পাস করতে পারেন। কলব্যাক সম্পর্কে আরও তথ্যের জন্য, দেখুন php.net/callback#language.types.callback
পাস্কাল মার্টিন

58

এটি এখন পিএইচপি 5.6.x এর সাহায্যে ... অপারেটর (কিছু ভাষায় স্প্ল্যাট অপারেটর হিসাবে পরিচিত) ব্যবহার করেও সম্ভব :

উদাহরণ:

function addDateIntervalsToDateTime( DateTime $dt, DateInterval ...$intervals )
{
    foreach ( $intervals as $interval ) {
        $dt->add( $interval );
    }
    return $dt;
}

addDateIntervaslToDateTime( new DateTime, new DateInterval( 'P1D' ), 
        new DateInterval( 'P4D' ), new DateInterval( 'P10D' ) );

1
টাইপ করা পরিবর্তনশীল আর্গুমেন্টস তালিকা একটি বৈশিষ্ট্য চালু হয় পিএইচপি 7
ড্যানিয়েল অরল্যান্ডো

46

একটি নতুন পিএইচপি 5.6 এ আপনি ব্যবহারের ... operatorপরিবর্তে ব্যবহার করতে পারেন func_get_args()

সুতরাং, এটি ব্যবহার করে, আপনি যে সমস্ত প্যারামিটারগুলি পাশ করেছেন তা পেতে পারেন:

function manyVars(...$params) {
   var_dump($params);
}

3
এখানে আরও তথ্য: php.net/manual/en/…
fracz

@ ফ্রাক্স লিঙ্ক থেকে, ওপি একটি "বৈকল্পিক ফাংশন" তৈরি করার চেষ্টা করছে।
নাথন আর্থার

40

পিএইচপি 5.6 থেকে ...অপারেটরের সাথে একটি পরিবর্তনশীল আর্গুমেন্ট তালিকা নির্দিষ্ট করা যেতে পারে ।

function do_something($first, ...$all_the_others)
{
    var_dump($first);
    var_dump($all_the_others);
}

do_something('this goes in first', 2, 3, 4, 5);

#> string(18) "this goes in first"
#>
#> array(4) {
#>   [0]=>
#>   int(2)
#>   [1]=>
#>   int(3)
#>   [2]=>
#>   int(4)
#>   [3]=>
#>   int(5)
#> }

আপনি দেখতে পারেন, ... অপারেটর একটি অ্যারেতে আর্গুমেন্টের পরিবর্তনশীল তালিকা সংগ্রহ করে।

আপনার যদি অন্য কোনও ফাংশনে পরিবর্তনশীল আর্গুমেন্টগুলি পাস ...করতে হয় তবে এখনও আপনাকে সহায়তা করতে পারে।

function do_something($first, ...$all_the_others)
{
    do_something_else($first, ...$all_the_others);
    // Which is translated to:
    // do_something_else('this goes in first', 2, 3, 4, 5);
}

যেহেতু পিএইচপি 7 , আর্গুমেন্টের পরিবর্তনশীল তালিকা হতে বাধ্য করা যাবে সব একই ধরণের খুব।

function do_something($first, int ...$all_the_others) { /**/ }

11

যারা এর সাথে এটি করার উপায় খুঁজছেন তাদের জন্য $object->method:

call_user_func_array(array($object, 'method_name'), $array);

আমি এটির সাথে কনস্ট্রাক্ট ফাংশনটিতে সফল হয়েছি যা ভেরিয়েবল প্যারামিটারগুলির সাথে একটি ভেরিয়েবল মেথড-নামটি কল করে।


2
আপনি এটিও ব্যবহার করতে পারেন$object->method_name(...$array);
ইয়োন কেরগাল

আরও এগিয়ে যেতে চাইলে, আপনি যদি রেফারেন্স দিয়ে পাস করতে চান তবে$object->method_name(&...$args);
ফ্যাবিয়েন হাদাদাদি

4

আপনি কেবল এটি কল করতে পারেন।

function test(){        
     print_r(func_get_args());
}

test("blah");
test("blah","blah");

আউটপুট:

অ্যারে ([0] => ব্লাহ) অ্যারে ([0] => ব্লাহ [1] => ব্লাহ)


যদি আমি ওপিটি সঠিকভাবে বুঝতে পারি তবে সমস্যাটি পরামিতিগুলি গ্রহণ করছে না, তবে প্যারামিটারের একটি পরিবর্তনশীল সংখ্যার সাথে ফাংশনটি কল করছে
পাস্কাল মার্টিন

1
আমি তখন ওপি সঠিকভাবে বুঝতে পারি নি। একটি অ্যারে অবশ্যই যাওয়ার উপায় হবে। তারপরে আবার তিনি সরাসরি অ্যারে পাস করতে পারবেন সরাসরি পরীক্ষায় (), না?
ডনি সি

1
অ্যারে পাস করাও একটি সমাধান হতে পারে, প্রকৃতপক্ষে - যদি আমি সঠিকভাবে বুঝতে পারি ^^
পাস্কাল মার্টিন

1
পুরাতন প্রশ্ন কিন্তু ফাই, একটি অ্যারে ঠিকঠাক কাজ করে তবে প্রকৃত যুক্তিগুলি আপনাকে নাল আর্গুমেন্টগুলির জন্য পিএইচপি এর ডিফল্ট মানগুলি ব্যবহার করতে দেয় যা অ্যারেটিতে কোনও নির্দিষ্ট মান রয়েছে কিনা তা দেখার জন্য অনেক কুৎসিত পরীক্ষা করে সংরক্ষণ করে।
এন্ডোফেজ

2

আমি অবাক হয়েছি এখানে কেউই কেবল অ্যারে পাস এবং এক্সট্রাক্ট করার কথা উল্লেখ করেনি । উদাহরণ:

function add($arr){
    extract($arr, EXTR_REFS);
    return $one+$two;
}
$one = 1;
$two = 2;
echo add(compact('one', 'two')); // 3

অবশ্যই এটি যুক্তির বৈধতা সরবরাহ করে না । তার জন্য, যে কেউ আমার প্রত্যাশা ফাংশনটি ব্যবহার করতে পারেন: https://gist.github.com/iautomation/8063fc78e9508ed427d5


1

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

আমি কেবল পিএইচপি দিয়ে চারপাশে খেলেছি এবং সমাধানটি এরকম দেখাচ্ছে:

function myFunction($requiredArgument, $optionalArgument = "default"){
   echo $requiredArgument . $optionalArgument;
}

এই ফাংশনটি দুটি কাজ করতে পারে:

যদি এটি কেবলমাত্র প্রয়োজনীয় প্যারামিটার দিয়ে কল করা হয়: myFunction("Hi") এটি "হাই ডিফল্ট" মুদ্রণ করবে

তবে এটি যদি alচ্ছিক প্যারামিটারের সাথে ডাকা হয়: myFunction("Hi","me") এটি "হাই মি" মুদ্রণ করবে;

আমি আশা করি এটি যে কেউ এই রাস্তায় সন্ধান করছে তাদের সহায়তা করবে।


2
আপনি প্রশ্নটি বুঝতে ব্যর্থ হয়েছেন। ওপি আর্গুমেন্ট সম্পর্কে জিজ্ঞাসা করছিল যে তাকে ফাংশনের স্বাক্ষরে স্পষ্টভাবে সংজ্ঞায়িত করতে হয়নি - তবুও তিনি ফাংশনে আর্গুমেন্ট হিসাবে মানগুলি পাস করতে পারেন। উদাহরণস্বরূপ, ফাংশন স্বাক্ষরটির কোনও যুক্তি সংজ্ঞায়িত করা হয় না (alচ্ছিক বা না), তবে যখন তার প্রয়োজন হয়, ফাংশনটিতে ওপি 45 টি বিভিন্ন মান প্রেরণ করতে পারে।
20

0

যাদু পদ্ধতিটি ব্যবহার করে একটি সমাধান এখানে __invoke

(পিএইচপি 5.3 সাল থেকে উপলব্ধ)

class Foo {
    public function __invoke($method=null, $args=[]){
        if($method){
            return call_user_func_array([$this, $method], $args);
        }
        return false;
    }

    public function methodName($arg1, $arg2, $arg3){

    }
}

একই শ্রেণীর ভিতরে থেকে:

$this('methodName', ['arg1', 'arg2', 'arg3']);

কোনও বস্তুর উদাহরণ থেকে:

$obj = new Foo;
$obj('methodName', ['arg1', 'arg2', 'arg3'])

এটি মূলত call_user_func_array২০০৯ সালের শীর্ষে ভোট দেওয়া উত্তর অনুসারে ব্যবহার করছে Maybe __invokeসম্ভবত এটির চারপাশে একটি অতিরিক্ত জড়ানোর কোনও বিন্দু রয়েছে - তবে আমি এটি দেখতে পাচ্ছি না।
20
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.