কোনও ভেরিয়েবল কোন ফাংশন কিনা তা নির্ধারণ করতে পিএইচপি is_function ()


89

আমি প্রায় সম্পর্কে পড়তে উত্তেজিত ছিল বেনামী ফাংশন পিএইচপি, যা আপনি একটি পরিবর্তনশীল ফাংশন চেয়ে সহজ আপনার সাথে কাজ করতে পারে যে ঘোষণা create_function । এখন আমি ভাবছি যদি আমার একটি ফাংশন থাকে যা একটি ভেরিয়েবল পাস হয়ে যায় তবে এটি কোনও ফাংশন কিনা তা নির্ধারণ করার জন্য আমি কীভাবে এটি পরীক্ষা করতে পারি? এখনও কোনও is_function () ফাংশন নেই, এবং যখন আমি কোনও ভেরিয়েবলের একটি var_dump করি যা একটি ফাংশন ::

$func = function(){
    echo 'asdf';
};
var_dump($func);

বুঝতে পেরেছি:

object(Closure)#8 (0) { } 

এটি কোনও ফাংশন কিনা তা যাচাই করবেন কীভাবে কোনও চিন্তা?

উত্তর:


142

is_callableপ্রদত্ত ভেরিয়েবল একটি ফাংশন কিনা তা নির্ধারণ করতে ব্যবহার করুন । উদাহরণ স্বরূপ:

$func = function()
{  
    echo 'asdf';  
};

if( is_callable( $func ) )
{
    // Will be true.
}

10
is_callable () আপনি বেনামে কোনও ফাংশন, স্ট্রিং হিসাবে কোনও ফাংশনের নাম, বা একটি বৈধ পিএইচপি কলব্যাক অ্যারে যাচ্ছেন তা দুর্দান্ত কাজ করবে। আপনি যদি বিশেষভাবে কেবল বেনাম ফাংশনগুলি পরীক্ষা করতে চান তবে গাম্বো যা বলেছেন তার মতো আপনি কিছু চাইবেন: প্যারামিটারটি কোনও বস্তু কিনা তা নিশ্চিত করুন এবং নিশ্চিত করুন যে এটি বন্ধ হওয়ার কোনও উদাহরণ।
লেন

4
আমি যদি ওয়েটার পরীক্ষা করতে চাই তবে এটি একটি কলক বা একটি স্ট্রিং এবং তাদের জন্য বিভিন্ন কাজ করতে পারে। আমি চাই না যে স্ট্রিংয়ের মানটি দুর্ঘটনাক্রমে কলব্যাক হিসাবে নেওয়া হোক।
গেরম্যান

4
@ জারমান প্রথমে চেক করুন যদি is_string ($ ফানক) হয় তবে দ্বিতীয় চেক হিসাবে is_callable ($ func) হিসাবে
হেরোস্লোহিম

4
উপরের কোড স্নিপেট আমাকে সমস্যায় ফেলেছে। আমি "তারিখ" লেবেলযুক্ত একটি স্ট্রিং চেয়েছিলাম এবং এটি পরে বন্ধ হিসাবে পরিচালনা করা হয়েছিল এবং কার্যকর করা হয়েছিল। সঠিক উপায়টি যদি ((los বন্ধের পরিবর্তনশীল উদাহরণস্বরূপ) && is_callable ($ ভেরিয়েবল)) {...}
বেসিল মুসা

4
বন্ধ হওয়ার উদাহরণ কেন বলা যায় এবং কলযোগ্য। বন্ধ যখন কল করা যায় না? সময় পেলে অবাক হবেন না, তবে কেন আমাদের দুটি চেক দরকার তা জানতে আগ্রহী।
জোয়েল এম

34

আপনি function_existsপ্রদত্ত নামের সাথে একটি ফাংশন আছে তা পরীক্ষা করতে ব্যবহার করতে পারেন । এবং এটি বেনামে ফাংশনগুলির সাথে একত্রিত করতে, এটি চেষ্টা করুন:

function is_function($f) {
    return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure));
}

এর জন্য ধন্যবাদ! আমার অ্যাপ্লিকেশন ব্যবহারকারীদের নিজস্ব হ্যাশিং ফাংশন নির্দিষ্ট করতে বা পর্যায়ক্রমে হ্যাশ () এর জন্য একটি আর্গুমেন্ট সরবরাহ করার অনুমতি দেয়। তবে কিছু বৈধ হ্যাশিং অ্যালগরিদম হ'ল পিএইচপি বিল্টইনস, এবং তাই কলযোগ্য (উদাহরণস্বরূপ 'এমডি 5', 'শা 1')) is_object()এবং instanceof Closureএটি চেক করার জন্য আরও শক্তিশালী উপায়!
njbair

Is_string এবং ফাংশন_এক্সিস্ট কলগুলি সরান এবং ল্যাম্বদা ফাংশন সনাক্ত করতে আপনি এটি ব্যবহার করতে চান এটি ফাংশন। ধন্যবাদ!
জ্যাক

30

আপনি যদি কেবল ভেরিয়েবলটি একটি বেনাম ফাংশন, এবং কলযোগ্য স্ট্রিং বা অ্যারের নয় তা পরীক্ষা করতে চান তবে ব্যবহার করুন instanceof

$func = function()
{  
    echo 'asdf';  
};

if($func instanceof Closure)
{
    // Will be true.
}

বেনামে ফাংশন (পিএইচপি 5.3 তে যে ধরণের সংযোজন করা হয়েছিল) সর্বদা Closureশ্রেণীর উদাহরণ এবং ক্লাসের প্রতিটি উদাহরণ Closureএকটি বেনাম ফাংশন।

পিএইচপি-তে অন্য ধরণের জিনিস রয়েছে যা তর্কযোগ্যভাবে একটি ফাংশন হিসাবে বিবেচিত হতে পারে এবং এটি সেই জিনিস যা __invokeযাদু পদ্ধতি প্রয়োগ করে । যদি আপনি সেগুলি অন্তর্ভুক্ত করতে চান (এখনও স্ট্রিং এবং অ্যারে বাদে), ব্যবহার করুন method_exists($func, '__invoke')। এটি এখনও ক্লোজারগুলি অন্তর্ভুক্ত করবে, যেহেতু ক্লোজারগুলি __invokeধারাবাহিকতার জন্য কার্যকর করে ।


8
এটি বিশেষত সহায়ক, কারণ is_callable()স্ট্রিং বা অ্যারে পাসের উপর ভিত্তি করে কল করার জন্য কোনও পদ্ধতি খোঁজার চেষ্টা করবে, যা ক্লাসগুলি অটোলোড করতে পারে এবং আপনার প্রত্যাশা / প্রয়োজনীয় আচরণ নাও হতে পারে।
spikyjt

2
function is_function($f) {
    return is_callable($f) && !is_string($f);
}

ভবিষ্যতে, পিএইচপি অন্যান্য ভাষাগুলি যেমন করেছে, তেমন বস্তু থেকে কলযোগ্য হিসাবে গেটটাইপ () পরিবর্তন করতে পারে। সুতরাং, এই উত্তরটি সম্ভবত যাওয়ার সবচেয়ে ভাল উপায়। তবে এটি অপ্টিমাইজ করা যেতে পারে: রিটার্ন! Is_string ($ f) &&! Is_array ($ f) && is_clalable ($ f)।
আলেকজান্দ্রে টি।

0

পিএইচপি-তে বৈধ কলযোগ্য ফাংশন, ফাংশনের নাম (স্ট্রিং) এবং ফর্মগুলির অ্যারে ['className', 'staticMethod']বা [$object, 'method']হতে পারে, সুতরাং কেবল ফাংশন সনাক্ত করতে স্ট্রিং এবং অ্যারে বাদ দিতে হবে:

function isFunction($callable) {
    return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.