亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
博主信息
博文 29
粉絲 0
評論 0
訪問量 18910
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
PHP 函數(shù)
尹輝
原創(chuàng)
1343人瀏覽過

4.5.1 預(yù)定義函數(shù)

  • get_defined_functions() 查看已定義的函數(shù),包括系統(tǒng)預(yù)定義函數(shù)和用戶自定義函數(shù)

    1. printf('<pre>%s</pre>', print_r(get_defined_functions(), true));
    2. // 輸出所有系統(tǒng)預(yù)定義函數(shù)和用戶自定義函數(shù)
    3. Array
    4. (
    5. [internal] => Array
    6. (
    7. [0] => zend_version
    8. [1] => func_num_args
    9. [2] => func_get_arg
    10. ...
    11. [1393] => memcache_flush
    12. [1394] => memcache_set_sasl_auth_data
    13. )
    14. [user] => Array
    15. (
    16. )
    17. )
  • function_exists() 判斷函數(shù)是否已定義

    1. $result = function_exists('ctype_graph');
    2. var_dump($result); // bool(true)

4.5.2 命名函數(shù)

4.5.2.1 格式

  • 格式:function 函數(shù)名(參數(shù)) { 函數(shù)體 }

  • function:定義函數(shù)關(guān)鍵詞

  • 定義時的參數(shù)為形參
  • 函數(shù)體必須要有返回值 return,返回值可以是單個值、表達式、數(shù)組、對象、json字符串…
  1. // 定義命名函數(shù)
  2. function sum($a, $b)
  3. {
  4. return $a + $b;
  5. }

4.5.2.2 調(diào)用

  • 調(diào)用:函數(shù)名(參數(shù))

  • 調(diào)用時的參數(shù)為實參

    1. var_dump(sum(1,3)); // string(1) "4"
  • 強制規(guī)定參數(shù)類型和返回值類型

    1. // 不指定參數(shù)類型和返回值類型
    2. function sum($a, $b)
    3. {
    4. return $a + $b;
    5. }
    6. var_dump(sum(1,3)); // string(1) "4",數(shù)值默認返回字符串
    7. // 強制指定參數(shù)類型
    8. function sum(int $a, int $b)
    9. {
    10. return $a + $b;
    11. }
    12. var_dump(sum(1,3)); // int(4),返回類型根據(jù)實參類型和執(zhí)行結(jié)構(gòu)確定
    13. // 強制規(guī)定參數(shù)類型和返回值類型
    14. function sum(int $a, int $b): string
    15. {
    16. return $a + $b;
    17. }
    18. var_dump(sum(1,3)); // string(1) "4",返回指定的類型
  • 命名函數(shù)是全局作用域,可以在函數(shù)定義前調(diào)用

    1. echo sum(1, 3); // 4
    2. function sum(int $a, int $b): string
    3. {
    4. return $a + $b;
    5. }
  • 回調(diào),可以把一個命名函數(shù)當(dāng)做參數(shù)傳給另一個函數(shù)

    • call_user_func (函數(shù)名, 參數(shù))

      第一個參數(shù):函數(shù)名,被回調(diào)的命名函數(shù)的名稱,需用單引號括起來

      第二個參數(shù):參數(shù),被回調(diào)的命名函數(shù)所需的參數(shù)

      1. // 被回調(diào)的匿名函數(shù)只有一個參數(shù)
      2. function boo($a) {
      3. return $a *= 10;
      4. };
      5. echo call_user_func('boo', 8); // 80
      6. // 被回調(diào)的匿名函數(shù)有多個參數(shù)
      7. function foo($a, $b, $c) {
      8. return array_sum([$a,$b,$c]);
      9. };
      10. 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ù)組

      1. function foo($a, $b, $c) {
      2. return array_sum([$a,$b,$c]);
      3. };
      4. echo call_user_func_array('foo', [1,2,3]); // 6

