পিএইচপি-তে কলব্যাকগুলি কীভাবে লেখা হয়?
পিএইচপি-তে কলব্যাকগুলি কীভাবে লেখা হয়?
উত্তর:
ম্যানুয়ালটি "কলব্যাক" এবং "কলযোগ্য" পদটি আন্তঃবিন্যস্তভাবে ব্যবহার করে, তবে, "কলব্যাক" traditionতিহ্যগতভাবে একটি স্ট্রিং বা অ্যারের মানকে বোঝায় যা ফাংশন পয়েন্টারের মতো কাজ করে , ভবিষ্যতের অনুরোধের জন্য কোনও ফাংশন বা শ্রেণি পদ্ধতি উল্লেখ করে। এটি পিএইচপি 4 সাল থেকে কার্যকরী প্রোগ্রামিংয়ের কিছু উপাদানকে অনুমতি দিয়েছে The স্বাদগুলি হ'ল:
$cb1 = 'someGlobalFunction';
$cb2 = ['ClassName', 'someStaticMethod'];
$cb3 = [$object, 'somePublicMethod'];
// this syntax is callable since PHP 5.2.3 but a string containing it
// cannot be called directly
$cb2 = 'ClassName::someStaticMethod';
$cb2(); // fatal error
// legacy syntax for PHP 4
$cb3 = array(&$object, 'somePublicMethod');
সাধারণভাবে কলযোগ্য মানগুলি ব্যবহারের এটি একটি নিরাপদ উপায়:
if (is_callable($cb2)) {
// Autoloading will be invoked to load the class "ClassName" if it's not
// yet defined, and PHP will check that the class has a method
// "someStaticMethod". Note that is_callable() will NOT verify that the
// method can safely be executed in static context.
$returnValue = call_user_func($cb2, $arg1, $arg2);
}
আধুনিক পিএইচপি সংস্করণগুলি উপরের প্রথম তিনটি ফর্ম্যাটগুলিকে সরাসরি অনুরোধ করার অনুমতি দেয় $cb()। call_user_funcএবং call_user_func_arrayউপরের সমস্ত সমর্থন।
দেখুন: http://php.net/manual/en/language.tyype.callable.php
নোট / আদেশ সহকারে:
['Vendor\Package\Foo', 'method']call_user_func, রেফারেন্স দ্বারা অ বস্তু ক্ষণস্থায়ী যাতে আপনি পারেন ব্যবহার করতে পারেন সমর্থন করে না call_user_func_arrayএকটি Var অথবা পরে পিএইচপি সংস্করণে, কলব্যাক সংরক্ষণ এবং সরাসরি সিনট্যাক্স ব্যবহার করুন: $cb();__invoke()(বেনামে ফাংশন সহ) "কলযোগ্য" বিভাগের অধীনে আসে এবং একইভাবে ব্যবহার করা যেতে পারে, তবে আমি ব্যক্তিগতভাবে এগুলি লিগ্যাসির "কলব্যাক" শব্দটির সাথে যুক্ত করি না।create_function()একটি বিশ্বব্যাপী ফাংশন তৈরি করে এবং এর নাম ফিরিয়ে দেয়। এটি এর জন্য একটি মোড়ক eval()এবং এর পরিবর্তে বেনামী ফাংশন ব্যবহার করা উচিত।'someGlobalFunction'এটি একটি সংজ্ঞায়িত ফাংশন , তা উল্লেখ করতে সহায়ক হবে ।
পিএইচপি 5.3 এর সাহায্যে আপনি এখন এটি করতে পারেন:
function doIt($callback) { $callback(); }
doIt(function() {
// this will be done
});
অবশেষে এটি করার একটি দুর্দান্ত উপায়। পিএইচপি-তে একটি দুর্দান্ত সংযোজন, কারণ কলব্যাকগুলি দুর্দান্ত।
কলব্যাকের বাস্তবায়ন যেমন হয়
// This function uses a callback function.
function doIt($callback)
{
$data = "this is my data";
$callback($data);
}
// This is a sample callback function for doIt().
function myCallback($data)
{
print 'Data is: ' . $data . "\n";
}
// Call doIt() and pass our sample callback function's name.
doIt('myCallback');
প্রদর্শন: ডেটা হ'ল এটি আমার ডেটা
call_user_func()যখন এমন একটি সিনট্যাক্স ব্যবহার করতে চায় যা তাদের ডায়নামিকভাবে ফাংশনগুলি কল করতে এবং কলব্যাক করতে সক্ষম করে। আমি আপনার সাথে একমত!
একটি নিফটি ট্রিক যা আমি সম্প্রতি খুঁজে পেয়েছি তা হল পিএইচপি create_function()ব্যবহার করে এক শট ব্যবহারের জন্য বেনামে / ল্যাম্বদা ফাংশন তৈরি করতে। মনে হচ্ছে পিএইচপি কাজকর্মের জন্য উপযোগী array_map(), preg_replace_callback()অথবা usort()কাস্টম প্রক্রিয়াকরণের জন্য ব্যবহারের callbacks। এটি দেখতে অনেকটা দেখতে দেখতে eval()এটি কভারগুলির নীচে করে তবে এটি পিএইচপি ব্যবহারের জন্য এখনও একটি দুর্দান্ত কার্যকরী-শৈলীর উপায়।
create_function()?
ঠিক আছে ... দিগন্তের 5.3 এর সাথে সমস্ত কিছু ভাল হবে, কারণ 5.3 এর সাথে আমরা ক্লোজার পেয়ে যাব এবং তাদের সাথে বেনামে ফাংশন করব
আপনার কলিং যা বৈধ তা আপনি যাচাই করতে চাইবেন। উদাহরণস্বরূপ, একটি নির্দিষ্ট ফাংশনের ক্ষেত্রে, আপনি পরীক্ষা করতে পারেন এবং ফাংশনটি বিদ্যমান কিনা তা দেখতে চাইবেন:
function doIt($callback) {
if(function_exists($callback)) {
$callback();
} else {
// some error handling
}
}
is_callable( $callback )
create_functionআমার জন্য কোনও ক্লাসের মধ্যে কাজ করেনি। আমাকে ব্যবহার করতে হয়েছিল call_user_func।
<?php
class Dispatcher {
//Added explicit callback declaration.
var $callback;
public function Dispatcher( $callback ){
$this->callback = $callback;
}
public function asynchronous_method(){
//do asynch stuff, like fwrite...then, fire callback.
if ( isset( $this->callback ) ) {
if (function_exists( $this->callback )) call_user_func( $this->callback, "File done!" );
}
}
}
তারপরে, ব্যবহার করতে:
<?php
include_once('Dispatcher.php');
$d = new Dispatcher( 'do_callback' );
$d->asynchronous_method();
function do_callback( $data ){
print 'Data is: ' . $data . "\n";
}
?>
[সম্পাদনা] একটি অনুপস্থিত প্রথম বন্ধনী যুক্ত হয়েছে। এছাড়াও, কলব্যাকের ঘোষণাটি যুক্ত করা হয়েছে, আমি সেভাবেই এটি পছন্দ করি।
আমি create_function()পিএইচপি ব্যবহারের সময় প্রতিবার ক্রিঙ্ক করি ।
প্যারামিটারগুলি একটি কোমা দ্বারা পৃথক স্ট্রিং, একটি স্ট্রিংয়ের পুরো ফাংশন বডি ... আরগ ... আমি মনে করি তারা চেষ্টা করলেও তারা এটিকে আরও খারাপ করতে পারত না।
দুর্ভাগ্যক্রমে, এটি একমাত্র পছন্দ যখন কোনও নামযুক্ত ফাংশন তৈরি করা ঝামেলার পক্ষে নয়।
create_function()এখন অবহেলিত এবং ব্যবহার করা উচিত নয়।
যারা পিএইচপি-র সাথে সামঞ্জস্যতা ভঙ্গ করার বিষয়ে চিন্তা করেন না তাদের জন্য < 5.4আমি ক্লিনারটি বাস্তবায়ন করতে টাইপ ইঙ্গিতটি ব্যবহার করার পরামর্শ দেব।
function call_with_hello_and_append_world( callable $callback )
{
// No need to check $closure because of the type hint
return $callback( "hello" )."world";
}
function append_space( $string )
{
return $string." ";
}
$output1 = call_with_hello_and_append_world( function( $string ) { return $string." "; } );
var_dump( $output1 ); // string(11) "hello world"
$output2 = call_with_hello_and_append_world( "append_space" );
var_dump( $output2 ); // string(11) "hello world"
$old_lambda = create_function( '$string', 'return $string." ";' );
$output3 = call_with_hello_and_append_world( $old_lambda );
var_dump( $output3 ); // string(11) "hello world"
create_function() পিএইচপি 7.2.0 হিসাবে অবহিত করা হয়েছে। এই ফাংশন উপর নির্ভর করা অত্যন্ত নিরুৎসাহিত করা হয়।