PHP call_user_func बनाम केवल कॉलिंग फ़ंक्शन


90

मुझे यकीन है कि इसके लिए बहुत आसान स्पष्टीकरण है। इसमें क्या अंतर है:

function barber($type){
    echo "You wanted a $type haircut, no problem\n";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");

... और यह (और क्या लाभ हैं?):

function barber($type){
    echo "You wanted a $type haircut, no problem\n";
}
barber('mushroom');
barber('shave');

जवाबों:


87

जब आप इसे जानते हैं तो हमेशा वास्तविक फ़ंक्शन नाम का उपयोग करें।

call_user_func कॉलिंग फ़ंक्शंस के लिए जिसका नाम आप समय से पहले नहीं जानते, लेकिन यह बहुत कम कुशल है क्योंकि प्रोग्राम को रनटाइम पर फ़ंक्शन को देखना पड़ता है।


धन्यवाद काई call_user_func वही निकला जो मुझे चाहिए था।
जय

44
call_user_funcजरूरी नहीं है। आप हमेशा चर फ़ंक्शन का उपयोग करके फ़ंक्शन को कॉल कर सकते हैं $some_func():। call_user_func_arrayवह है जो वास्तव में उपयोगी है।
आयनोन जी। स्टेन

23
php को हमेशा "रनटाइम पर फंक्शन देखने के लिए"
VolkerK

2
@ स्पेसर गलत। अनाम फ़ंक्शंस अभी भी चर में हैं, अर्थात $func = function(){};। Call_user_func के लिए किसी भी संभव पैरामीटर जिसका अर्थ यह उपयोग करने के लिए पर्याप्त डेटा नहीं है, प्रतिदेय हो गया है यह सीधे, चाहे वह की $func(), या $obj->{$func}(), या जो कुछ भी।
बेनुबर्ड

2
"कम कुशल" वास्तव में बहुत कम है, विशेष रूप से php7 के बाद से, यह कुछ एमएस / मिलियन कॉल के बारे में है: github.com/fab2s/call_user_func
fab2s

32

यद्यपि आप चर फ़ंक्शन नामों को इस तरह से कॉल कर सकते हैं:

function printIt($str) { print($str); }

$funcname = 'printIt';
$funcname('Hello world!');

ऐसे मामले हैं जहां आप नहीं जानते कि आप कितने तर्क दे रहे हैं। निम्नलिखित को धयान मे रखते हुए:

function someFunc() {
  $args = func_get_args();
  // do something
}

call_user_func_array('someFunc',array('one','two','three'));

यह क्रमशः स्थिर और ऑब्जेक्ट विधियों को कॉल करने के लिए भी उपयोगी है:

call_user_func(array('someClass','someFunc'),$arg);
call_user_func(array($myObj,'someFunc'),$arg);

8
मुझे पता है कि यह उम्र पुरानी है, लेकिन कहीं और लेख नहीं मिला। क्या कॉल वेरिफिकेशन () के लिए एप्लाइड के रूप में call_user_func ('customFunction') का उपयोग करना अधिक फायदेमंद है? क्या अंतर हैं? धन्यवाद!
डेविड हॉब्स

15

call_user_funcविकल्प नहीं है तो आप की तरह कर सकते हैं:

$dynamicFunctionName = "barber";

call_user_func($dynamicFunctionName, 'mushroom');

जहां dynamicFunctionNameरन-टाइम पर स्ट्रिंग अधिक रोमांचक और उत्पन्न हो सकती है। जब तक आपको यह धीमा न हो, आपको call_user_func का उपयोग नहीं करना चाहिए।


1
ऐसा लगता है कि आप इस परिदृश्य में एक चर समारोह का उपयोग कर सकते हैं।
एंथनी रटलेज

6

मुझे लगता है कि यह एक फ़ंक्शन को कॉल करने के लिए उपयोगी है जिसे आप पहले से नाम नहीं जानते हैं ... कुछ इस तरह:

switch($value):
{
  case 7:
  $func = 'run';
  break;
  default:
  $func = 'stop';
  break;
}

call_user_func($func, 'stuff');

5
नहीं। हम अभी भी कर सकते हैं$func('stuff');
akush981 16

1
हां, लेकिन यदि वेरिएबल का उपयोग किया जा रहा है, तो अंतर यह है कि अगर PHP_usun_func का उपयोग किया जाता है, तो PHP चेतावनी के अनुसार एक PHP घातक त्रुटि उत्पन्न करेगा।
रॉबर्ट ब्रिसिटा

call_user_func()इस परिदृश्य में चर कार्यों के मूल्य को नकारा नहीं गया है।
एंथनी रटलेज

4

PHP 7 के साथ आप हर जगह अच्छे वेरिएबल-फंक्शन सिंटैक्स का उपयोग कर सकते हैं। यह स्थैतिक / आवृत्ति कार्यों के साथ काम करता है, और यह मापदंडों की एक सरणी ले सकता है। Https://trowski.com/2015/06/20/php-callable-paradox पर अधिक जानकारी

$ret = $callable(...$params);

3

फ़ंक्शन को कॉल करने का कोई लाभ नहीं है क्योंकि मुझे लगता है कि यह मुख्य रूप से "उपयोगकर्ता" फ़ंक्शन (जैसे प्लगइन) को कॉल करने के लिए उपयोग किया जाता है क्योंकि कोर फ़ाइल को संपादित करना अच्छा विकल्प नहीं है। यहाँ Wordpress द्वारा उपयोग किए जाने वाले गंदे उदाहरण हैं

<?php
/* 
* my_plugin.php
*/

function myLocation($content){
  return str_replace('@', 'world', $content);
}

function myName($content){
  return $content."Tasikmalaya";
}

add_filter('the_content', 'myLocation');
add_filter('the_content', 'myName');

?>

...

<?php
/*
* core.php
* read only
*/

$content = "hello @ my name is ";
$listFunc = array();

// store user function to array (in my_plugin.php)
function add_filter($fName, $funct)
{
  $listFunc[$fName]= $funct;
}

// execute list user defined function
function apply_filter($funct, $content)
{
  global $listFunc;

  if(isset($listFunc))
  {
    foreach($listFunc as $key => $value)
    {
      if($key == $funct)
      {
        $content = call_user_func($listFunc[$key], $content);
      }
    }
  }
  return $content;
}

function the_content()
{
  $content = apply_filter('the_content', $content);
  echo $content;
}

?>

....

<?php
require_once("core.php");
require_once("my_plugin.php");

the_content(); // hello world my name is Tasikmalaya
?>

उत्पादन

hello world my name is Tasikmalaya

0

अपने पहले उदाहरण में आप फ़ंक्शन नाम का उपयोग कर रहे हैं जो एक स्ट्रिंग है। यह बाहर से आ सकता है या मक्खी पर निर्धारित किया जा सकता है। अर्थात्, आपको पता नहीं है कि कोड निर्माण के क्षण में किस फ़ंक्शन को चलाने की आवश्यकता होगी।


-1

नामस्थान का उपयोग करते समय, call_user_func () एक फ़ंक्शन को चलाने का एकमात्र तरीका है जिसे आप पहले से नाम नहीं जानते हैं, उदाहरण के लिए:

$function = '\Utilities\SearchTools::getCurrency';
call_user_func($function,'USA');

यदि आपके सभी कार्य समान नामस्थान में थे, तो यह ऐसा मुद्दा नहीं होगा, जैसा कि आप कुछ इस तरह से उपयोग कर सकते हैं:

$function = 'getCurrency';
$function('USA');

संपादित करें: @Jannis के बाद यह कहना कि मैं गलत हूं मैंने थोड़ा और परीक्षण किया, और बहुत ज्यादा किस्मत नहीं थी:

<?php
namespace Foo {

    class Bar {
        public static function getBar() {
            return 'Bar';
        }
    }
    echo "<h1>Bar: ".\Foo\Bar::getBar()."</h1>";
    // outputs 'Bar: Bar'
    $function = '\Foo\Bar::getBar';
    echo "<h1>Bar: ".$function()."</h1>";
    // outputs 'Fatal error: Call to undefined function \Foo\Bar::getBar()'
    $function = '\Foo\Bar\getBar';
    echo "<h1>Bar: ".$function()."</h1>";
    // outputs 'Fatal error: Call to undefined function \foo\Bar\getBar()'
}

आप यहां आउटपुट परिणाम देख सकते हैं: https://3v4l.org/iBERh ऐसा लगता है कि PHP 7 के लिए दूसरी विधि काम करती है, लेकिन PHP 5.6 नहीं।


। सच नहीं होने के लिए। $ fn = '\ Foo \ Bar \ getCurrency'; fn $ ();
जन सेवरे

हाय @ जेनिस, मुझे यह सच नहीं लग रहा है, हो सकता है कि आप देख सकें कि मैं कहाँ गलत हो रहा हूँ, मैंने अपने जवाब में एक और विस्तृत उदाहरण जोड़ा है।
थॉमसरेडस्टोन

@ThomasRedstone क्या आपको पहले से उन कार्यों की आवश्यकता थी? php अन्य फ़ाइलों से ऑटोलॉड कार्य नहीं करता है। इसके अलावा नामस्थानों में उस छोटे बनाम बड़े अक्षरों के साथ क्या है। क्या बार एक क्लास है? तो फिर यह एक और usecase है।
przemo_li

hi @przemo_li, यह एक एकल फ़ाइल है (सभी नामस्थान के भीतर), सुनिश्चित नहीं कि नाम स्थान के साथ क्या हुआ, मेरे बचाव में, मैंने 4 साल पहले उत्तर लिखा था, मैंने नाम स्थान अपडेट कर दिया है, और एक नोट में जोड़ा गया है PHP 7, वास्तविक आउटपुट को देखने के लिए एक लिंक के साथ। मैं अभी भी नहीं जानता कि कैसे jansverre ने यह काम किया, PHP 7 ने अल्फा को 11 जून 2015 तक दर्ज नहीं किया
थॉमसरेडस्टोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.