আমি কীভাবে তাত্ক্ষণিক পিএইচপি-তে একটি বেনামী ফাংশন সম্পাদন করব?


96

জাভাস্ক্রিপ্টে, আপনি অবিলম্বে সম্পাদন করা হয় এমন বেনাম ফাংশনগুলি সংজ্ঞায়িত করতে পারেন:

(function () { /* do something */ })()

আপনি কি পিএইচপি তে এরকম কিছু করতে পারেন?


4
চেষ্টা করার জন্য আমার হাতে পিএইচপি 5.3 নেই, তবে কীভাবে হয় call_user_func(function(){/* stuff */})?
জ্যাস্পার

উত্তর:


121

পিএইচপি 7 এর জন্য: ইয়াসুও ওহগাকীর উত্তর দেখুন :(function() {echo 'Hi';})();

পূর্ববর্তী সংস্করণগুলির জন্য: তাত্ক্ষণিকভাবে মৃত্যুদন্ড কার্যকর করার একমাত্র উপায় হ'ল আমি think

call_user_func(function() { echo 'executed'; });

12
(বা, অবধি) ফাংশন কল চেইনিং চালু না হলে এটি আমার পরামর্শ হিসাবেও থাকবে।
সালাতে

4
@ গর্ডন: পিএইচপি 5.4 এখনও কিছুই না?
গতিশীল

@ হ্যাঁ 123 না। এখনও ব্যবহার করতে হবেcall_user_func
গর্ডন

4
@ বেনেটএমসিএলওয়ে আসুন এটি এটিকে রাখুন: এটি যদি সংজ্ঞায়িত-কল বিকল্পের তুলনায় কিছুটা ধীরে ধীরে কাজ করে তবে আপনার অ্যাপ্লিকেশনটিতে এটির একটি গুরুত্বপূর্ণ বাধা আসার সম্ভাবনা খুব কম। সন্দেহজনক অবস্থায় বাস্তব অ্যাপ্লিকেশন শর্তাবলী আপনার অ্যাপ্লিকেশন যখন।
গর্ডন

ধন্যবাদ @ গর্ডন, এটাই আমি ভেবেছিলাম আমি এই ধারণাটি পেয়েছি যে সালাথে এবং হ্যাঁ 123 এই পদ্ধতিতে সন্তুষ্ট নয় এবং কেন আমি তা ভেবে অবাক হয়েছিল। আমার কাছে পুরোপুরি ঠিক আছে বলে মনে হচ্ছে।
বেনেট ম্যাকএলউই


15

অবশ্যই আপনি ব্যবহার করতে পারেন 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";
});

?>

4
আমি তাত্ক্ষণিকভাবে সম্পাদনকারী ফাংশন চাই, কারণ যে ফাংশনটি আমি সংজ্ঞায়িত করছি তা হ'ল এটি যা সাধারণ সম্পাদনের ক্ষেত্রে একাধিকবার ডাকা উচিত নয়। আপনার মতো একটি নামযুক্ত ফাংশন, রান () চালিয়ে যাওয়ার সংজ্ঞা দেওয়ার সাথে সমস্যাটি হ'ল কোডটি দেখলে অন্য কেউ ভাবতে পারে যে তারা কোডের অন্য কোনও অংশেও রানকে কল করতে পারে। তাত্ক্ষণিকভাবে সম্পাদনকারী ফাংশনটি পরিষ্কার করে দেয় যে এই কোডটি দু'বার চালানো উচিত নয়।
ড্যানিয়েল হাওয়ার্ড

4
runকোডের অন্য কোনও অংশে তারা আপনার ফাংশনটিতে কল করতে পারে না কারণ লাইনের পরে আপনার ফাংশনের কোনও হ্যান্ডেল নেই যা এটি অবিলম্বে কার্যকর করে।
পেসারিয়ার

