তাদের মধ্যে প্রধান পার্থক্য closureহ'ল ক একটি শ্রেণি এবং callableএক প্রকার ।
callableটাইপ কিছু করা যেতে পারে গ্রহণ নামক :
var_dump(
is_callable('functionName'),
is_callable([$myClass, 'methodName']),
is_callable(function(){})
);
যেখানে একজন কেবল একটি বেনামি ফাংশন গ্রহণ closureকরবে । মনে রাখবেন যে, পিএইচপি সংস্করণ 7.1 মধ্যে আপনি এখন মত একটি অবসান ফাংশন রূপান্তর করতে পারেন:
।Closure::fromCallable('functionName')
উদাহরণ:
namespace foo{
class bar{
private $val = 10;
function myCallable(callable $cb){$cb()}
function myClosure(\Closure $cb){$cb()} // type hint must refer to global namespace
}
function func(){}
$cb = function(){};
$fb = new bar;
$fb->myCallable(function(){});
$fb->myCallable($cb);
$fb->myCallable('func');
$fb->myClosure(function(){});
$fb->myClosure($cb);
$fb->myClosure(\Closure::fromCallable('func'));
$fb->myClosure('func'); # TypeError
}
সুতরাং কেন একটি closureওভার ব্যবহারcallable ?
কষাকষি কারণ একটি closureএকটি বস্তুর কিছু অতিরিক্ত পদ্ধতি আছে যা হল: call(), bind()এবং bindto()। তারা আপনাকে ক্লাসের বাইরে ঘোষিত একটি ফাংশন ব্যবহার করার অনুমতি দেয় এবং এটি চালিয়ে যায় যেন এটি কোনও শ্রেণীর ভিতরে থাকে।
$inject = function($i){return $this->val * $i;};
$cb1 = Closure::bind($inject, $fb);
$cb2 = $inject->bindTo($fb);
echo $cb1->call($fb, 2); // 20
echo $cb2(3); // 30
আপনি কোনও সাধারণ ক্রিয়াকলাপগুলিতে কল করতে পছন্দ করেন না কারণ এটি মারাত্মক ত্রুটি বাড়িয়ে তুলবে। সুতরাং আপনি যাতে কিছু লিখতে হবে তা রোধ করার জন্য:
if($cb instanceof \Closure){}
প্রতিবার এই চেকটি করা অর্থহীন। সুতরাং আপনি যদি এই পদ্ধতিগুলি ব্যবহার করতে চান তবে যুক্তিটি হ'ল একটি closure। অন্যথায় শুধু একটি সাধারণ ব্যবহার করুন callback। এই পথে; আপনার কোডের পরিবর্তে ফাংশন কলে একটি ত্রুটি উত্থাপিত হয় যার ফলে এটি নির্ণয় করা আরও সহজ হয়ে যায়।
একটি পার্শ্ব নোট অন:closure বর্গ তার যেমন বাড়ানো যাবে না চূড়ান্ত ।
["Foo", "bar"]জন্যFoo::barবা এর[$foo, "bar"]জন্য$foo->bar।