可變變量
可以將變量的值作為一個變量的名稱,非常靈活,在邏輯復(fù)雜,層次清晰的場合中使用可變變量可以有效的減少代碼量杉适。
$txt = 'abc';
$$txt = "hello"; //等于 $abc = 'hello',這就是將變量$txt的值abc作為新的變量$abc并且賦值為hello
echo "$abc = ${$txt} = hello<br>";
//比如如果需要定義多個變量設(shè)置初值,很多語言不得不寫很多聲明賦值代碼,或者使用數(shù)組來實現(xiàn).
$vars = ['a' => '1','b'=>'2','c'=>'3','d'=>'4'];
foreach ($vars as $key => $value){
${$key} = $value;
}
echo $a.$b.$c.$d;//顯示1234
---------
hello = hello = hello
1234
可變函數(shù)
變量名后有圓括號,php會當(dāng)成函數(shù)去嘗試執(zhí)行,這同樣在邏輯復(fù)雜帶式調(diào)理清晰的復(fù)雜邏輯中能夠有效的精簡代碼。比如對于兩個數(shù)的運算怕膛,加減乘除,底數(shù)秦踪,對數(shù)褐捻,或者還有其他自定義運算的情況下。operate(a,b,op)
,表示對a,b進行op運算返回結(jié)果椅邓,可以將op寫成函數(shù)的名稱的字符串柠逞,然后直接return $op($a,$b),這里op相當(dāng)于C語言里面的函數(shù)指針,但是函數(shù)指針必須提前確定函數(shù)的參數(shù)類型和返回值景馁,php這里更為靈活板壮,直接將字符串當(dāng)成函數(shù)名,可變函數(shù)的使用避免了大量的if判斷。
function getName(){
return 'func name'.'<br>';
}
function getGrade(){
return "func grade"."<br>";
}
$func = "getName";
echo $func();
$func = "getGrade";
echo $func();
--------------
func name
func grade
可變參數(shù)列表
php5.6以后可以在參數(shù)面前加三個點 ...
實現(xiàn)合住,php5.5之前使用獲取函數(shù)參數(shù)方法實現(xiàn)绰精,在C語言中需要使用va_list結(jié)構(gòu)實現(xiàn)
function sum (...$input){
$s = 0;
foreach ($input as $value) {
$s+=$value;
}
return $s;
}
echo sum(1,2,3);
function sum2(){
$arg_num = func_num_args();
$sum = 0;
if($arg_num == 0){
return $sum;
}else{
for($i = 0;$i<$arg_num;$i++){
$sum += func_get_arg($i);
}
return $sum;
}
}
echo sum2(1,2,3);
嵌套函數(shù)
php嵌套函數(shù)撒璧,當(dāng)外部函數(shù)被調(diào)用時,內(nèi)部函數(shù)就會自動進入全局作用域笨使,成為新的定義函數(shù)沪悲。所以如果外部函數(shù)調(diào)用過后,就會再次嘗試定義內(nèi)部函數(shù)阱表,會造成錯誤殿如,所以應(yīng)該判斷內(nèi)部函數(shù)是否存在。
function out(){
if(function_exists('in')){
function in (){
echo 'in';
}
}
}
out();
in();//直接調(diào)用會提示函數(shù)不存在最爬。
---
in
閉包函數(shù)
匿名函數(shù)(Anonymous functions)涉馁,也叫閉包函數(shù)(closures),允許 臨時創(chuàng)建一個沒有指定名稱的函數(shù)爱致。最經(jīng)常用作回調(diào)函數(shù)callback參數(shù)的值烤送。當(dāng)然,也有其它應(yīng)用的情況,比如讓一段代碼延遲執(zhí)行糠悯,擴大變量的作用域帮坚。
$message = "hello";
//使用use從父作用域集成變量
$closure = function ($name) use ($message) {
echo $message ." ".$name;
};
$message = "11111";//如果想讓message可以改變,用 use(&$message)
$closure('world');
function replace_buy_count($data)
{
return preg_replace_callback('#%buy_count%(-?\d+)%(-?\d+)%#',
function ($matches) {
return get_buy_count(toint($matches[1]), toint($matches[2]));
}, $data);
}