4.5.2.3 參數(shù)

  • 一般實參數(shù)量要與形參數(shù)量一致,從左往右與形參對應(yīng)

  • 默認參數(shù),定義函數(shù)時給參數(shù)指定默認值,調(diào)用時可以不給對應(yīng)的參數(shù),取默認值

    1. function sum1(int $a, int $b, int $c = 10): int
    2. {
    3. return array_sum([$a, $b, $c]);
    4. }
    5. echo sum1(20, 30); // 60
  • 命名參數(shù)(注:php8.0 開始支持)

    1. function sum2(int $a, int $b, int $c = 10, int $d = 20): int
    2. {
    3. return array_sum([$a, $b, $c, $d]);
    4. }
    5. // 第三個參數(shù)不給取默認值,第四個參數(shù)用命名參數(shù)
    6. echo sum2(1, 2, d: 3); // 16
  • 可變參數(shù),參數(shù)太多 或者不確定參數(shù)的個數(shù) 在參數(shù)前加 ... 標識為可變參數(shù)

    1. function foo($arg, ...$args) //聚攏 收集
    2. {
    3. var_dump($arg, $args);
    4. }
    5. echo foo(1, 2, 3, 4, 5);
    6. // 輸出:int(1) array(4) { [0]=> int(2) [1]=> int(3) [2]=> int(4) [3]=> int(5) }
    7. function boo(...$args)
    8. {
    9. return array_sum($args);
    10. }
    11. echo boo(1, 2, 3, 4, 5); // 15
  • 引用參數(shù),定義函數(shù)時,形參前面加 & ,將值傳遞變?yōu)橐脗鬟f

    • 值傳遞,復(fù)制一份內(nèi)存地址,函數(shù)執(zhí)行結(jié)果不影響被引用的變量

    • 引用傳遞,兩個變量指向同一個內(nèi)存地址,函數(shù)執(zhí)行結(jié)果會改變被引用的變量

      1. // 值傳值
      2. function hoo($arg)
      3. {
      4. return $arg += 10;
      5. }
      6. $a = 10;
      7. echo hoo($a); // 20
      8. echo $a; // 10,函數(shù)執(zhí)行結(jié)果不影響被引用的變量
      9. // 引用傳遞
      10. function hoo(&$arg)
      11. {
      12. return $arg += 10;
      13. }
      14. $a = 10;
      15. echo hoo($a); // 20
      16. echo $a; // 20,函數(shù)執(zhí)行結(jié)果會改變被引用的變量
    • 引用傳值同樣適用與變量

      1. $x = 100;
      2. $y = $x; //值傳遞
      3. $x = 200;
      4. echo $y; // 100
      5. $y = &$x; //引用賦值 $x $y 指向同一個內(nèi)存地址 互相受影響
      6. $x = 1000;
      7. echo $y; // 1000
      8. $y = 8888;
      9. echo $x; // 8888

4.5.2.4 返回值

  • 函數(shù)只允許一條返回語句,return 后面的代碼不會被執(zhí)行

    1. function fn1()
    2. {
    3. return 1 == '1';
    4. return '你好'; // 不會被執(zhí)行
    5. }
    6. var_dump(fn1()); // bool(true)
  • 返回值可以是單個值、表達式、數(shù)組、對象、json字符串…

    1. // 返回 json 字符串
    2. function fn1()
    3. {
    4. return json_encode(['code' => 0, 'msg' => '登錄成功']);
    5. }
    6. var_dump(fn1()); // string(43) "{"code":0,"msg":"\u767b\u5f55\u6210\u529f"}"

4.5.2.5 擴展:json_encode()

  • json_encode() 默認會將中文字符轉(zhuǎn)為 unicode 編碼,可以給json_encode() 添加第二個參數(shù):JSON_UNESCAPED_UNICODE 不轉(zhuǎn)義

    1. function fn1()
    2. {
    3. return json_encode(['code' => 0, 'msg' => '登錄成功'], JSON_UNESCAPED_UNICODE);
    4. }
    5. var_dump(fn1()); // string(31) "{"code":0,"msg":"登錄成功"}"
  • JSON_UNESCAPED_UNICODE 為系統(tǒng)預(yù)定義常量,值等于 256,所以第二個參數(shù)可以直接寫 256

    1. function fn1()
    2. {
    3. return json_encode(['code' => 0, 'msg' => '登錄成功'], 256);
    4. }
    5. var_dump(fn1()); // string(31) "{"code":0,"msg":"登錄成功"}"
  • JSON_UNESCAPED_SLASHES,不轉(zhuǎn)義斜杠 / ,值為 64,應(yīng)用:url 地址

    1. // 默認轉(zhuǎn)義,url 地址不正確
    2. function fn1()
    3. {
    4. return json_encode(['code' => 0, 'rul' => 'https://www.baidu.com']);
    5. }
    6. var_dump(fn1()); // string(42) "{"code":0,"rul":"https:\/\/www.baidu.com"}"
    7. // 添加第二個參數(shù) JSON_UNESCAPED_SLASHES,不轉(zhuǎn)義,url 地址正確
    8. function fn1()
    9. {
    10. return json_encode(['code' => 0, 'rul' => 'https://www.baidu.com'], 64);
    11. }
    12. var_dump(fn1()); // string(40) "{"code":0,"rul":"https://www.baidu.com"}"
  • 同時不轉(zhuǎn)義 unicode 和 斜杠,第二個參數(shù)可以設(shè)置為 320(256 + 64)

    1. function fn1()
    2. {
    3. return json_encode(['code' => 0, 'msg' => '登錄成功/'], 320);
    4. }
    5. var_dump(fn1()); string(32) "{"code":0,"msg":"登錄成功/"}"

