函数基本语法

函数语法

function 函数名称(类型限定 参数列表) : 返回值类型
{
// 函数体
return 返回值;
// 没有return 返回null
}

  1. <?php
  2. function myfunc(float $a,int $b):float
  3. {
  4. return $a+$b;
  5. }
  6. echo myfunc(1,2);
  • 函数分类

    命名函数
    自动提升,在全局任何地方都可以调用

    1. <?php
    2. // 函数提升
    3. echo myfunc();
    4. echo '<br>';
    5. function myfunc()
    6. {
    7. return 'hello';
    8. }
    9. echo myfunc();

    匿名函数

    1. <?php
    2. $myfunc = function ()
    3. {
    4. return 'hello';
    5. };
    6. echo $myfunc();
  • 函数传参
    必选参数
    1. <?php
    2. // 必选参数
    3. function myfunc(string $name): string
    4. {
    5. // return返回值是文本必选是双括号
    6. return "hello $name";
    7. };
    8. echo myfunc('天蓬老师');

可选参数

  1. <?php
  2. function demo2(string $name = 'php.cn'): string
  3. {
  4. return "Hello $name !";
  5. }
  6. echo demo2(), '<br>';
  7. echo demo2('php中文网'), '<hr>';

$args剩余参数语法,组合成数组

  1. <?php
  2. // ...$args剩余参数语法,组合成数组
  3. function myfunc(...$args)
  4. {
  5. print_r($args);
  6. };
  7. myfunc(1,2,3);

$args的在数据库实际应用

  1. <?php
  2. function connect(...$args)
  3. {
  4. // print_r($args);
  5. return new PDO($args[0], $args[1], $args[2]);
  6. }
  7. // 数据库暂未学习,大家先体会一下
  8. $pdo = connect('mysql:dbname=mysql','root','root');
  9. if ($pdo) echo '<h3>连接成功</h3>';
  10. ob_clean();

