Blogger Information
Blog 37
fans 0
comment 0
visits 34704
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php函数讲解
手机用户1607314868
Original
620 people have browsed it

实例演示函数作用域与闭包,回调的使用场景与参数调用; 2. 实例演示函数的多值返回类型方式,重点是json

函数

  1. 语法:
  1. function 名称(类型限定 参数):返回类型{
  2. //函数体
  3. //return 返回值,没有return 返回null
  4. }

2.分类

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

函数参数

  1. 必选参数
  1. function demo3(string $name): string
  2. {
  3. return "hello $name !";
  4. }
  5. //将标量(单值)会自动转为字符串
  6. echo demo3(123);
  7. echo demo3(true);
  1. 可选参数
  1. function demo4(string $name='hello world'): string
  2. {
  3. return "hello $name !";
  4. };
  5. echo demo4();
  6. //当有多个参数时,可选参数必须放在后面
  7. // 因为调用的时候如果不传参默认输出的话,得想办法空出来可选参数

3.不定参数

  1. function demo5(){
  2. //参数有几个
  3. $n=func_num_args();
  4. //参数组成的数组
  5. func_get_args();
  6. //获取某一个参数
  7. $arg=func_get_args()[1];
  8. //参数求和
  9. array_sum(func_get_args());
  10. //不推荐使用以上三个函数了,有更简便的替代...rest
  11. }
  12. demo5(1,2,3);

简化为:

  1. function demo6(...$args){
  2. //参数有几个
  3. $n=count($args);
  4. //参数组成的数组
  5. $args;
  6. //获取某个参数
  7. $arg=$args[1];
  8. }

4.引用参数
在函数内部对参数的任何更新都会实现映射到外部的参数中

  1. $name='小红';
  2. function demo7(string &$name){
  3. $name='小明';
  4. }
  5. echo "\$name=$name"; //小红
  6. echo demo7($name);
  7. echo "\$name=$name"; //小明

函数返回值

只允许有一个返回值,返回多值,只能在返回值的类型上动手脚
1.数组

  1. function demo8():array
  2. {
  3. return ['ab'=>1,'cd'=>2];
  4. };

2.对象

  1. function demo9():object
  2. {
  3. //匿名类
  4. return new class(){
  5. public $name='admin';
  6. public $email='admin@php.cn';
  7. };
  8. }

3.序列化字符串
如果有一些数据需要进行网络传输或保存到文件或数据表中的时候要用到它,如果这个序列化的数据只在php程序中使用,应该使用php内置的方法

  1. function demo():string
  2. {
  3. return serialize(['ab'=>1,'cd'=>2]);
  4. };
  5. //返回序列化的字符串
  6. $str=demo();
  7. //在php中使用时要还原成原来的类型
  8. $arr=unserialize($str);

4.转为通用的json格式的字符串

  1. function demoo():string
  2. {
  3. //JSON_UNESCAPED_UNICODE 处理中文
  4. return json_encode(['ab'=>1,'cd'=>'小红'],JSON_UNESCAPED_UNICODE);
  5. };
  6. echo $str=demoo();
  7. //当前脚本接收到一个前端或其他接口发送过来的json格式的数据,可以进行解析
  8. $res=json_decode($str);//将外部json解析成对象类型
  9. $res=json_decode($strtrue);//将外部json解析成数组类型

函数作用域

  1. $name="小王";
  2. $email='1747615798@qq.com';
  3. function demo1():string
  4. {
  5. $res='';
  6. //如果想在函数内部访问全局/外部的成员
  7. //两种方式可以在函数内部访问外部成员
  8. // 1.global
  9. global $name;
  10. $res.='name='.$name;
  11. //2.$GLOBALS
  12. $res.='email='.$GLOBALS['email'];
  13. return $res;
  14. }
  15. echo demo1();

闭包

闭包:匿名函数,可以访问函数外部的自由变量/父作用域中的变量

  1. $name="小王";
  2. $demo2=function()use($name)
  3. {
  4. return $name;
  5. };
  6. echo $demo2();

闭包支持引用传参,参数前加 &

  1. $demo3=function($myname) use(&$name)
  2. {
  3. return $name=$myname;
  4. };
  5. $demo3('小蓝');

注意:use禁止使用一下三种参数
1.超全局不让用
2.$this
3.与当前参数重名不让用

回调函数

php单线程,同步执行,如果遇到耗时函数会发生阻塞,应该将它改为异步回调执行

  • call_user_func(函数名,参数列表)
  • call_user_func_array(函数名,参数列表数组)
    1. function demo4(string $name) :string
    2. {
    3. return $name;
    4. }
    5. echo call_user_func('demo4','小明');
    也可用对象上
  1. class User{
  2. public function hello($name):string
  3. {
  4. return $name;
  5. }
  6. public static function say(string $site):string
  7. {
  8. return $site;
  9. }
  10. }
  11. //普通方法
  12. $res=call_user_func_array([new User,'hello'],['小红']);
  13. echo $res;
  14. //静态方法
  15. $site=call_user_func_array(['User','say'],['小李']);
  16. //也可简写
  17. $site=call_user_func_array('User::say',['小李']);
  18. echo $site;
静态变量
  1. function demo(){
  2. //函数中的静态变量不会随函数调用结束而消失
  3. //它会自动进入到下一次的函数调用中
  4. //可以实现函数的多次调用过程中:共享数据/数据通信
  5. static $i=1;
  6. echo $i;
  7. $i++;
  8. }
  9. echo demo();
  10. echo demo();
  11. echo demo();
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