4.5.3 匿名函數(shù)

4.5.3.1 格式

  • 不指定函數(shù)名稱,將整個函數(shù)賦值給一個變量

  • 格式:變量 = function (參數(shù)) { 函數(shù)體 }

    1. $boo = function ($a) {
    2. return $a *= 10;
    3. };

4.5.3.2 調(diào)用

  • 傳統(tǒng)調(diào)用:變量名(參數(shù))

    1. $boo = function ($a) {
    2. return $a *= 10;
    3. };
    4. echo $boo(2); // 20
  • 匿名函數(shù)不是全局作用域,定義前不能調(diào)用

    1. echo $boo(2); // Undefined variable: boo
    2. $boo = function ($a) {
    3. return $a *= 10;
    4. };
  • 回調(diào),可以把一個匿名函數(shù)當(dāng)做參數(shù)傳給另一個函數(shù)

    • call_user_func (函數(shù)名, 參數(shù))

      第一個參數(shù):函數(shù)名,被回調(diào)的匿名函數(shù)的變量名

      第二個參數(shù):參數(shù),被回調(diào)的匿名函數(shù)所需的參數(shù)

      1. // 被回調(diào)的匿名函數(shù)只有一個參數(shù)
      2. $boo = function ($a) {
      3. return $a *= 2;
      4. };
      5. echo call_user_func($boo, 2);
      6. // 被回調(diào)的匿名函數(shù)有多個參數(shù)
      7. $boo = function ($a, $b, $c) {
      8. return array_sum([$a,$b,$c]);
      9. };
      10. 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ù)組

      1. $boo = function ($a, $b, $c) {
      2. return array_sum([$a,$b,$c]);
      3. };
      4. echo call_user_func_array($boo, [1,2,3]); // 6

4.5.3.2 參數(shù)及返回值同命名函數(shù)

4.5.4 回調(diào)函數(shù)

php 是單線程,同步執(zhí)行(從前往后逐條執(zhí)行),如果遇到耗時的函數(shù)會發(fā)生阻塞,應(yīng)該將它改為異步回調(diào)來去執(zhí)行。

回調(diào):在主線程執(zhí)行的過程中,跳到預(yù)先設(shè)置好的函數(shù)中去執(zhí)行(異步,支線程),主線程繼續(xù)執(zhí)行,異步執(zhí)行有結(jié)果后返回主線程。

4.5.5 遞歸函數(shù)

遞歸函數(shù)(recursion):是指直接或間接地調(diào)用函數(shù)自身的函數(shù)。

必須有一個終止處理或計算的準則。

  1. function demo($a = 1)
  2. {
  3. if ($a <= 5) {
  4. echo "第{$a}次執(zhí)行" . PHP_EOL;
  5. $a++;
  6. demo($a); // 調(diào)用自己
  7. }
  8. }
  9. demo(); // 第1次執(zhí)行 第2次執(zhí)行 第3次執(zhí)行 第4次執(zhí)行 第5次執(zhí)行

4.5.6 函數(shù)引用全局變量

  • 全局變量不能在函數(shù)體內(nèi)直接調(diào)用

    1. $b = 10;
    2. $boo = function ($a) {
    3. return $a *= $b;
    4. };
    5. echo $boo(2);
    6. // Undefined variable: b
  • 使用 use 關(guān)鍵字引入全局變量

    1. $b = 10;
    2. $boo = function ($a) use ($b) {
    3. return $a *= $b;
    4. };
    5. echo $boo(2); // 20
批改老師:PHPzPHPz

批改狀態(tài):合格

老師批語:
本博文版權(quán)歸博主所有,轉(zhuǎn)載請注明地址!如有侵權(quán)、違法,請聯(lián)系admin@php.cn舉報處理!
全部評論 文明上網(wǎng)理性發(fā)言,請遵守新聞評論服務(wù)協(xié)議
0條評論
作者最新博文
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號

  • 登錄PHP中文網(wǎng),和優(yōu)秀的人一起學(xué)習(xí)!
    全站2000+教程免費學(xué)