Blogger Information
Blog 29
fans 0
comment 0
visits 18388
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
函数基础语法,函数进阶
CC
Original
607 people have browsed it

函数基本语法

函数语法

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. #以下是数组形式
  13. // 给 json_decode()传入第二个参数 : true
  14. $res=json_decode($str, true);
  15. var_dump($res);
  16. echo '<br>';
  17. printf('status = %d, message = %s<hr>',$res['status'], $res['message']);
  18. 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();
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post