পিএইচপি কল_উজার_ফঙ্ক বনাম। কেবল কলিং ফাংশন


92

আমি নিশ্চিত যে এর পক্ষে খুব সহজ ব্যাখ্যা আছে। এর মধ্যে পার্থক্য কী:

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');

উত্তর:


88

আপনি যখনই জানেন তখন আসল ফাংশন নামটি সর্বদা ব্যবহার করুন।

call_user_func যার নাম আপনি সময় আগে জানেন না কল করার জন্য তবে প্রোগ্রামটি রানটাইমের সময় ফাংশনটি অনুসন্ধান করার জন্য এটি অনেক কম দক্ষ।


44
call_user_funcঅগত্যা প্রয়োজন হয় না। আপনি সর্বদা পরিবর্তনশীল ফাংশন ব্যবহার করে একটি ফাংশন কল করতে পারেন: $some_func()call_user_func_arrayসত্যিই দরকারী যে এক।
আয়নু জি স্টান

23
পিএইচপি সর্বদা "রানটাইমের সময় ফাংশনটি দেখার জন্য" প্রয়োজন
ভলকারক

4
@ পেসারিয়র ভুল বেনামী ফাংশন অর্থাত ভেরিয়েবল এখনও, $func = function(){};। Call_user_func কোন সম্ভাব্য প্যারামিটার যার মানে এটিকে অ্যাক্সেস করার জন্য যথেষ্ট তথ্য রয়েছে, callable হতে হয়েছে এটা সরাসরি, কিনা যে $func(), বা $obj->{$func}(), বা যাই হোক না কেন।
বেনুবার্ড

4
"কম দক্ষ" আসলে খুব সামান্য, বিশেষত পিএইচপি 7 এর পরে, এটি প্রায় কয়েক এমএস / মিলিয়ন কল রয়েছে: github.com/fab2s/call_user_func
ফেব

4
একটি উত্স অনুসারে , "একটি ভেরিয়েবলের মাধ্যমে অ-বিদ্যমান ফাংশনটি কল করা মারাত্মক ত্রুটির সৃষ্টি করে, যখন কল_উসার_ফুনস () একটি সতর্কতা ফিরিয়ে দেয়" " সুতরাং এটি একটি পার্থক্য।
mbomb007

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
আমি জানি এটি বয়স্ক, তবে আর কোথাও নিবন্ধগুলি খুঁজে পেল না। কল_উজার_ফুনস ('কাস্টমফানশন') f ভেরিয়েবলফিউশন () এর জন্য যেমন ব্যবহার করা বেশি সুবিধাজনক? পার্থক্য কি? ধন্যবাদ!
ডেভিড হবস

14

call_user_funcবিকল্প নেই তাই আপনি ভালো জিনিস করতে পারেন:

$dynamicFunctionName = "barber";

call_user_func($dynamicFunctionName, 'mushroom');

যেখানে dynamicFunctionNameস্ট্রিংটি আরও উত্তেজনাপূর্ণ এবং রান-টাইমে উত্পন্ন হতে পারে। আপনার দরকার না হলে কল_উজার_ফুন ব্যবহার করা উচিত নয়, কারণ এটি ধীর।


4
দেখে মনে হচ্ছে আপনি এই দৃশ্যে একটি পরিবর্তনশীল ফাংশন ব্যবহার করতে পারেন।
অ্যান্টনি

5

আমি কল্পনা করি যে এটি এমন কোনও ফাংশন কল করার জন্য দরকারী যা আপনি নাম আগেই জানেন না ... এর মতো কিছু:

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

call_user_func($func, 'stuff');

6
নাহ। আমরা এখনও করতে পারি$func('stuff');
ankush981

4
হ্যাঁ, তবে পার্থক্যটি একটি ভেরিয়েবল ব্যবহার করছে যদি কল_উজার_ফুনক ব্যবহার করা হয় তবে একটি পিএইচপি মারাত্মক ত্রুটি বনাম পিএইচপি সতর্কতা তৈরি করবে।
রবার্ট ব্রিসিটা

