php能把函数名作为参数传递吗?


php能把函数名作为参数传递吗?

 
 
0 投票
 
352 浏览

请问php能把函数名作为参数传递吗?
类似javascript,lua里面一样,函数名本来就是个变量,可以随时传递。
比如js可以这样写:

function test(msg){ console.log(msg); } function a(b){ b(msg); } a(test); 
最新提问7月 2, 2014分类:程序员 | 作者:damon(3,590 分)
 
 
 

1个回答

 
 
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";         } 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM