উত্তর:
is_callable
ফাংশনটি ব্যবহার করা উচিত । এটি ভেরিয়েবেলে এমন কোনও কিছু রয়েছে যা ফাংশন হিসাবে ডাকা যেতে পারে কিনা তা
call_user_func(array('ClassName', 'method'), $args)
আমার প্রিয় সংস্করণটি হ'ল ইনলাইন সংস্করণ:
${"variableName"} = 12;
$className->{"propertyName"};
$className->{"methodName"}();
StaticClass::${"propertyName"};
StaticClass::{"methodName"}();
আপনি বন্ধনীগুলির ভিতরেও ভেরিয়েবল বা এক্সপ্রেশন রাখতে পারেন!
{"functionName"}();
আইনী নয় এবং একটি সিনট্যাক্স ত্রুটি নিক্ষেপ করবে।
হ্যা এটা সম্ভব:
function foo($msg) {
echo $msg."<br />";
}
$var1 = "foo";
$var1("testing 1,2,3");
সূত্র: http://www.onlamp.com/pub/a/php/2001/05/17/php_foundations.html?page=2
ইতিমধ্যে উল্লিখিত হিসাবে, সম্ভবত সবচেয়ে নিরাপদ পদ্ধতিটি দিয়ে এটি অর্জনের কয়েকটি উপায় রয়েছে call_user_func()
বা যদি আপনাকে অবশ্যই প্রয়োজন হয় তবে আপনিও এই পথে যেতে পারেন $function_name()
। এই উভয় পদ্ধতি ব্যবহার করে তর্কগুলি পাস করা সম্ভব
$function_name = 'foobar';
$function_name(arg1, arg2);
call_user_func_array($function_name, array(arg1, arg2));
আপনি যে ফাংশনটি কল করছেন সেটি যদি কোনও অবজেক্টের হয় তবে আপনি এখনও এর মধ্যে দুটি ব্যবহার করতে পারেন
$object->$function_name(arg1, arg2);
call_user_func_array(array($object, $function_name), array(arg1, arg2));
তবে আপনি যদি $function_name()
পদ্ধতিটি ব্যবহার করতে যাচ্ছেন তবে নামটি কোনওভাবেই গতিশীল থাকলে ফাংশনের অস্তিত্বের জন্য পরীক্ষা করা ভাল ধারণা হতে পারে
if(method_exists($object, $function_name))
{
$object->$function_name(arg1, arg2);
}
যদি গুগলের মাধ্যমে অন্য কাউকে এখানে আনা হয় কারণ তারা শ্রেণীর মধ্যে কোনও পদ্ধতির জন্য একটি ভেরিয়েবল ব্যবহার করার চেষ্টা করছিল, নীচে একটি কোড নমুনা যা আসলে কাজ করবে। উপরের কেউই আমার পরিস্থিতির জন্য কাজ করেনি। কী পার্থক্য নেই &
এর ঘোষণায় $c = & new...
এবং &$c
পাস হচ্ছে call_user_func
।
আমার নির্দিষ্ট ক্ষেত্রেটি হ'ল রঙ এবং দুটি সদস্য পদ্ধতি lighten()
এবং darken()
সিএসক্লোর.এফপি ক্লাস থেকে কারও কোড প্রয়োগ করার সময় । যে কারণেই হোক না কেন, আমি একই কোডটি যুক্তি দিয়ে বেছে নেওয়ার চেয়ে হালকা কল করতে বা অন্ধকার করতে সক্ষম হতে চেয়েছিলাম। এটি যদি কেবল অন্যথায় ব্যবহার না করে বা এই পদ্ধতিতে কলিং কোড পরিবর্তন না করে তবে আমার অনড়তার ফলাফল হতে পারে।
$lightdark="lighten"; // or optionally can be darken
$color="fcc"; // a hex color
$percent=0.15;
include_once("csscolor.php");
$c = & new CSS_Color($color);
$rtn=call_user_func( array(&$c,$lightdark),$color,$percent);
নোট করুন যে কিছু চেষ্টা করেও $c->{...}
কাজ হয়নি। পিএইচপি.এন.পির পৃষ্ঠার নীচে পাঠকের-অবদানযুক্ত সামগ্রীটি ব্যবহার করার পরে call_user_func
, আমি উপরেরটি একসাথে টুকরো টুকরো করতে সক্ষম হয়েছি। এছাড়াও, নোট $params
হিসাবে আমার জন্য কাজ করে না তা নোট করুন:
// This doesn't work:
$params=Array($color,$percent);
$rtn=call_user_func( array(&$c,$lightdark),$params);
উপরের এই প্রয়াসটি ২ য় আর্গুমেন্ট (শতাংশ) প্রত্যাশা পদ্ধতি সম্পর্কে সতর্কতা দেবে।
কয়েক বছর দেরি হয়ে গেছে, তবে এটি এখনই সেরা পদ্ধতি ho
$x = (new ReflectionFunction("foo"))->getClosure();
$x();
সম্পূর্ণতার জন্য, আপনি ইওল () ব্যবহার করতে পারেন :
$functionName = "foo()";
eval($functionName);
তবে, call_user_func()
সঠিক উপায়।
eval
এই প্রশ্নের সমাধান নয়।
দ্রষ্টব্য: সংক্ষিপ্ত সংস্করণটির জন্য, উত্তরের শেষে টিএল; ডিআর দেখুন।
আপডেট : এখানে বর্ণিত পুরানো একটি পদ্ধতি মুছে ফেলা হয়েছে। অন্যান্য পদ্ধতির ব্যাখ্যার জন্য অন্যান্য উত্তরগুলি দেখুন, এটি এখানে আচ্ছাদিত নয়। যাইহোক, যদি এই উত্তরটি আপনাকে সহায়তা না করে তবে আপনার জিনিসগুলি আপগ্রেড করা উচিত। পিএইচপি 5.6 সমর্থন জানুয়ারী 2019 এ শেষ হয়েছে (এখন পর্যন্ত পিএইচপি 7.0 এবং 7.1 সমর্থন করা হচ্ছে না)। আরও তথ্যের জন্য সমর্থিত সংস্করণগুলি দেখুন ।
অন্যরা যেমন উল্লেখ করেছে, পিএইচপি 5 তে (এবং পিএইচপি 7 এর মতো নতুন সংস্করণগুলিতে) আমরা ফাংশন নাম, ব্যবহার call_user_func()
এবং call_user_func_array()
(যা ব্যক্তিগতভাবে আমি সেই ফাংশনগুলিকে ঘৃণা করি) ইত্যাদি হিসাবে ভেরিয়েবলগুলি ব্যবহার করতে পারি etc.
পিএইচপি 7 হিসাবে, নতুন উপায় চালু করা হয়েছে:
দ্রষ্টব্য:<something>
বন্ধনীর ভিতরে থাকা প্রত্যেকটির <function_name>
অর্থ কোনও কিছু গঠনের জন্য এক বা একাধিক এক্সপ্রেশন, উদাহরণস্বরূপ কোনও ফাংশনের নাম গঠন করা এক্সপ্রেশন।
আমরা বন্ধনীতে এক বা একাধিক এক্সপ্রেশন ব্যবহার করতে পারি ফাংশনের নাম হিসাবে কেবল একবারে, আকারে:
(<function_name>)(arguments);
উদাহরণ স্বরূপ:
function something(): string
{
return "something";
}
$bar = "some_thing";
(str_replace("_", "", $bar))(); // something
// Possible, too; but generally, not recommended, because makes your code more complicated
(str_replace("_", "", $bar))()();
দ্রষ্টব্য: চারপাশে প্রথম বন্ধনীর অপসারণ str_replace()
কোনও ত্রুটি নয়, তবুও বন্ধনী স্থাপন কোড আরও পাঠযোগ্য। তবে আপনি কখনও কখনও এটি করতে পারবেন না, যেমন .
অপারেটর ব্যবহার করার সময় । সামঞ্জস্যপূর্ণ হতে, আমি আপনাকে সর্বদা বন্ধনী রাখার পরামর্শ দিই।
ডায়নামিক ফাংশন কলগুলির মতো আমরাও একই পদ্ধতিতে কল করতে পারি, বন্ধনীগুলির পরিবর্তে কোঁকড়া ধনুর্বন্ধনী দ্বারা ঘিরে (অতিরিক্ত ফর্মের জন্য, টিএল নেভিগেট; ডিআর বিভাগে):
$object->{<method_name>}(arguments);
$object::{<method_name>}(arguments);
এটি একটি উদাহরণে দেখুন:
class Foo
{
public function another(): string
{
return "something";
}
}
$bar = "another thing";
(new Something())->{explode(" ", $bar)[0]}(); // something
পিএইচপি 7-তে আরও একটি মার্জিত উপায় যুক্ত করা হল:
[<object>, <method_name>](arguments);
[<class_name>, <method_name>](arguments); // Static calls only
উদাহরণ হিসাবে:
class Foo
{
public function nonStaticCall()
{
echo "Non-static call";
}
public static function staticCall()
{
echo "Static call";
}
}
$x = new X();
[$x, "non" . "StaticCall"](); // Non-static call
[$x, "static" . "Call"](); // Static call
দ্রষ্টব্য: পূর্ববর্তীটির তুলনায় এই পদ্ধতিটি ব্যবহারের সুবিধাটি হ'ল, আপনি কলের ধরণের বিষয়ে উদ্বিগ্ন হন না (যেমন এটি স্থির কিনা।
জিনিসগুলিকে কিছুটা জটিল করে তোলার জন্য, আপনি বেনামে ক্লাস এবং উপরের বৈশিষ্ট্যগুলির সংমিশ্রণটি ব্যবহার করতে পারেন :
$bar = "SomeThing";
echo (new class {
public function something()
{
return 512;
}
})->{strtolower($bar)}(); // 512
সাধারণত, পিএইচপি 7 তে নিম্নলিখিত ফর্মগুলি ব্যবহার করে সমস্ত সম্ভব:
// Everything inside `<something>` brackets means one or more expressions
// to form something
// Dynamic function call
(<function_name>)(arguments)
// Dynamic method call on an object
$object->{<method_name>}(arguments)
$object::{<method_name>}(arguments)
// Dynamic method call on a dynamically-generated object
(<object>)->{<method_name>}(arguments)
(<object>)::{<method_name>}(arguments)
// Dynamic method call, statically
ClassName::{<method_name>}(arguments)
(<class_name>)::{<method_name>}(arguments)
// Dynamic method call, array-like (no different between static and non-static calls
[<object>, <method_name>](arguments)
// Dynamic method call, array-like, statically
[<class_name>, <method_name>](arguments)
মূলত এই পিএইচপি আলাপের ভিত্তিতে ।
(expressions)->$bar()
নেমস্পেসগুলি ব্যবহার করার সময় গতিশীল ফাংশন নামের সম্পর্কে একটি পয়েন্ট যুক্ত করতে।
আপনি যদি নেমস্পেস ব্যবহার করছেন তবে বিশ্বব্যাপী নেমস্পেসে আপনার ফাংশনটি বাদ দিলে নিম্নলিখিতগুলি কাজ করবে না :
namespace greetings;
function hello()
{
// do something
}
$myvar = "hello";
$myvar(); // interpreted as "\hello();"
call_user_func()
পরিবর্তে আপনাকে ব্যবহার করতে হবে:
// if hello() is in the current namespace
call_user_func(__NAMESPACE__.'\\'.$myvar);
// if hello() is in another namespace
call_user_func('mynamespace\\'.$myvar);
@ ক্রিস কে এর উত্তরটি পরিপূরক করে যদি আপনি কোনও অবজেক্টের পদ্ধতিতে কল করতে চান তবে আপনি এটি বন্ধের সাহায্যে একটি একক ভেরিয়েবল ব্যবহার করে কল করতে পারেন:
function get_method($object, $method){
return function() use($object, $method){
$args = func_get_args();
return call_user_func_array(array($object, $method), $args);
};
}
class test{
function echo_this($text){
echo $text;
}
}
$test = new test();
$echo = get_method($test, 'echo_this');
$echo('Hello'); //Output is "Hello"
আমি এখানে অন্য একটি উদাহরণ পোস্ট
যাক আমার এই পরিবর্তনগুলি এবং ফাংশন রয়েছে:
$functionName1 = "sayHello";
$functionName2 = "sayHelloTo";
$functionName3 = "saySomethingTo";
$friend = "John";
$datas = array(
"something"=>"how are you?",
"to"=>"Sarah"
);
function sayHello()
{
echo "Hello!";
}
function sayHelloTo($to)
{
echo "Dear $to, hello!";
}
function saySomethingTo($something, $to)
{
echo "Dear $to, $something";
}
যুক্তি ছাড়াই ফাংশন কল করতে
// Calling sayHello()
call_user_func($functionName1);
হ্যালো!
1 টি যুক্তি সহ ফাংশন কল করতে
// Calling sayHelloTo("John")
call_user_func($functionName2, $friend);
প্রিয় জন, হ্যালো!
1 বা ততোধিক আর্গুমেন্টের সাথে ফাংশনটি কল করতে
আপনি যদি কার্যকরভাবে আপনার ফাংশনগুলিকে কল করে থাকেন এবং প্রতিটি ফাংশনে বিভিন্ন সংখ্যক যুক্তি রয়েছে তবে এটি কার্যকর হবে। এটি আমার ক্ষেত্রে যা আমি সন্ধান করেছি (এবং সমাধান করেছি)। call_user_func_array
চাবিকাঠি
// You can add your arguments
// 1. statically by hard-code,
$arguments[0] = "how are you?"; // my $something
$arguments[1] = "Sarah"; // my $to
// 2. OR dynamically using foreach
$arguments = NULL;
foreach($datas as $data)
{
$arguments[] = $data;
}
// Calling saySomethingTo("how are you?", "Sarah")
call_user_func_array($functionName3, $arguments);
প্রিয় সারাহ, কেমন আছেন?
ইয়ে বাই!
কল_ইউজার_ফঙ্ক ফাংশনটি ব্যবহার করুন।
নিম্নলিখিত কোড পিএইচপি-তে ডায়নামিক ফাংশন লিখতে সহায়তা করতে পারে। এখন ফাংশনের নামটি পরিবর্তনশীল '$ কারেন্ট_পেজ' দ্বারা পরিবর্তনশীল হতে পারে।
$current_page = 'home_page';
$function = @${$current_page . '_page_versions'};
$function = function() {
echo 'current page';
};
$function();
$function
কোনও কারণ ছাড়াই পরিবর্তনশীল প্রতিস্থাপন করছেন ।
ভেরিয়েবলের মধ্যে সংরক্ষিত নামটি ব্যবহার করে কোনও ফাংশনটি নিরাপদে কল করার সহজ উপায় হ'ল,
//I want to call method deploy that is stored in functionname
$functionname = 'deploy';
$retVal = {$functionname}('parameters');
আমি নীচের মতো লারাভেলে মাইগ্রেশন টেবিলগুলি গতিশীলভাবে তৈরি করতে ব্যবহার করেছি,
foreach(App\Test::$columns as $name => $column){
$table->{$column[0]}($name);
}
একটি প্রচলিত পদ্ধতি, যা আমার মনে এসেছিল তা হ'ল যদি আপনি কিছু সুপার অতি স্বায়ত্তশাসিত এআইয়ের মাধ্যমে পুরো কোডটি তৈরি না করেন যা নিজে লিখেছেন , আপনার "গতিশীল" কল করতে চান এমন ফাংশনগুলি ইতিমধ্যে আপনার কোডে সংজ্ঞায়িত হয়েছে এমন উচ্চ সম্ভাবনা রয়েছে are বেস। সুতরাং কেন কেবল স্ট্রিংটি পরীক্ষা করে দেখুন না এবং কুখ্যাত ifelse
নৃত্যকে আহবান করার জন্য ... আপনি আমার বক্তব্য পান get
যেমন।
if($functionName == 'foo'){
foo();
} else if($functionName == 'bar'){
bar();
}
এমনকি switch-case
যদি আপনি ifelse
মইয়ের স্বাদযুক্ত স্বাদ পছন্দ না করেন তবে ব্যবহার করা যেতে পারে ।
আমি বুঝতে পারি যে কিছু ক্ষেত্রে রয়েছে " গতিশীলভাবে ফাংশনটি কল করা " একটি পরম প্রয়োজনীয়তা ( কিছু পুনরাবৃত্ত যুক্তির মতো যা নিজেই পরিবর্তিত হয় )। তবে প্রতিদিনের বেশিরভাগ তুচ্ছ ব্যবহারের ক্ষেত্রে স্রেফ ডজ করা যায়।
এটি আপনার অ্যাপ্লিকেশন থেকে প্রচুর অনিশ্চয়তা ছড়িয়ে দেয়, যখন স্ট্রিং উপলব্ধ কার্যের কোনও সংজ্ঞা না মিলে তবে আপনাকে ফ্যালব্যাক ফাংশন সম্পাদন করার সুযোগ দেয়। এই প্রোগ্রামটিতে।
if (method_exists($functionName)) $functionName(); else //exception or handle
আপনি কেন এটি ব্যবহার করতে হবে তা আমি জানি না, মোটেও আমার পক্ষে খুব ভাল লাগছে না, তবে কেবলমাত্র যদি অল্প পরিমাণে ফাংশন থাকে তবে আপনি যদি / অন্যরকম নির্মাণ করতে পারেন তবে ব্যবহার করতে পারেন। সরাসরি সমাধান সম্ভব কিনা তা আমি জানি না।
something foo = "বার" এর মতো কিছু; $ পরীক্ষা = "ফু"; প্রতিধ্বনি $$ পরীক্ষা;
বারটি ফিরে আসা উচিত, আপনি চেষ্টা করতে পারেন তবে আমি মনে করি না এটি কাজ করে for