4
@ ড্যানিয়েলহওয়ার্ড এর বিন্দুটি run()তাৎক্ষণিকভাবে এর দ্বারা প্রদত্ত নামবিহীন ফাংশনটি সম্পাদন করা। একইভাবে call_user_func(), কেবল কোনও প্যারামিটারগুলি পাস করা হয় না।
সাইফার

4
@ জর্ডানলিভ, এটির একটি সহজ বাস্তবায়ন রয়েছে (মাত্র একটি লাইন $f();:) এবং আপনি যদি ইঞ্জিন ব্যবহার করেন সেই বিশেষ ক্ষেত্রে যেখানে call_user_funcকেবলমাত্র একটি কার্যকারিতা যুক্তি রয়েছে তার জন্য অনুকূল না হলে দ্রুততর হতে পারে । এর কারণ call_user_funcএটি একাধিক পরামিতিগুলি পাস করার পক্ষে সমর্থন করে এবং এটির প্রথম যুক্তি স্ট্রিংকে আর্গুমেন্ট বা ফাংশন হিসাবে সমর্থন করে। এটি বলেছে, যদি call_user_funcখুব বেশি পাঠযোগ্য হয় runতবে আমি পিরামিডের নীচে কোথাও কোডটি না থাকলে আমি ব্যবহার করব না ।
পেসারিয়ার

4
@ জর্ডানলিভ, "সরল বাস্তবায়ন" বলতে ফাংশনগুলির ভিতরে কোড runএবং এর মধ্যে তুলনা বোঝায় call_user_funccall_user_funcকেবলমাত্র একটি কাজ করে runকারণ তুলনায় একটি অন্তর্নিহিত অসুবিধা runআছে, যেখানে call_user_funcকি করা ছাড়াও অতিরিক্ত বৈশিষ্ট্যগুলি সমর্থন runকরে। আপনার ইঞ্জিনে কোনটি দ্রুত আছে তা দেখতে আপনি একটি দ্রুত লুপ পরীক্ষা ( উদাহরণস্বরূপ ) চেষ্টা করতে পারেন।
পেসারিয়ার

11

এটি পিএইচপি 7.0 বা তার পরে সবচেয়ে সহজ।

php -r '(function() {echo 'Hi';})();'

এর অর্থ ক্লোজার তৈরি করা, তারপরে "()" অনুসরণ করে এটি ফাংশন হিসাবে কল করুন। ইউনিফর্ম ভেরিয়েবল মূল্যায়ন আদেশের জন্য জেএস ধন্যবাদ মত কাজ করে।

https://3v4l.org/06EL3


4
ভাল উত্তর, তবে আপনি কেন এটি কমান্ড লাইন অপারেশন হিসাবে ফর্ম্যাট করবেন?
কোডোস জনসন


2

দ্রষ্টব্য, গৃহীত উত্তরটি ঠিক আছে তবে কোনও ক্রিয়াকলাপটি ঘোষণার চেয়ে এবং এটি দুটি লাইনে কল করার চেয়ে 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)

0

আমি এটি এইভাবে চেষ্টা করেছি, তবে এটি কোনও অপারেটর (বা ফাংশন) ব্যবহার করে উপরের উত্তরের চেয়ে আরও ভার্জোজ যা আপনাকে প্রথমে ফাংশনটি সংজ্ঞায়িত করতে দেয়:

    $value = $hack == ($hack = function(){
            // just a hack way of executing an anonymous function
            return array(0, 1, 2, 3);                
    }) ? $hack() : $hack();

4
তাহলে কেন সহজভাবে নয় $hack = function(){...}; $hack()?

0

এটি প্রত্যক্ষ উত্তর নয়, তবে একান্ত কর্মসংশ্লিষ্ট। পিএইচপি> = 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.

-2

অবিলম্বে মৃত্যুদন্ড কার্যকর করা হয় নি, তবে এর কাছাকাছি;)

<?php

$var = (function(){ echo 'do something'; });
$var();

?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.