php支持“值传递”和“引用传递”
引用传参在参数前使用: &

  1. <?php
  2. // 4. 引用参数
  3. // js函数参数只支持值传递
  4. // php支持“值传递”和“引用传递”
  5. // 默认就是值传递,上面全是
  6. // 引用传参: 在函数内部对参数的任何更新都会实现映射到外部的参数中
  7. $name = '天蓬老师';
  8. // 引用传参在参数前使用: &
  9. function demo6(string &$name)
  10. {
  11. $name = '灭绝老师';
  12. }
  13. echo "$name";
  14. demo6($name);
  15. echo '<br>';
  16. echo "$name ";
  17. `

php多值返回
数组

  1. <?php
  2. function myfunc(): array
  3. {
  4. // return返回值是文本必选是双括号
  5. return ['status' => 1, 'message' => '验证成功'];
  6. };
  7. print_r( myfunc());

php在数据库中前后端验证用法

  1. <?php
  2. function myfunc(): array
  3. {
  4. return ['status' => 1, 'message' => '验证成功'];
  5. };
  6. // print_r( myfunc());
  7. echo '<br>';
  8. $res=myfunc();
  9. echo $res['status']=== 1 ? $res['message']:'验证失败';

php多值返回

  1. <?php
  2. function myfunc(): object
  3. {
  4. return new class(){
  5. public $name = 'admin';
  6. public $email = 'admin@php.cn';
  7. };
  8. }
  9. $user=myfunc();
  10. printf('name = %s<br>email = %s<hr>', $user->name, $user->email);

php多值返回
序列化字符串

  1. <?php
  2. // 3.1 php内置的序列化函数
  3. // 如果有一些数据需要进行网络传输或保存到文件或数据表中的时候要用到它
  4. // 如果这个序列化的数据只在php程序中使用,应该使用php内置的方法就可以了
  5. function demo3(): string
  6. {
  7. // serialize序列化函数
  8. return serialize(['status' => 1, 'message' => '验证成功']);
  9. }
  10. $str = demo3();
  11. echo $str;
  12. // file_put_contents('file.txt', $str);
  13. // 在php中使用时要还原成原来的类型
  14. $arr = unserialize($str);
  15. var_dump($arr);
  16. echo '<hr>';

php多值返回
json

  1. <?php
  2. // 3.2 转为通用的json格式的字符串
  3. // 这样就可以与其它编程语言进行数据交换,例如与前端js,java,python...
  4. function demo4(): string
  5. {
  6. return json_encode(['status' => 1, 'message' => '验证成功'], JSON_UNESCAPED_UNICODE);
  7. }
  8. $str = demo4();
  9. echo $str;
  10. echo '<br>';
  11. #数组形式
  12. // 给 json_decode()传入第二个参数 : true
  13. $res=json_decode($str, true);
  14. var_dump($res);
  15. echo '<br>';
  16. printf('status = %d, message = %s<hr>',$res['status'], $res['message']);
  17. print_r($res);

函数进阶

作用域

  • 函数内部调用全局变量,需要先声明,在函数内部用global声明;或是使用$GLOBALS函数调用。
  1. <?php
  2. #全局成员
  3. $name = 'chen';
  4. $email = '123456';
  5. function myfun(): string
  6. {
  7. $message = '';
  8. // 在函数内部声明为global
  9. global $name;
  10. $message .= $name.'<br>';
  11. // 以子典形式取值
  12. $message .=$GLOBALS['email'];
  13. return $message;
  14. }
  15. echo myfun();
  • 外部调用函数内部私有变量,使用return
    1. <?php
    2. function myfun(): string
    3. {
    4. $message = 'chen';
    5. return $message;
    6. }
    7. echo myfun();
  • 闭包: 可以访问函数外部的自由变量/父作用域中的变量
  1. <?php
  2. $name = 'chen';
  3. $email = '123456';
  4. function myfun(): string
  5. {
  6. $message = '';
  7. // 在函数内部声明为global
  8. global $name;
  9. $message .= $name.'<br>';
  10. // 以子典形式取值
  11. $message .=$GLOBALS['email'];
  12. return $message;
  13. };
  14. echo myfun();
  1. <?php
  2. $name = 'chen';
  3. $email = '123456';
  4. $myfun=function () use($name, $email)
  5. {
  6. return sprintf($name,$email);
  7. };
  8. echo $myfun();

闭包引用传参

  1. <?php
  2. $name = 'chen';
  3. $email = '123456';
  4. // 引用传参&
  5. $myfun=function ($myname) use(&$name)
  6. {
  7. $name=$myname;
  8. };
  9. $myfun('张');
  10. echo $name;

闭包使用用柯里化
嵌套函数,再柯里化

  1. <?php
  2. function demo4($site)
  3. {
  4. // 返回一个函数,闭包最佳使用场景
  5. return function ($color) use ($site) {
  6. return sprintf('<h3 style="color:%s">%s</h3>', $color, $site);
  7. };
  8. }
  9. // var_dump( demo4('php中文网'));
  10. // $closure = demo4('php中文网');
  11. // echo $closure('red');
  12. // 高阶函数: 柯里化
  13. echo demo4('php中文网')('red');

回调

  • php单线程,同步执行,如果遇到耗时函数会发生阻塞,应该将它改为异步回调执行
  1. <?php
  2. function myfun(string $name): string
  3. {
  4. return "$name";
  5. };
  6. // 传统访问
  7. echo myfun('chen');
  8. echo '<hr>';
  9. // 异步执行
  10. // call_user_func('函数','参数列表')
  11. echo call_user_func('myfun','liu') ,'<hr>';
  12. // call_user_func_array(函数,[参数数组])
  13. echo call_user_func_array('myfun',['wang']);
  • 回调对象
  1. <?php
  2. // 这二个函数还可以异步的调用对象方法
  3. class User
  4. {
  5. // 实例方法
  6. public function hello(string $name) : string
  7. {
  8. return "Hello $name !";
  9. }
  10. // 静态方法: 类调用
  11. public static function say(string $site) : string
  12. {
  13. return "欢迎来到 $site !";
  14. }
  15. }
  16. // 实例方法
  17. $res = call_user_func_array([new User, 'hello'], ['朱老师']);
  18. echo $res,'<br>';
  19. // 静态方法
  20. // $res = call_user_func_array(['User', 'say'], ['php中文网']);
  21. $res = call_user_func_array('User::say', ['php中文网']);
  22. echo $res,'<br>';

php的静态变量

  1. <?php
  2. // 静态变量
  3. function demo1()
  4. {
  5. // 函数中的静态变量不会随函数调用结束而消失
  6. // 他会自动进入到下一次的函数调用中
  7. // 可以实现在函数的多次调用过程中:共享数据 / 数据通信
  8. static $i = 1;
  9. echo $i,'<br>';
  10. $i++;
  11. }
  12. // echo $i;
  13. echo demo1();
  14. echo demo1();
  15. echo demo1();
  16. echo demo1();
  17. echo demo1();

更多相关文章

  1. php学习笔记(函数相关_作用域_闭包_回调_多指返回)
  2. 细解php函数
  3. 认识函数的类型、参数与返回值
  4. 如何取消 JavaScript 中的异步任务
  5. 用函数式编程在 JS 中开发游戏
  6. php常用运算符、条件分支、循环、及文件引入
  7. JavaScript 执行线程图解
  8. PHP函数作用域、闭包及函数多值返回
  9. PHP基础知识:函数相关知识

随机推荐

  1. php 谈谈我对session, cookies和jwt的理
  2. 当我将它移动到另一台服务器时,计数器将无
  3. 案例:用Redis来存储关注关系(php版)
  4. 如何在进行单元测试时覆盖php://输入
  5. 如何在mysql中配置区分大小写的数据库标
  6. 在两个不同的地方分割/爆炸一个PHP字符串
  7. 如何用jQuery AJAX调用发送所有当前的pos
  8. PHP实例————万年历
  9. php isset和empty方法的区别
  10. 如何调试UPDATE函数在PHP中无法正常工作