PHP: 带有用户回调的函数
PHP: Function with user callback
我第一次尝试使函数重载主函数。所以需要一些指导来理解和以更好和未来证明的方式编写。
我正在创建此功能用于导航并允许开发人员overload/override主要功能。
主要功能
我不确定我是否以最有效的方式编写了这个函数。感谢您的指导,让它变得更好。
function main_func( $args, $callback = NULL )
{
$result[] = $args;
/*
* This is just for example
* So by calling user function below,
* I want to allow developer to add additional functionality
* Or can override condition before function returns the value
*/
if ( array_key_exists('page', $args) ) {
// some stuffs based on condition
}
/*
* I am not so sure about the placement of the call_user_func
* As I believe this might be okay because I want to allow
* developers to override above condition and manipulate $args
* before this function returns the result
*/
/*
* I am not so sure but probably something like this
* $args[] = array_merge($args, call_user_func($callback, func_get_arg(func_num_args())));
*/
if ( is_callable($callback) ) {
$result[] = call_user_func($callback, $args);
}
/*
* Here I want to merge two array items
* 1. Function's $args argument
* 2. User callback function $args
*
* This means user will be able to add own array item within
* the nested array item for $args
*
* So final result I am looking is
*
* array(
* $args = array(), array(), ... // function args array items
* $args = array(), array(), ... // user callback function args array item
* );
*/
/*
* So here I get combined array with
* user own callbck function logic and
* custom array items within the array
*/
return $result;
}
所以这里我想要的有或没有回调的最终结果是多维数组,如下例
Array
(
[0] => Array
(
[auth] =>
[url] => user-photos
[label] => Social Photos
[selected] => 1
)
[1] => Array
(
[auth] =>
[url] => user-settings
[label] => Social Settings
[selected] => 0
)
)
我能够实现上述结果,但不确定它是否正确有效并且是否足够安全。
所以这里有一些使用我所做的例子
// function args
$args = array(
'auth' => FALSE,
'url' => 'user-photos',
'label' => 'Social Photos',
'selected' => 1
);
// this function result
main_func($args);
结果
// result
Array
(
[0] => Array
(
[auth] =>
[url] => user-photos
[label] => Social Photos
[selected] => 1
)
)
使用回调
// callback args
$user_args = array(
'auth' => FALSE,
'url' => 'user-settings',
'label' => 'Social Settings',
'selected' => 0
);
// function with user callback
main_func($args, function(){
$user_args = array(
'auth' => FALSE,
'url' => 'user-settings',
'label' => 'Social Settings',
'selected' => 0
);
return $user_args;
});
结果
// result
Array
(
[0] => Array
(
[auth] =>
[url] => user-photos
[label] => Social Photos
[selected] => 1
)
[1] => Array
(
[auth] =>
[url] => user-settings
[label] => Social Settings
[selected] => 0
)
)
看起来结果不错,正是我想要的。但是,我希望开发人员允许将函数名称(字符串)作为回调函数而不是匿名函数传递,但我不知道该怎么做。
像这样
// user callback function
function user_func($user_args)
{
// do my stuffs
if (some condition) {
// do all stuffs
}
return stuffs;
}
// Now callbck user function by function name instead of anonymous function
main_func($args, 'user_func');
这就是我最终想要的
- 使主要功能更高效和面向未来
- 允许传递函数名称作为回调而不是匿名函数
- 任何其他让它变得更好的技巧
万分感谢
如果你想让你的回调函数完全修改数组,你可以这样做:
$args = call_user_func($callback, $args);
并在通话中:
main_func($args, function ($args) {
// examples
$args[0]["selected"] = 0;
$args[] = array("toto");
// retun the modified array
return $args;
});
重置数组的其他示例
main_func($args, function($user_args) {
$user_args = array(
'auth' => FALSE,
'url' => 'user-settings',
'label' => 'Social Settings',
'selected' => 0
);
return $user_args;
});
.
用函数名测试
function main_func($args, $callback = NULL) {
if (is_callable($callback)) {
$args = call_user_func($callback, $args);
}
return $args;
}
$args_test = array(
array(
"auth" => FALSE,
"url" => "user-photos",
"label" => "Social Photos",
"selected" => 1,
),
);
function test_callback($t) {
$t[0]["selected"] = 0;
$t[] = array("toto");
return $t;
}
// test with function name
$test1 = main_func($args_test, "test_callback");
var_dump($test1);
// test with anonymous function
$test2 = main_func($args_test, function ($a) {
return test_callback($a);
});
var_dump($test2);
// test with no callback
$test3 = main_func($args_test);
var_dump($test3);
我第一次尝试使函数重载主函数。所以需要一些指导来理解和以更好和未来证明的方式编写。
我正在创建此功能用于导航并允许开发人员overload/override主要功能。
主要功能
我不确定我是否以最有效的方式编写了这个函数。感谢您的指导,让它变得更好。
function main_func( $args, $callback = NULL )
{
$result[] = $args;
/*
* This is just for example
* So by calling user function below,
* I want to allow developer to add additional functionality
* Or can override condition before function returns the value
*/
if ( array_key_exists('page', $args) ) {
// some stuffs based on condition
}
/*
* I am not so sure about the placement of the call_user_func
* As I believe this might be okay because I want to allow
* developers to override above condition and manipulate $args
* before this function returns the result
*/
/*
* I am not so sure but probably something like this
* $args[] = array_merge($args, call_user_func($callback, func_get_arg(func_num_args())));
*/
if ( is_callable($callback) ) {
$result[] = call_user_func($callback, $args);
}
/*
* Here I want to merge two array items
* 1. Function's $args argument
* 2. User callback function $args
*
* This means user will be able to add own array item within
* the nested array item for $args
*
* So final result I am looking is
*
* array(
* $args = array(), array(), ... // function args array items
* $args = array(), array(), ... // user callback function args array item
* );
*/
/*
* So here I get combined array with
* user own callbck function logic and
* custom array items within the array
*/
return $result;
}
所以这里我想要的有或没有回调的最终结果是多维数组,如下例
Array
(
[0] => Array
(
[auth] =>
[url] => user-photos
[label] => Social Photos
[selected] => 1
)
[1] => Array
(
[auth] =>
[url] => user-settings
[label] => Social Settings
[selected] => 0
)
)
我能够实现上述结果,但不确定它是否正确有效并且是否足够安全。
所以这里有一些使用我所做的例子
// function args
$args = array(
'auth' => FALSE,
'url' => 'user-photos',
'label' => 'Social Photos',
'selected' => 1
);
// this function result
main_func($args);
结果
// result
Array
(
[0] => Array
(
[auth] =>
[url] => user-photos
[label] => Social Photos
[selected] => 1
)
)
使用回调
// callback args
$user_args = array(
'auth' => FALSE,
'url' => 'user-settings',
'label' => 'Social Settings',
'selected' => 0
);
// function with user callback
main_func($args, function(){
$user_args = array(
'auth' => FALSE,
'url' => 'user-settings',
'label' => 'Social Settings',
'selected' => 0
);
return $user_args;
});
结果
// result
Array
(
[0] => Array
(
[auth] =>
[url] => user-photos
[label] => Social Photos
[selected] => 1
)
[1] => Array
(
[auth] =>
[url] => user-settings
[label] => Social Settings
[selected] => 0
)
)
看起来结果不错,正是我想要的。但是,我希望开发人员允许将函数名称(字符串)作为回调函数而不是匿名函数传递,但我不知道该怎么做。
像这样
// user callback function
function user_func($user_args)
{
// do my stuffs
if (some condition) {
// do all stuffs
}
return stuffs;
}
// Now callbck user function by function name instead of anonymous function
main_func($args, 'user_func');
这就是我最终想要的
- 使主要功能更高效和面向未来
- 允许传递函数名称作为回调而不是匿名函数
- 任何其他让它变得更好的技巧
万分感谢
如果你想让你的回调函数完全修改数组,你可以这样做:
$args = call_user_func($callback, $args);
并在通话中:
main_func($args, function ($args) {
// examples
$args[0]["selected"] = 0;
$args[] = array("toto");
// retun the modified array
return $args;
});
重置数组的其他示例
main_func($args, function($user_args) {
$user_args = array(
'auth' => FALSE,
'url' => 'user-settings',
'label' => 'Social Settings',
'selected' => 0
);
return $user_args;
});
.
用函数名测试
function main_func($args, $callback = NULL) {
if (is_callable($callback)) {
$args = call_user_func($callback, $args);
}
return $args;
}
$args_test = array(
array(
"auth" => FALSE,
"url" => "user-photos",
"label" => "Social Photos",
"selected" => 1,
),
);
function test_callback($t) {
$t[0]["selected"] = 0;
$t[] = array("toto");
return $t;
}
// test with function name
$test1 = main_func($args_test, "test_callback");
var_dump($test1);
// test with anonymous function
$test2 = main_func($args_test, function ($a) {
return test_callback($a);
});
var_dump($test2);
// test with no callback
$test3 = main_func($args_test);
var_dump($test3);