
批改狀態(tài):合格
老師批語:
get_defined_functions() 查看已定義的函數(shù),包括系統(tǒng)預(yù)定義函數(shù)和用戶自定義函數(shù)
printf('<pre>%s</pre>', print_r(get_defined_functions(), true));
// 輸出所有系統(tǒng)預(yù)定義函數(shù)和用戶自定義函數(shù)
Array
(
[internal] => Array
(
[0] => zend_version
[1] => func_num_args
[2] => func_get_arg
...
[1393] => memcache_flush
[1394] => memcache_set_sasl_auth_data
)
[user] => Array
(
)
)
function_exists() 判斷函數(shù)是否已定義
$result = function_exists('ctype_graph');
var_dump($result); // bool(true)
格式:function 函數(shù)名(參數(shù)) { 函數(shù)體 }
function:定義函數(shù)關(guān)鍵詞
// 定義命名函數(shù)
function sum($a, $b)
{
return $a + $b;
}
調(diào)用:函數(shù)名(參數(shù))
調(diào)用時的參數(shù)為實參
var_dump(sum(1,3)); // string(1) "4"
強制規(guī)定參數(shù)類型和返回值類型
// 不指定參數(shù)類型和返回值類型
function sum($a, $b)
{
return $a + $b;
}
var_dump(sum(1,3)); // string(1) "4",數(shù)值默認返回字符串
// 強制指定參數(shù)類型
function sum(int $a, int $b)
{
return $a + $b;
}
var_dump(sum(1,3)); // int(4),返回類型根據(jù)實參類型和執(zhí)行結(jié)構(gòu)確定
// 強制規(guī)定參數(shù)類型和返回值類型
function sum(int $a, int $b): string
{
return $a + $b;
}
var_dump(sum(1,3)); // string(1) "4",返回指定的類型
命名函數(shù)是全局作用域,可以在函數(shù)定義前調(diào)用
echo sum(1, 3); // 4
function sum(int $a, int $b): string
{
return $a + $b;
}
回調(diào),可以把一個命名函數(shù)當(dāng)做參數(shù)傳給另一個函數(shù)
call_user_func (函數(shù)名, 參數(shù))
第一個參數(shù):函數(shù)名,被回調(diào)的命名函數(shù)的名稱,需用單引號括起來
第二個參數(shù):參數(shù),被回調(diào)的命名函數(shù)所需的參數(shù)
// 被回調(diào)的匿名函數(shù)只有一個參數(shù)
function boo($a) {
return $a *= 10;
};
echo call_user_func('boo', 8); // 80
// 被回調(diào)的匿名函數(shù)有多個參數(shù)
function foo($a, $b, $c) {
return array_sum([$a,$b,$c]);
};
echo call_user_func('foo', ...[1,2,3]); // 6
call_user_func_array(函數(shù)名, 參數(shù)數(shù)組)
第一個參數(shù):函數(shù)名,被回調(diào)的命名函數(shù)的名稱,需用單引號括起來
第二個參數(shù):參數(shù)數(shù)組,被回調(diào)的命名函數(shù)所需的參數(shù)所組成的數(shù)組
function foo($a, $b, $c) {
return array_sum([$a,$b,$c]);
};
echo call_user_func_array('foo', [1,2,3]); // 6
一般實參數(shù)量要與形參數(shù)量一致,從左往右與形參對應(yīng)
默認參數(shù),定義函數(shù)時給參數(shù)指定默認值,調(diào)用時可以不給對應(yīng)的參數(shù),取默認值
function sum1(int $a, int $b, int $c = 10): int
{
return array_sum([$a, $b, $c]);
}
echo sum1(20, 30); // 60
命名參數(shù)(注:php8.0 開始支持)
function sum2(int $a, int $b, int $c = 10, int $d = 20): int
{
return array_sum([$a, $b, $c, $d]);
}
// 第三個參數(shù)不給取默認值,第四個參數(shù)用命名參數(shù)
echo sum2(1, 2, d: 3); // 16
可變參數(shù),參數(shù)太多 或者不確定參數(shù)的個數(shù) 在參數(shù)前加 ...
標識為可變參數(shù)
function foo($arg, ...$args) //聚攏 收集
{
var_dump($arg, $args);
}
echo foo(1, 2, 3, 4, 5);
// 輸出:int(1) array(4) { [0]=> int(2) [1]=> int(3) [2]=> int(4) [3]=> int(5) }
function boo(...$args)
{
return array_sum($args);
}
echo boo(1, 2, 3, 4, 5); // 15
引用參數(shù),定義函數(shù)時,形參前面加 &
,將值傳遞變?yōu)橐脗鬟f
值傳遞,復(fù)制一份內(nèi)存地址,函數(shù)執(zhí)行結(jié)果不影響被引用的變量
引用傳遞,兩個變量指向同一個內(nèi)存地址,函數(shù)執(zhí)行結(jié)果會改變被引用的變量
// 值傳值
function hoo($arg)
{
return $arg += 10;
}
$a = 10;
echo hoo($a); // 20
echo $a; // 10,函數(shù)執(zhí)行結(jié)果不影響被引用的變量
// 引用傳遞
function hoo(&$arg)
{
return $arg += 10;
}
$a = 10;
echo hoo($a); // 20
echo $a; // 20,函數(shù)執(zhí)行結(jié)果會改變被引用的變量
引用傳值同樣適用與變量
$x = 100;
$y = $x; //值傳遞
$x = 200;
echo $y; // 100
$y = &$x; //引用賦值 $x $y 指向同一個內(nèi)存地址 互相受影響
$x = 1000;
echo $y; // 1000
$y = 8888;
echo $x; // 8888
函數(shù)只允許一條返回語句,return 后面的代碼不會被執(zhí)行
function fn1()
{
return 1 == '1';
return '你好'; // 不會被執(zhí)行
}
var_dump(fn1()); // bool(true)
返回值可以是單個值、表達式、數(shù)組、對象、json字符串…
// 返回 json 字符串
function fn1()
{
return json_encode(['code' => 0, 'msg' => '登錄成功']);
}
var_dump(fn1()); // string(43) "{"code":0,"msg":"\u767b\u5f55\u6210\u529f"}"
json_encode() 默認會將中文字符轉(zhuǎn)為 unicode 編碼,可以給json_encode() 添加第二個參數(shù):JSON_UNESCAPED_UNICODE 不轉(zhuǎn)義
function fn1()
{
return json_encode(['code' => 0, 'msg' => '登錄成功'], JSON_UNESCAPED_UNICODE);
}
var_dump(fn1()); // string(31) "{"code":0,"msg":"登錄成功"}"
JSON_UNESCAPED_UNICODE 為系統(tǒng)預(yù)定義常量,值等于 256,所以第二個參數(shù)可以直接寫 256
function fn1()
{
return json_encode(['code' => 0, 'msg' => '登錄成功'], 256);
}
var_dump(fn1()); // string(31) "{"code":0,"msg":"登錄成功"}"
JSON_UNESCAPED_SLASHES,不轉(zhuǎn)義斜杠 /
,值為 64,應(yīng)用:url 地址
// 默認轉(zhuǎn)義,url 地址不正確
function fn1()
{
return json_encode(['code' => 0, 'rul' => 'https://www.baidu.com']);
}
var_dump(fn1()); // string(42) "{"code":0,"rul":"https:\/\/www.baidu.com"}"
// 添加第二個參數(shù) JSON_UNESCAPED_SLASHES,不轉(zhuǎn)義,url 地址正確
function fn1()
{
return json_encode(['code' => 0, 'rul' => 'https://www.baidu.com'], 64);
}
var_dump(fn1()); // string(40) "{"code":0,"rul":"https://www.baidu.com"}"
同時不轉(zhuǎn)義 unicode 和 斜杠,第二個參數(shù)可以設(shè)置為 320(256 + 64)
function fn1()
{
return json_encode(['code' => 0, 'msg' => '登錄成功/'], 320);
}
var_dump(fn1()); string(32) "{"code":0,"msg":"登錄成功/"}"
不指定函數(shù)名稱,將整個函數(shù)賦值給一個變量
格式:變量 = function (參數(shù)) { 函數(shù)體 }
$boo = function ($a) {
return $a *= 10;
};
傳統(tǒng)調(diào)用:變量名(參數(shù))
$boo = function ($a) {
return $a *= 10;
};
echo $boo(2); // 20
匿名函數(shù)不是全局作用域,定義前不能調(diào)用
echo $boo(2); // Undefined variable: boo
$boo = function ($a) {
return $a *= 10;
};
回調(diào),可以把一個匿名函數(shù)當(dāng)做參數(shù)傳給另一個函數(shù)
call_user_func (函數(shù)名, 參數(shù))
第一個參數(shù):函數(shù)名,被回調(diào)的匿名函數(shù)的變量名
第二個參數(shù):參數(shù),被回調(diào)的匿名函數(shù)所需的參數(shù)
// 被回調(diào)的匿名函數(shù)只有一個參數(shù)
$boo = function ($a) {
return $a *= 2;
};
echo call_user_func($boo, 2);
// 被回調(diào)的匿名函數(shù)有多個參數(shù)
$boo = function ($a, $b, $c) {
return array_sum([$a,$b,$c]);
};
echo call_user_func($boo, ...[1,2,3]); // 6
call_user_func_array(函數(shù)名, 參數(shù)數(shù)組)
第一個參數(shù):函數(shù)名,被回調(diào)的匿名函數(shù)的變量名
第二個參數(shù):參數(shù)數(shù)組,被回調(diào)的匿名函數(shù)所需的參數(shù)所組成的數(shù)組
$boo = function ($a, $b, $c) {
return array_sum([$a,$b,$c]);
};
echo call_user_func_array($boo, [1,2,3]); // 6
php 是單線程,同步執(zhí)行(從前往后逐條執(zhí)行),如果遇到耗時的函數(shù)會發(fā)生阻塞,應(yīng)該將它改為異步回調(diào)來去執(zhí)行。
回調(diào):在主線程執(zhí)行的過程中,跳到預(yù)先設(shè)置好的函數(shù)中去執(zhí)行(異步,支線程),主線程繼續(xù)執(zhí)行,異步執(zhí)行有結(jié)果后返回主線程。
遞歸函數(shù)(recursion):是指直接或間接地調(diào)用函數(shù)自身的函數(shù)。
必須有一個終止處理或計算的準則。
function demo($a = 1)
{
if ($a <= 5) {
echo "第{$a}次執(zhí)行" . PHP_EOL;
$a++;
demo($a); // 調(diào)用自己
}
}
demo(); // 第1次執(zhí)行 第2次執(zhí)行 第3次執(zhí)行 第4次執(zhí)行 第5次執(zhí)行
全局變量不能在函數(shù)體內(nèi)直接調(diào)用
$b = 10;
$boo = function ($a) {
return $a *= $b;
};
echo $boo(2);
// Undefined variable: b
使用 use 關(guān)鍵字引入全局變量
$b = 10;
$boo = function ($a) use ($b) {
return $a *= $b;
};
echo $boo(2); // 20
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號