PHP函数基础:https://www.cnblogs.com/lxwphp/p/9867840.html
 
1.函数分类:
定义:完成某些功能的代码段
系统函数:字符串,数组,数字,日期时间
自定义函数:按照具体需求封装的函数
2.函数的执行原理:
函数不调用不执行,当封装完函数之后将其载入到内存,当调用函数的时候,找到对应的函数,执行函数体;
当碰到return或执行到函数的末尾,再将控制权移交到调用的函数的位置上,接着程序继续执行。
3.注意:
   函数名称不能包含特殊字符,以字母或者下滑开头,后面跟上数字,字母,下划线。
函数名称最好以动词开头,最好含义明确,getExt(),uploadFile()
函数名称遵循驼峰法或者下划线。
函数名称不区分大小写,但是尽量遵循定义时的大小写进行调用。
函数名称不支持重名,如果重名会报致命性错误。
函数可以参数,也可以没有参数;
函数可以返回值,也可以没有返回值,return 返回值;
4.函数的返回值:
函数可以有0个或1个返回值,如果想返回多个值,可以通过返回数组或者对象形式实现。
函数通过return加返回值,函数碰到return立即结束。
函数的返回值可以是任意类型。函数默认返回null。
5.函数的参数
通过参数列表可以传递信息到函数,即以逗号作为分割符的表达式列表,参数是从左向右求值得;
函数可以带有0个或多个参数。
参数的数据类型可以为任意数据类型;
参数可以分为可选参数和必选参数,如果有可选参数和必选参数,必选参数一定在可选参数之前;
6.局部变量:
函数体内声明的变量为局部变量;
局部变量分为动态变量和静态变量;
函数执行完毕立即释放。
6.1动态变量:函数体内的变量,函数执行完毕,就释放。
7.静态变量:通过static关键字声明的变量为静态变量,当第一次调用函数的时候相当于初始化静态变量,当函数执行完毕之后静态变量并没有释放而是保存在静态内存中,当再次调用函数的时候首先从静态内存中取出变量的值再执行。
<?php
function test1(){
     $i=1;
    echo $i++,"\n";
}
test1();
test1();
test1();
var_dump($i);
输出:1 1 1 
<?php
function test1(){
    static $i=1;
    echo $i++,"\n";
}
test1();
test1();
test1();
var_dump($i);
输出:1 2 3  ,var_dump($i) 时,$i 是报错未定义的变量,$i是局部变量。
 
8.全局变量:
函数体外声明的变量,或者在函数体内通过global关键字声明的变量。
9.如何在函数体内使用全局变量
   a:通过global关键字
   b:通过$GLOBALS超全局变量,$GLOBALS包括$_GET,$_POST,$_ENV,$_SERVER
$a=1;
$b=2;
function test2(){
    global $a,$b;
    var_dump($a,$b);
    $a=3;
    $b=4;
}
test2();//int(1) int(2) 
var_dump($a,$b);//int(3) int(4)  修改的是全局变量$a,$b
 
function test3(){
    global $m,$n;
    $m=3;
    $n=6;
}
test3();//  如果不调用test3(),下面的$m,$n报错未定义
var_dump($m,$n);//int(3) int(6)  
 
10.可变函数
   在PHP中,如果将“函数名称”赋予字符串类型的变量,但是在使用该变量时,如果带有小括号,那么PHP引擎将解析函数。
注意:可变函数不能用于像,echo,print,unset(),isset(),empty(),include(),require(),以及类似的语言结构。
$funcname="md5";
echo $funcname('lxw'),"\n";
echo "<br>";
echo md5('lxw');
 
echo "<pre>";
print_r(get_defined_functions());//得到定义的函数
print_r(get_defined_constants());//得到定义的常量
print_r(get_defined_vars());//得到定义的变量
echo "</pre>";
11.回调函数
定义:就是调用函数的时候将另外的一个函数的名称当作参数传递进去,并且在函数体中进行调用。
如何调用回调函数:
可以通过可变函数的形式在函数体中进行调用,
可以通过call_user_func()和call_user_func_array()进行调用。
扩展:range($start,$end):建立包含指定范围的单元的数组
<?php
var_dump(range(0,10));
输出:array(11) { [0]=> int(0) [1]=> int(1) [2]=> int(2) [3]=> int(3) [4]=> int(4) [5]=> int(5) [6]=> int(6) [7]=> int(7) [8]=> int(8) [9]=> int(9) [10]=> int(10) }
12.array_map()与array_walk()区别
array_map(callbakc,$array1):
callback:回调函数,
$array1:数组,遍历运行callbak函数。
返回数组,包含callback函数处理之后array1的所有元素;
var_dump(array_map('md5',array('lxw','11')));
输出:array(2) { [0]=> string(32) "275939945caa6f44d32a2bdb9687ca47" [1]=> string(32) "6512bd43d9caa6e02c990b0a82652dca" }
使用匿名函数:
<?php
$func = function($value) {
    return $value * 2;
};
 
