天天看點

php閉合函數,PHP閉包函數的使用

##PHP閉包函數的使用

匿名函數也叫閉包函數(closures允許建立一個沒有指定沒成的函數,最經常用作回調函數參數的值。

__閉包函數__沒有函數名稱,直接在function()傳入變量即可 使用時将定義的變量當作函數來處理

$cl = function($name){

return sprintf('hello %s',name);

}

echo $cli('fuck')`

直接通過定義為匿名函數的變量名稱來調用

echo preg_replace_callback('~-([a-z])~', function ($match) {

return strtoupper($match[1]);

}, 'hello-world');`

###使用use

$message = 'hello';

$example = function() use ($message){

var_dump($message);

};

echo $example();

//輸出hello

$message = 'world';

//輸出hello 因為繼承變量的值的時候是函數定義的時候而不是 函數被調用的時候

echo $example();

//重置為hello

$message = 'hello';

//此處傳引用

$example = function() use(&$message){

var_dump($message);

};

echo $example();

//輸出hello

$message = 'world';

echo $example();

//此處輸出world

//閉包函數也用于正常的傳值

$message = 'hello';

$example = function ($data) use ($message){

return "{$data},{$message}";

};

echo $example('world');

###example

class Cart{

//在類裡面定義常量用 const 關鍵字,而不是通常的 define() 函數。

const PRICE_BUTTER = 1.00;

const PRICE_MILK = 3.00;

const PRICE_EGGS = 6.95;

protected $products = [];

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.0;

$callback = function($quantity,$product) use ($tax , &$total){

//constant 傳回常量的值

//__class__傳回類名

$price = constant(__CLASS__."::PRICE_".strtoupper($product));

$total += ($price * $quantity)*($tax+1.0);

};

//array_walk() 函數對數組中的每個元素應用使用者自定義函數。在函數中,數組的鍵名和鍵值是參數

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);

print($my_cart->getTotal(0.05));