জাভাস্ক্রিপ্টে, আপনি অবিলম্বে সম্পাদন করা হয় এমন বেনাম ফাংশনগুলি সংজ্ঞায়িত করতে পারেন:
(function () { /* do something */ })()
আপনি কি পিএইচপি তে এরকম কিছু করতে পারেন?
জাভাস্ক্রিপ্টে, আপনি অবিলম্বে সম্পাদন করা হয় এমন বেনাম ফাংশনগুলি সংজ্ঞায়িত করতে পারেন:
(function () { /* do something */ })()
আপনি কি পিএইচপি তে এরকম কিছু করতে পারেন?
উত্তর:
পিএইচপি 7 এর জন্য: ইয়াসুও ওহগাকীর উত্তর দেখুন :(function() {echo 'Hi';})();
পূর্ববর্তী সংস্করণগুলির জন্য: তাত্ক্ষণিকভাবে মৃত্যুদন্ড কার্যকর করার একমাত্র উপায় হ'ল আমি think
call_user_func(function() { echo 'executed'; });
call_user_func
ইন PHP 7করতে JavaScript এ একই
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;
আউটপুটটি হ'ল:
1
2
3
অবশ্যই আপনি ব্যবহার করতে পারেন call_user_func, তবে আরও একটি সহজ সরল বিকল্প রয়েছে:
<?php
// we simply need to write a simple function called run:
function run($f){
$f();
}
// and then we can use it like this:
run(function(){
echo "do something";
});
?>
runকোডের অন্য কোনও অংশে তারা আপনার ফাংশনটিতে কল করতে পারে না কারণ লাইনের পরে আপনার ফাংশনের কোনও হ্যান্ডেল নেই যা এটি অবিলম্বে কার্যকর করে।
run()তাৎক্ষণিকভাবে এর দ্বারা প্রদত্ত নামবিহীন ফাংশনটি সম্পাদন করা। একইভাবে call_user_func(), কেবল কোনও প্যারামিটারগুলি পাস করা হয় না।
$f();:) এবং আপনি যদি ইঞ্জিন ব্যবহার করেন সেই বিশেষ ক্ষেত্রে যেখানে call_user_funcকেবলমাত্র একটি কার্যকারিতা যুক্তি রয়েছে তার জন্য অনুকূল না হলে দ্রুততর হতে পারে । এর কারণ call_user_funcএটি একাধিক পরামিতিগুলি পাস করার পক্ষে সমর্থন করে এবং এটির প্রথম যুক্তি স্ট্রিংকে আর্গুমেন্ট বা ফাংশন হিসাবে সমর্থন করে। এটি বলেছে, যদি call_user_funcখুব বেশি পাঠযোগ্য হয় runতবে আমি পিরামিডের নীচে কোথাও কোডটি না থাকলে আমি ব্যবহার করব না ।
runএবং এর মধ্যে তুলনা বোঝায় call_user_func। call_user_funcকেবলমাত্র একটি কাজ করে runকারণ তুলনায় একটি অন্তর্নিহিত অসুবিধা runআছে, যেখানে call_user_funcকি করা ছাড়াও অতিরিক্ত বৈশিষ্ট্যগুলি সমর্থন runকরে। আপনার ইঞ্জিনে কোনটি দ্রুত আছে তা দেখতে আপনি একটি দ্রুত লুপ পরীক্ষা ( উদাহরণস্বরূপ ) চেষ্টা করতে পারেন।
এটি পিএইচপি 7.0 বা তার পরে সবচেয়ে সহজ।
php -r '(function() {echo 'Hi';})();'
এর অর্থ ক্লোজার তৈরি করা, তারপরে "()" অনুসরণ করে এটি ফাংশন হিসাবে কল করুন। ইউনিফর্ম ভেরিয়েবল মূল্যায়ন আদেশের জন্য জেএস ধন্যবাদ মত কাজ করে।
(new ReflectionFunction(function() {
// body function
}))->invoke();
দ্রষ্টব্য, গৃহীত উত্তরটি ঠিক আছে তবে কোনও ক্রিয়াকলাপটি ঘোষণার চেয়ে এবং এটি দুটি লাইনে কল করার চেয়ে 1.41x দীর্ঘ (41% ধীর) বেশি লাগে।
[আমি জানি এটি আসলে কোনও নতুন উত্তর নয় তবে আমি অনুভব করেছি যে এটি কোথাও দর্শনার্থীদের জন্য যুক্ত করা মূল্যবান was]
বিশদ:
<?php
# Tags: benchmark, call_user_func, anonymous function
require_once("Benchmark.php");
bench(array(
'test1_anonfunc_call' => function(){
$f = function(){
$x = 123;
};
$f();
},
'test2_anonfunc_call_user_func' => function(){
call_user_func(
function(){
$x = 123;
}
);
}
), 10000);
?>
ফলাফল:
$ php test8.php
test1_anonfunc_call took 0.0081379413604736s (1228812.0001172/s)
test2_anonfunc_call_user_func took 0.011472940444946s (871616.13432805/s)
আমি এটি এইভাবে চেষ্টা করেছি, তবে এটি কোনও অপারেটর (বা ফাংশন) ব্যবহার করে উপরের উত্তরের চেয়ে আরও ভার্জোজ যা আপনাকে প্রথমে ফাংশনটি সংজ্ঞায়িত করতে দেয়:
$value = $hack == ($hack = function(){
// just a hack way of executing an anonymous function
return array(0, 1, 2, 3);
}) ? $hack() : $hack();
এটি প্রত্যক্ষ উত্তর নয়, তবে একান্ত কর্মসংশ্লিষ্ট। পিএইচপি> = 7. ব্যবহার করে একটি নামকৃত পদ্ধতি সহ একটি বেনাম শ্রেণীর সংজ্ঞা দেওয়া এবং ক্লাসটি তৈরি করা এবং এই মুহুর্তে পদ্ধতিটিকে কল করা।
$var = (new class() { // Anonymous class
function cool() { // Named method
return 'neato';
}
})->cool(); // Instantiate the anonymous class and call the named method
echo $var; // Echos neato to console.
call_user_func(function(){/* stuff */})?