print_r(array_map($func, range(1, 5)));
?>
//range(1, 5) 输出array(1,2,3,4,5)
输出:Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 10
)
$arr=array(1,2,3,4);
function test1($var){
    return $var*=2;
}
$res=array_map('test1',$arr);
print_r($arr);
print_r($res);
 
function test2(&$var,$key,$p){
    return $var=$p.":".$var*3;
}
var_dump(array_walk($arr,"test2",'this is'));
print_r($arr);
 
总结:array_map(callback,$arr):callback回调函数,$arr 运行的数组, 把数组中的每个值发送到用户自定义函数,返回新的值。
函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。
回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
   array_walk($arr,myfunction,$p): 函数对数组中的每个元素应用用户自定义函数。在函数中,数组的键名和键值是参数。 您可以通过把用户自定义函数中的第一个参数指定为引用:&$value,来改变数组元素的值, 函数对数组中的每个元素应用回调函数。如果成功则返回 TRUE,否则返回 FALSE。 典型情况下 myfunction 接受两个参数。array 参数的值作为第一个,键名作为第二个。如果提供了可选参数 userdata ,将被作为第三个参数传递给回调函数。
将函数名赋值为 null 时:
$a1=array("Dog","Cat");
$a2=array("Puppy","Kitten");
print_r(array_map(null,$a1,$a2));
输出:合并后的索引二维数组
Array
(
    [0] => Array
        (
            [0] => Dog
            [1] => Puppy
        )
    [1] => Array
        (
            [0] => Cat
            [1] => Kitten
        )
)
array_filter() 函数用回调函数过滤数组中的值。 该函数把输入数组中的每个键值传给回调函数。如果回调函数返回 true,则把输入数组中的当前键值返回结果数组中。数组键名保持不变。
$arr2=array(1,2,3,4,5,6,7);
function odd($var){
    if($var%2==1){
        return $var;
    }
}
print_r(array_filter($arr2,"odd"));
 
输出:Array ( [0] => 1 [2] => 3 [4] => 5 [6] => 7 )
call_user_func(myfunc,$param);
echo call_user_func("md5",'lxw');//32位加密字符
call_user_func_array(myfunc,array);
function add($x,$y){
    return $x+$y;
}
 
function reduce($x,$y){
    return $x-$y;
}
echo "
";
echo call_user_func_array("add",array(1,2));//3
echo call_user_func_array("reduce",array(3,5));//-2
13.匿名函数也叫闭包函数,允许创建一个没有指定名称的函数,最经常用作回调函数参数的值。匿名函数也可以作为变量的值来使用。
$func=function ($params){
    return "this is test  ".$params;
};
echo $func("PHP");
输出:this is test PHP
 
$func2=create_function('$x,$y','return $x+$y;');
echo $func2(2,3);//5
 
$func1=create_function('$name','echo "hello world $name";');
echo $func1('lxw');
输出:hello world lxw
$arr1=array(1,3,4);
print_r(array_map(function ($var){return $var*2;},$arr1));
输出:Array ( [0] => 2 [1] => 6 [2] => 8 )
14.递归函数 能少用就少用
通俗讲就是自己调用自己的函数,通过特定条件结束执行。
场景:PHP实现目录的遍历,目录的复制,删除非空目录操作;
          无极限分类也可以通过递归调用实现。
 
test3(3);
输出:3 2 1 0
 

