関数をパラメーターとして別の関数に渡し、関数内から渡された関数を呼び出す必要があります...これはおそらくコードで説明する方が簡単です。基本的にはこのようなことをしたいです:
function ($functionToBeCalled)
{
call($functionToBeCalled,additional_params);
}
それを行う方法はありますか.. PHP 4.3.9
ありがとう!
あなたが探していると思う call_user_func
。
PHP Manualからの例:
<?php
function barber($type) {
echo "You wanted a $type haircut, no problem";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");
?>
function foo($function) {
$function(" World");
}
function bar($params) {
echo "Hello".$params;
}
$variable = 'bar';
foo($variable);
さらに、この方法でそれを行うことができます。 変数関数 を参照してください。
PHPでは、これは非常に簡単です。
<?php
function here() {
print 'here';
}
function dynamo($name) {
$name();
}
//Will work
dynamo('here');
//Will fail
dynamo('not_here');
元の質問でPHP 4.3について尋ねられたことは知っていますが、それは数年後のことであり、PHP 5.3以降でこれを行う好ましい方法を提唱したかっただけです。
PHP 5.3以降では 匿名関数(クロージャ) がサポートされるようになったため、JavaScriptやRubyなどの言語のように、いくつかの標準的な関数型プログラミング手法を使用できます(いくつかの注意事項があります)。上記のcall_user_funcの例を「クロージャースタイル」で書き直すと、次のようになります。
$barber = function($type) {
echo "You wanted a $type haircut, no problem\n";
};
$barber('mushroom');
$barber('shave');
明らかに、これはこの例ではあまり意味がありません-これらの匿名関数を他の関数に渡すと、力と柔軟性が得られます(元の質問のように)。次のようなことができます:
$barber_cost = function($quantity) {
return $quantity * 15;
};
$candy_shop_cost = function($quantity) {
return $quantity * 4.50; // It's Moonstruck chocolate, ok?
};
function get_cost($cost_fn, $quantity) {
return $cost_fn($quantity);
}
echo '3 haircuts cost $' . get_cost($barber_cost, 3) . "\n";
echo '6 candies cost $' . get_cost($candy_shop_cost, 6) . "\n";
もちろん、これはcall_user_funcで実行できますが、この構文は、特に名前空間とメンバー変数が関係するようになると、はるかに明確になります。
ここで何が起こっているのか正確にはわからないが、メンバーまたは静的変数に含まれるクロージャーを呼び出すことはできません。ただし、ローカル変数に再割り当てすると、その変数を呼び出すことができます。そのため、たとえば、これによりエラーが発生します。
$some_value = \SomeNamespace\SomeClass::$closure($arg1, $arg2);
しかし、この簡単な回避策は問題を修正します。
$the_closure = \SomeNamespace\SomeClass::$closure;
$some_value = $the_closure($arg1, $arg2);
call_user_func_array()
を使用することもできます。パラメータの配列を2番目のパラメータとして渡すことができるため、渡す変数の数を正確に知る必要はありません。
パラメータをパラメータとして渡す関数が必要な場合、これを試すことができます:
function foo ($param1){
return $param1;
}
function bar ($foo_function, $foo_param){
echo $foo_function($foo_param);
}
//call function bar
bar('foo', 'Hi there'); //this will print: 'Hi there'
お役に立てば幸いです...
PHPクラス内でこれを行いたい場合は、次のコードをご覧ください。
// Create a sample class
class Sample
{
// Our class displays 2 lists, one for images and one for paragraphs
function __construct( $args ) {
$images = $args['images'];
$items = $args['items'];
?>
<div>
<?php
// Display a list of images
$this->loop( $images, 'image' );
// notice how we pass the name of the function as a string
// Display a list of paragraphs
$this->loop( $items, 'content' );
// notice how we pass the name of the function as a string
?>
</div>
<?php
}
// Reuse the loop
function loop( $items, $type ) {
// if there are items
if ( $items ) {
// iterate through each one
foreach ( $items as $item ) {
// pass the current item to the function
$this->$type( $item );
// becomes $this->image
// becomes $this->content
}
}
}
// Display a single image
function image( $item ) {
?>
<img src="<?php echo $item['url']; ?>">
<?php
}
// Display a single paragraph
function content( $item ) {
?>
<p><?php echo $item; ?></p>
<?php
}
}
// Create 2 sample arrays
$images = array( 'image-1.jpg', 'image-2.jpg', 'image-3.jpg' );
$items = array( 'sample one', 'sample two', 'sample three' );
// Create a sample object to pass my arrays to Sample
$elements = { 'images' => $images, 'items' => $items }
// Create an Instance of Sample and pass the $elements as arguments
new Sample( $elements );