এটি এই দৃশ্যে ভেরিয়েবল ফাংশনগুলির মানটিকে তুচ্ছ করে না call_user_func()
অ্যান্টনি রুটলেজ

5

পিএইচপি 7 এর সাহায্যে আপনি সর্বত্র নিকার ভেরিয়েবল-ফাংশন সিনট্যাক্স ব্যবহার করতে পারেন। এটি স্ট্যাটিক / ইনস্ট্যান্স ফাংশনগুলির সাথে কাজ করে এবং এটি পরামিতিগুলির একটি অ্যারে নিতে পারে। Https://trowski.com/2015/06/20/php-callable-paradox এ আরও তথ্য

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

আফিক্স, এটিই কেবলমাত্র উত্তর যা সত্যই প্রশ্নের উত্তর দেয়।
Mormegil

3

ফাংশনটি কল করার কোনও সুবিধা নেই কারণ আমি মনে করি এটি মূলত "ব্যবহারকারী" ফাংশন (প্লাগইনের মতো) হিসাবে কল করত কারণ মূল ফাইল সম্পাদনা করা ভাল বিকল্প নয়। এখানে ওয়ার্ডপ্রেস দ্বারা ব্যবহৃত নোংরা উদাহরণ রয়েছে

<?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

নেমস্পেসগুলি ব্যবহার করার সময়, কল_ইউজার_ফঙ্ক () এমন কোনও ফাংশনটি চালানোর একমাত্র উপায় যা আপনি আগে নামটি জানেন না, উদাহরণস্বরূপ:

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

যদি আপনার সমস্ত ক্রিয়াকলাপ একই নাম স্থানে থাকে তবে এটি কোনও সমস্যা হবে না, কারণ আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

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

সম্পাদনা: @ জান্নিসকে অনুসরণ করে যে আমি ভুল করে বলছি যে আমি আরও কিছু পরীক্ষা করেছি, এবং খুব বেশি ভাগ্যও পাচ্ছিলাম না:

<?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 মনে হয় দ্বিতীয় পদ্ধতিটি পিএইচপি 7 এর জন্য কাজ করে তবে পিএইচপি 5.6 নয়।


4
। সত্য না হওয়ার জন্য $ fn = '\ ফু \ বার \ get করન્સી'; $ fn ();
জান Sverre

হাই @ জ্যানিস, আমি এটি সত্য বলে খুঁজে পাচ্ছি না, সম্ভবত আপনি দেখতে পাচ্ছেন আমি কোথায় ভুল করছি, আমি আমার উত্তরে আরও বিশদ উদাহরণ যুক্ত করেছি।
টমাস রেডস্টোন

@ থমাস রডস্টোন আপনার আগে এই ফাংশনগুলির প্রয়োজন ছিল? পিএইচপি অন্যান্য ফাইল থেকে ফাংশন অটোল্যাড করে না। নামের জায়গাগুলিতে সেই ছোট বনাম বড় অক্ষরের কী রয়েছে। বার কি ক্লাস? তাহলে এটি অন্য ইউসকেস।
przemo_li

হাই @ প্রজেমো_লি, এটি একটি একক ফাইল (সমস্তই নেমস্পেসের মধ্যেই), নিশ্চিত নয় যে নামপরিবর্তনের নামটি দিয়ে কী ঘটেছিল, আমার প্রতিরক্ষায় আমি উত্তরটি ৪ বছর আগে লিখেছিলাম, আমি নাম স্থানটি আপডেট করেছি এবং একটি নোটে যুক্ত করেছি আসল আউটপুট দেখতে একটি লিঙ্ক সহ পিএইচপি 7। জানসভারে এটি কীভাবে কাজ করেছে তা আমি এখনও জানি না, পিএইচপি 7 11 জুন 2015 পর্যন্ত
আলফায়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.