函数语法

  1. function 函数名称(类型限定 参数列表):返回类型{
  2. //函数体
  3. return 返回值
  4. }

函数分类

  • 命名函数 :自动提升到脚本的顶部,在全局的任何地方都可以调用
    1. function demo()
    2. {
    3. return 'php';
    4. }
    5. echo demo() . '<br>';
  • 匿名函数
    1. $php = function () {
    2. return 'php';
    3. };
    4. echo $php() . '<br>';

    函数的参数

  • 必选参数
    1. function hello(string $name): string
    2. {
    3. return 'hello' . $name;
    4. }
    5. echo hello('admin'), '<br>';
    6. echo hello(123), '<br>';
    7. echo hello(true), '<br>';
  • 可选参数
    可选参数放在参数列表末尾,并且指定其默认值
    当使用默认参数时,默认参数必须放在非默认参数的右侧,否则函数可能出错
    1. function hello1(string $name = 'admin'): string
    2. {
    3. return 'hello' . $name;
    4. }
    5. echo hello1('user'), '<br>';
    6. echo hello1(), '<br>';
  • 不定参数
    参数数量 func_num_args()
    参数数组 func_get_args()
    获取某一个参数 func_get_arg(n)
    1. function args()
    2. {
    3. $n = func_num_args();
    4. $args = implode(',', func_get_args());
    5. $arg = func_get_arg(1);
    6. printf('参数数量=%d 参数=%s,第二个参数:%s', $n, $args, $arg);
    7. //求和
    8. echo '参数之和' . array_sum(func_get_args());
    9. }
    10. args(1, 2, 4, 5);

    …rest语法 剩余参数
    1. function args2(...$args)
    2. {
    3. print_r(($args));
    4. $n = count($args);
    5. $argss = implode(',', $args);
    6. $arg = $args[1];
    7. printf('参数数量=%d 参数=%s,第二个参数:%s', $n, $argss, $arg);
    8. echo '参数之和' . array_sum($args);
    9. }
    10. args2(1, 2, 3, 4);
  • 引用参数
    php支持值传递和引用传递,默认就是值传递;引用传参:在函数内部对参数的任何更新都会实现映射到外部的参数中
    1. $name = 'admin';
    2. function demo5(&$name)
    3. {
    4. $name = 'user';
    5. }
    6. echo "\$name=" . $name;
    7. demo5($name);
    8. echo "\$name=" . $name;

    函数的返回值

    函数只允许有一个返回值:单值返回;如果需要返回多个值,返回类型可以是数组 对象 序列化的 字符串
  • 数组
    1. function ok(): array
    2. {
    3. return ['code' => 1, 'msg' => 'ok'];
    4. }
    5. var_dump(ok());
  • 对象
    1. function user()
    2. {
    3. return new class()
    4. {
    5. public $name = 'admin';
    6. public $email = 'admin@admin.com';
    7. };
    8. }
    9. $user = user();
    10. var_dump($user);
    11. printf('name=%s<br> email=%s <br>', $user->name, $user->email);
  • 序列化
    php内置的序列化函数 如果这个序列化的数据只在php中使用,应该使用php内置的序列化方法
    1. function xu(): string
    2. {
    3. return serialize(['code' => 1, 'msg' => 'ok']);
    4. }
    5. echo xu();

    在php中使用时还原成原来的类型
    $arr = unserialize(xu());var_dump($arr);
  • 通用的json格式
    1. function demo6(): string
    2. {
    3. return json_encode(['code' => 1, 'msg' => 'ok']);
    4. }
    5. var_dump(demo6());

    如果当前脚本接收一个json格式的数据,可以转成php能够处理的数据类型
    • 对象
      $data = json_decode(demo6());var_dump($data);printf('status=%s,message=%s', $data->code, $data->msg);
    • 数组
      $arrTmp = json_decode(demo6(), true);var_dump($arrTmp);

      函数作用域.只有调用它的时候才会创建

      有2种方式可以在函数内部访问外部成员 $GLOBALS global $name
      ```html
      $name = ‘admin’;
      $email = ‘admin@qq.com’;
      function demoo(): string
      {
      $res = ‘’;
      global $name;
      $res .= ‘name=’ . $name . ‘<br>‘;
      $res .= ‘email=’ . $GLOBALS[‘email’] . ‘<br>‘;
      //私有成员
      $age=18;
      $res .= ‘age=’ . $age . ‘<br>‘;
      return $res;
      }

echo demoo();

  1. ![](https://img.php.cn/upload/image/279/798/549/1615543670657486.png)
  2. ###闭包函数:匿名函数,可以访问函数外部的自由变量/父作用域中的变量
  3. ```html
  4. $user11=function() use($name,$email){
  5. printf('name=%s,email=%s', $name, $email);
  6. };
  7. echo $user11() . '<br>';
  8. //闭包支持引用传参
  9. printf('现在的:name=%s,email=%s', $name, $email);
  10. $user12=function($newname,$newemail) use(&$name,&$email){
  11. $name=$newname;
  12. $email=$newemail;
  13. };
  14. echo $user12('user','user@admin.com') . '<br>';
  15. printf('改变后的:name=%s,email=%s', $name, $email);


ps: use禁止使用以下三种参数

  1. - 超全局不让用:$_GET;
  2. - $this
  3. - 与当前参数重名不让用

闭包经常用作函数的返回值

  1. function demo7($site){
  2. return function($color) use ($site){
  3. return sprintf('<h2 style="color:%s">%s</h2>',$color,$site);
  4. };
  5. }
  6. // $closure=demo7('站点');
  7. // echo $closure('red');
  8. //柯里化
  9. echo demo7('站点')('red');

异步回调执行

php是单线程,同步执行时如果遇到耗时函数会发生阻塞,应该将它改为异步回调执行
call_user_func(函数,函数列表);
call_user_func_array(函数,[参数数组])

  1. function demo8(string $name):string
  2. {
  3. return $name;
  4. }
  5. echo call_user_func('demo8','admin'),'<br>';
  6. echo call_user_func_array('demo8',['admin']);

静态变量

函数中的静态变量不会随函数调用结束而消失,它会自动进入到下一次的函数调用中,可以实现在函数的多次调用过程中:共享数据/数据通信

  1. function demo9(){
  2. static $i=1;
  3. echo $i,'<br>';
  4. $i++;
  5. }
  6. echo demo9();
  7. echo demo9();
  8. echo demo9();
  9. echo demo9();

更多相关文章

  1. php处理post传递json格式参数请求
  2. JQuery初学习之`$()`的参数类型
  3. 什么是技术分析(Technical Analysis)指标库
  4. C语言——C语言常用关键字总结(新手 还请不吝赐教)(一)
  5. shell 双多分支if条件句语法
  6. c++ this
  7. MVC控制器类的访问、参数解析、api接口数据获取并渲染
  8. python关于range函数总结
  9. 函数递归使用

随机推荐

  1. Java自学指南七、规划
  2. Oracle总结【SQL细节、多表查询、分组查
  3. Struts2【入门】
  4. IDA静态分析
  5. 什么是协程?Java中如何支持?
  6. 静态路由实例
  7. chrony用法
  8. 浅谈CDN、SEO、XSS、CSRF
  9. anaconda tensorflow-gpu 安装简易指南
  10. IDEA使用总结