博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP函数高级(二)
阅读量:5879 次
发布时间:2019-06-19

本文共 4684 字,大约阅读时间需要 15 分钟。

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
 
你可能感兴趣的文章
string::c_str()、string::c_data()及string与char *的正确转换
查看>>
11G数据的hive初测试
查看>>
如何使用Core Text计算一段文本绘制在屏幕上之后的高度
查看>>
==和equals区别
查看>>
2010技术应用计划
查看>>
XML 节点类型
查看>>
驯服 Tiger: 并发集合 超越 Map、Collection、List 和 Set
查看>>
Winform开发框架之权限管理系统改进的经验总结(3)-系统登录黑白名单的实现...
查看>>
Template Method Design Pattern in Java
查看>>
MVC输出字符串常用四个方式
查看>>
LeetCode – LRU Cache (Java)
查看>>
JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)...
查看>>
【转】 学习ios(必看经典)牛人40天精通iOS开发的学习方法【2015.12.2
查看>>
在 ASP.NET MVC 中使用异步控制器
查看>>
SQL语句的执行过程
查看>>
Silverlight开发历程—动画(线性动画)
查看>>
详解Linux中Load average负载
查看>>
HTTP 协议 Cache-Control 头——性能啊~~~
查看>>
丢包补偿技术概述
查看>>
PHP遍历文件夹及子文件夹所有文件
查看>>