php能把函數名作為參數傳遞嗎?
0 投票
352 瀏覽
請問php能把函數名作為參數傳遞嗎?
類似javascript,lua里面一樣,函數名本來就是個變量,可以隨時傳遞。
比如js可以這樣寫:
function test(msg){ console.log(msg); } function a(b){ b(msg); } a(test);
0 投票
已采納
可以。方法主要介紹3種:
1.使用函數call_user_func()或者 call_user_func_array()
<?php function foobar($arg, $arg2) { echo __FUNCTION__, " got $arg and $arg2\n"; } class foo { function bar($arg, $arg2) { echo __METHOD__, " got $arg and $arg2\n"; } } // Call the foobar() function with 2 arguments call_user_func_array("foobar", array("one", "two")); // Call the $foo->bar() method with 2 arguments $foo = new foo; call_user_func_array(array($foo, "bar"), array("three", "four"));
2.php本身是支持可變函數的,如同javascript一樣:
例一:
function foo($function) { $function(" World"); } function bar($params) { echo "Hello".$params; } $variable = 'bar'; foo($variable);
例二:
<?php class Foo { function Variable() { $name = 'Bar'; $this->$name(); // This calls the Bar() method } function Bar() { echo "This is Bar"; } } $foo = new Foo(); $funcname = "Variable"; $foo->$funcname(); // This calls $foo->Variable() ?>
具體內容可參考PHP手冊里的 可變函數 一章。
3.此外,使用匿名函數也能達到此目的,只是更復雜些。
詳細內容可參考 匿名函數
<?php // 一個基本的購物車,包括一些已經添加的商品和每種商品的數量。 // 其中有一個方法用來計算購物車中所有商品的總價格,該方法使 // 用了一個 closure 作為回調函數。 class Cart { const PRICE_BUTTER = 1.00; const PRICE_MILK = 3.00; const PRICE_EGGS = 6.95; protected $products = array(); public function add($product, $quantity) { $this->products[$product] = $quantity; } public function getQuantity($product) { return isset($this->products[$product]) ? $this->products[$product] : FALSE; } public function getTotal($tax) { $total = 0.00; $callback = function ($quantity, $product) use ($tax, &$total) { $pricePerItem = constant(__CLASS__ . "::PRICE_" . strtoupper($product)); $total += ($pricePerItem * $quantity) * ($tax + 1.0); }; array_walk($this->products, $callback); return round($total, 2);; } } $my_cart = new Cart; // 往購物車里添加條目 $my_cart->add('butter', 1); $my_cart->add('milk', 3); $my_cart->add('eggs', 6); // 打出出總價格,其中有 5% 的銷售稅. print $my_cart->getTotal(0.05) . "\n"; // 最后結果是 54.29 ?> PHP這個不行
function k($a,$b,$c){ return $a .$b. $c; }; echo k('{"page":"shop/index","clientVersion":"10000","params":"userId:78312749;shop_id:112980512"}', 1438861083947, function($ccc) { $ccc = $ccc . "ff"; } );
----------------------------------------- 這樣可以 function k($a,$b,$c){ return $a .$b. $c; }; echo k('{"page":"shop/index","clientVersion":"10000","params":"userId:78312749;shop_id:112980512"}', 1438861083947, vvvv('fff') ); function vvvv($ccc) { $ccc = $ccc . "ff"; }
