PHP फ़ंक्शन के चर संख्याओं को कैसे पास किया जाए


115

मेरे पास एक PHP फ़ंक्शन है जो एक चर संख्या में तर्क (उपयोग func_num_args()और func_get_args()) लेता है , लेकिन मैं जितने भी तर्क पास करना चाहता हूं वह एक सरणी की लंबाई पर निर्भर करता है। क्या एक PHP फ़ंक्शन को वेरिएबल संख्याओं के साथ कॉल करने का एक तरीका है ?


1
नए php5.6 में एक स्‍पैट ऑपरेटर के बारे में जानने के लिए मेरे जवाब की जाँच करें: 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 पैरामीटर; जैसे iof फ़ंक्शन को इस तरह कहा जाता था:

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

1
हाँ धन्यवाद। call_user_func_array () वास्तव में मैं देख रहा था समारोह है।
नोहट

क्या ऑब्जेक्ट विधि कॉल के साथ call_user_func_array () का उपयोग करना संभव है?
दोपहर

6
@ क्या: आपका स्वागत है :-) ;; किसी ऑब्जेक्ट की एक विधि का उपयोग करने के बारे में: हाँ, आप कर सकते हैं, जैसे कुछ का उपयोग करके सरणी ($ obj, 'methodName') के रूप में अन्य पैरामीटर ;; वास्तव में, आप किसी भी "कॉलबैक" को पारित कर सकते हैं जिसे आप उस फ़ंक्शन में चाहते हैं। कॉलबैक के बारे में अधिक जानकारी के लिए, php.net/callback#language.types.callback
पास्कल मार्टिन

58

यह अब PHP 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

नई Php 5.6 में , आप उपयोग ... operatorकरने के बजाय उपयोग कर सकते हैं func_get_args()

इसलिए, इसका उपयोग करके, आप उन सभी मापदंडों को प्राप्त कर सकते हैं जिन्हें आप पास करते हैं:

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

3
यहाँ अधिक जानकारी: php.net/manual/en/…
fracz

@Fracz लिंक से, ओपी एक "वैराडिक फ़ंक्शन बनाने की कोशिश कर रहा है।"
नाथन आर्थर

40

PHP 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);
}

PHP 7 के बाद से , तर्कों की परिवर्तनशील सूची को सभी एक ही प्रकार के लिए भी मजबूर किया जा सकता है।

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

11

उन लोगों के लिए जो ऐसा करने का तरीका ढूंढ रहे हैं $object->method:

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

मैं इसके साथ एक निर्माण कार्य में सफल रहा जो चर मापदंडों के साथ एक चर method_name कहता है।


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
पुराना प्रश्न लेकिन फी, एक सरणी ठीक काम करती है लेकिन वास्तविक तर्क पास करने से आप शून्य तर्कों के लिए PHP के डिफ़ॉल्ट मानों का उपयोग कर सकते हैं जो यह देखने के लिए बहुत बदसूरत जाँच करता है कि क्या सरणी में विशेष मान हैं।
एंडोफेगे

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

एक पुराना सवाल, मुझे पता है, हालांकि, यहां कोई भी उत्तर वास्तव में सवाल का जवाब देने का अच्छा काम नहीं करता है।

मैं बस php के साथ चारों ओर खेला और समाधान इस तरह दिखता है:

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

यह कार्य दो कार्य कर सकता है:

यदि इसकी आवश्यकता केवल आवश्यक पैरामीटर के साथ है: myFunction("Hi") यह "हाय डिफॉल्ट" प्रिंट करेगा

लेकिन अगर इसे वैकल्पिक पैरामीटर के साथ कहा जाता है: myFunction("Hi","me") यह "हाय मुझे" प्रिंट करेगा;

मुझे उम्मीद है कि यह किसी को भी मदद करता है जो इस सड़क की तलाश में है।


2
आप प्रश्न को समझने में असफल रहे। ओपी तर्कों के बारे में पूछ रहा था कि उसे फ़ंक्शन हस्ताक्षर में स्पष्ट रूप से परिभाषित करने की आवश्यकता नहीं है - फिर भी वह फ़ंक्शन के तर्क के रूप में मानों को पारित कर सकता है। उदाहरण के लिए, फ़ंक्शन हस्ताक्षर में कोई तर्क परिभाषित (वैकल्पिक या नहीं) नहीं है, लेकिन जब उसे इसकी आवश्यकता होती है, तो ओपी फ़ंक्शन के तर्क के रूप में 45 अलग-अलग मान भेज सकता है।
a20

0

यहाँ जादू की विधि __inoke का उपयोग करके एक समाधान है

(Php 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रूप से 2009 में शीर्ष मतदान जवाब द्वारा कहा गया है। शायद इसके __invokeआसपास एक अतिरिक्त लपेटने का एक बिंदु है - लेकिन मैं इसे नहीं देखता।
a20
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.