পিএইচপি 5.3 জন্য পরীক্ষিত
আমি যেমন এখানে দেখছি, বেনামি ফাংশন আপনাকে সহায়তা করতে পারে:
http://php.net/manual/en/funitions.anonymous.php
আপনার সম্ভবত যা প্রয়োজন এবং কোনও ফ্লাই-অন-ক্রিয়েড ফাংশনের অভ্যন্তরে মোড়ানো না রেখে কোনও ফাংশনটি কীভাবে পাস করবেন তার আগে এটি বলা হয়নি । আপনি পরে দেখতে পাবেন, আপনাকে প্যারামিটার হিসাবে একটি স্ট্রিংয়ে লেখা ফাংশনটির নামটি পাস করতে হবে, এর "কল্যাবিলিটি" পরীক্ষা করুন এবং তারপরে কল করুন।
কাজটি যাচাই করতে হবে:
if( is_callable( $string_function_name ) ){
/*perform the call*/
}
তারপরে, এটিকে কল করতে এই কোডটির টুকরোটি ব্যবহার করুন (যদি আপনার পরামিতিগুলিরও প্রয়োজন হয় তবে এগুলিতে একটি অ্যারে রাখুন): http://php.net/manual/en/function.call-user-func.php
call_user_func_array( "string_holding_the_name_of_your_function", $arrayOfParameters );
এটি অনুসরণ করে (একইভাবে, প্যারামিটারহীন, উপায়ে):
function funToBeCalled(){
print("----------------------i'm here");
}
function wrapCaller($fun){
if( is_callable($fun)){
print("called");
call_user_func($fun);
}else{
print($fun." not called");
}
}
wrapCaller("funToBeCalled");
wrapCaller("cannot call me");
এখানে কীভাবে অনুরূপ কিছু করা যায় তা বোঝানোর জন্য এখানে একটি শ্রেণি রয়েছে:
<?php
class HolderValuesOrFunctionsAsString{
private $functions = array();
private $vars = array();
function __set($name,$data){
if(is_callable($data))
$this->functions[$name] = $data;
else
$this->vars[$name] = $data;
}
function __get($name){
$t = $this->vars[$name];
if(isset($t))
return $t;
else{
$t = $this->$functions[$name];
if( isset($t))
return $t;
}
}
function __call($method,$args=null){
$fun = $this->functions[$method];
if(isset($fun)){
call_user_func_array($fun,$args);
} else {
// error out
print("ERROR: Funciton not found: ". $method);
}
}
}
?>
এবং ব্যবহারের একটি উদাহরণ
<?php
/*create a sample function*/
function sayHello($some = "all"){
?>
<br>hello to <?=$some?><br>
<?php
}
$obj = new HolderValuesOrFunctionsAsString;
/*do the assignement*/
$obj->justPrintSomething = 'sayHello'; /*note that the given
"sayHello" it's a string ! */
/*now call it*/
$obj->justPrintSomething(); /*will print: "hello to all" and
a break-line, for html purpose*/
/*if the string assigned is not denoting a defined method
, it's treat as a simple value*/
$obj->justPrintSomething = 'thisFunctionJustNotExistsLOL';
echo $obj->justPrintSomething; /*what do you expect to print?
just that string*/
/*N.B.: "justPrintSomething" is treated as a variable now!
as the __set 's override specify"*/
/*after the assignement, the what is the function's destiny assigned before ? It still works, because it's held on a different array*/
$obj->justPrintSomething("Jack Sparrow");
/*You can use that "variable", ie "justPrintSomething", in both ways !! so you can call "justPrintSomething" passing itself as a parameter*/
$obj->justPrintSomething( $obj->justPrintSomething );
/*prints: "hello to thisFunctionJustNotExistsLOL" and a break-line*/
/*in fact, "justPrintSomething" it's a name used to identify both
a value (into the dictionary of values) or a function-name
(into the dictionary of functions)*/
?>