PHP函数高级(二)的更多相关文章

  1. Scala学习——函数高级操作

    scala函数高级操作 一.字符串高级操作 多行字符串和插值 package top.ruandb.scala.Course06 object StringApp { def main(args: A ...

  2. 1、Golang基础--Go简介、环境搭建、变量、常量与iota、函数与函数高级

    1 Go语言介绍 1 golang-->Go--->谷歌公司 2009年 golang:指go语言,指的go的sdk goland:软件,ide:集成开发环境 Java写的 2 Go是静态 ...

  3. Javascript常用方法函数收集(二)

    Javascript常用方法函数收集(二) 31.判断是否Touch屏幕 function isTouchScreen(){ return (('ontouchstart' in window) || ...

  4. Lua函数之二

    Lua函数之二 Lua中函数的两个重要特性: 1.函数和其他类型(如number.string)一样,可以存放在变量中,也可以存放在table中,可以作为函数的参数,还可以作为函数的返回值. 2.嵌套 ...

  5. day 16 - 2 内置函数(二)练习

    内置函数(二)练习 1.用 map 来处理字符串列表,把列表中所有人都变成 sb,比方 alex_sbname=['alex','wupeiqi','yuanhao','nezha'] name=[' ...

  6. day 16 - 1 内置函数(二)

    内置函数(二) reversed()  返回一个反向的迭代器 k = [1,2,3,4,5] k.reverse() #反转 print(k) k = [1,2,3,4,5] k2 = reverse ...

  7. [C++ Primer Plus] 第7章、函数(一)程序清单——递归,指针和const,指针数组和数组指针,函数和二维数组

    程序清单7.6 #include<iostream> using namespace std; ; int sum_arr(int arr[], int n);//函数声明 void ma ...

  8. python函数(二)

    python函数(二) 变量的作用域 1.局部变量与全局变量 在函数内创建的变量被称为局部变量,这类变量的生命周期与函数相同,当函数执行完毕时,变量也就随之消失. 此类变量只能在函数内部调用,函数外不 ...

  9. C#中的函数式编程:递归与纯函数(二) 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面

    C#中的函数式编程:递归与纯函数(二)   在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential ...

  10. 【如何让代码变“高级”(二)】-这样操作值得一波666(Java Stream)(这么有趣)

    [如何让代码变“高级”(二)]-这样操作值得一波666(Java Stream)(这么有趣) 开发中的代码 在开发中的代码是不是很常见这样的代码: 这样的? for循环取元素取值 List<Us ...

随机推荐

  1. 从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1)

    从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1) 假设数据已经是排序好的 #include <stdio.h> #include & ...

  2. Hbase启动的时候出现:[RpcServer.handler=28,port=60000] ipc.RpcServer: RpcServer.handler=28,port=60000: exiting,master.HMasterCommandLine: Master exiting

    hadoop 版本:CDH5.02 Hbase 版本:hbase-0.96.1.1-cdh5.0.2 配置文件:hbase-site.xml <configuration> <pro ...

  3. Zookeeper怎么实现分布式锁?

    对访问资源 R1 的过程加锁,在操作 O1 结束对资源 R1 访问前,其他操作不允许访问资源 R1.以上算是对独占锁的简单定义了,那么这段定义在 Zookeeper 的"类 Unix/Lin ...

  4. Spring Cloud Eureka 注册安全一定要做到位!

    /eureka/ 参考配置如下: defaultZone: http://javastack:javastack@eureka1:8761/eureka/, http://javastack:java ...

  5. 干货:Java技术栈18年02月精彩好文汇总

    一晃眼,一个月过去了,新年也过完了. 一晃眼,又老了一岁了,感觉新的一年压力更大了. 我们也该为这一个月的技术做做汇总了,错过的同学正好可以统一回顾看看,已经看过的同学也可以再温习一下.. Java技 ...

  6. spring boot资源文件配置读取

    一般业务配置,尽量新建自己的配置文件,来读取,而不是配置在application.properties或application-*.properties或yml/yaml配置中. applicatio ...

  7. CSS 命名规范将省下调试时间

    我听说很多开发者厌恶 CSS.而在我的经验中,这往往是由于他们并没有花时间来学习 CSS. CSS 算不上是最优美的『语言』,但迄今二十多年来,它都是美化 web 举足轻重的工具.从这点来说,也还算不 ...

  8. shell 命令 链接文件 ln

    1. 创建软链接文件   [  ln -s 源文件   链接文件]     类似于windows下的快捷方式 [ ln -s expr.sh expr ] 此时创建的链接文件路径是相对于现在所在的路径 ...

  9. JS对象 返回/设置时间方法 get/setTime() 返回/设置时间,单位毫秒数 一小时为:60*60*1000

    返回/设置时间方法 get/setTime() 返回/设置时间,单位毫秒数,计算从 1970 年 1 月 1 日零时到日期对象所指的日期的毫秒数. 如果将目前日期对象的时间推迟1小时,代码如下: &l ...

  10. artTemplate(mark)

    一个渲染性能出众模板引擎,无论在 NodeJS 还是在浏览器中都可以运行. 特性 拥有接近 JavaScript 渲染极限的的性能 调试友好:语法.运行时错误日志精确到模板所在行:支持在模板文件上打断 ...