函数就是具有特定功能的固定的代码段。PHP本身已经封装好了很多这种内置函数。
我们也可以自定义函数。
使用function关键字来定义函数
举一个例子
通过 函数名(函数的实参列表) 格式去调用函数
同样实参有多个时,中间用逗号分开
函数名的命名规则和变量名是一样的。用下划线或字母开头,后面跟下划线、字母、数字。
注意:函数名是不区分大小写的。定义和调用时都不用管大小写的问题。
函数名的命名方法:强烈推荐使用大小驼峰法
函数不允许重复定义
函数调用,通常情况下应该先定义后使用
但是,如果是一个脚本程序的情况下,可以先使用后定义
原因:PHP核心引擎程序它在解释PHP脚本程序时,会先将函数字义预处理
所以感觉先使用后定义是没问题的。
可是如果函数定义是在包含文件中,则必须先定义后使用
不能自定义一个和内置函数相同名称的函数
函数的参数分为:形参和实参
形式参数用于表明函数需要几个数据。
从函数定义上,不能看出形参是什么类型,这是和PHP是弱类型语言有关。
所以在PHP,经常会遇到看了一个自定义,但是不清楚,形参应该是传递给它什么样的数据。
提示:
在自定义函数时,应该养成写函数注释的习惯。
形参的默认值
在定义函数时,可以为形参指定一个值作为默认值。当函数调用没有此参数时,此形参使用默认值。
调用时,未使用第二个参数
如果函数的形参都有默认值,则调用时,可以一个实参都不给出。
思考:如果有默认值的形参是在左边,默认值有用吗?
这种情况,默认值是使用不到的。
结论:要把有默认值的形参,放在后面。
注意:
形参的默认值只能是确定的值或常量,不能是变量!
实参必须是有值的数据。(包括有值的变量,或者具体的值)
值传递
正常情况下,函数调用时,传递的都是值的拷贝。就是把实参的值赋给相应的形参。
说明在函数中如果形参的值发生了变化,实参不会受影响。
引用传递
引用传递时,形参是实参的一个引用,在函数中改变形参的值,实参值也会改变!
旧的引用传递的方式
这个旧语法报错是因为在php.ini里已经配置成默认不支持了
可以修改配置
然后就不会报错了。但是不建议使用这种过时的语法方式了。
不定参数数量函数
Var_dump($a, $b, $c, $d)这种函数可称为不定参数数量函数
如何定义我们自己的可变参数数量函数?
需要使用系统内置函数:func_get_args()
具体实现功能
Func_get_args() 可以获取所有传递的实参数据
Func_get_arg(index) 可以获取某一个下标的参数值
Func_num_args() 可以得到传递的参数的数量
就是完成特定功能的代码。
当我们知道函数的执行结果的时候,可以使用return把结果返回给调用者。
思考:如果不写return或return后面没有数据时,返回什么?
返回null
返回引用
除了返回值以外,还可以返回引用
定义函数时,要在函数名前加引用符号&
注意:返回引用方式下,不能返回确定的值的引用,必须以变量的方式返回引用
我们在脚本程序中的变量是全局变量,在函数中的变量是局部变量,它们的作用域不同。
想在函数中直接使用全局变量是访问不到的。
有两种方法可以让我们在函数的作用域中访问到全局变量
Global是怎么做到的?
相当于给全局变量新建了一个引用
在函数内删除掉引用变量,不会影响原全局变量
$GLOBALS可以引用到全局范围可见的所有变量
使用格式:$GLOBALS[‘变量名’]可以在函数中调用到全局变量
在函数中,可以使用给$GLOBALS[‘变量名’]赋值改变全局变量的值
如果我们删除呢?就会把全局变量删除掉!
从安全角度说,global关键字只能修改全局变量的值,不能删除掉全局变量。
而$GLOBALS预定义变量方式,则既可以修改也可以删除掉全局变量。
Function aaa(&$m)
只能通过引用传递的方式向形参传递引用变量
这种方式和使用global关键字很类型
名称可变的函数,称为可变函数。
使用一个变量作为调用函数时的名称
实际应用的例子:当用gd函数处理图像时,根据不同的配置,调用不同的函数
在PHP5.3以后,开始支持匿名函数的功能。
匿名函数就是没有名字的函数,又叫做闭包函数。
定义的匿名函数一般会保存到一个变量中。
使用保存匿名函数的变量后面加()来访问
我们查看保存匿名函数的变量的值及类型
看到匿名函数是通过PHP的一个叫闭包类来实例出一个对象实现的
匿名函数也可以有形参,可以接收实参传递的数据
匿名函数的形参也可以接收引用传递的数据
我们见过更多的是,在函数中去定义一个匿名函数。
函数中的匿名函数,如果接收函数的一个局部变量传递给它时,形成了闭包。
函数中的静态变量:它的作用域还是局部,只是它的生命周期由函数周期变成了脚本周期。
如果多次调用函数,会共用同一个静态变量。
函数中定义的匿名函数,使用函数的局部变量通常是采用use语法
除了值传递方式接收参数外,还可以接收引用的参数
匿名函数两大特征
如果array_map()它的第一个参数就是要求一个回调函数(callback, callable)
第一个特点:在函数中有调用自己的语句。这样就形成了递归调用。
第二个特点:在函数中必须有终止条件,递归出口。
在函数中,普通的变量都是局部的,它的生命周期是函数周期。
有一种特殊的函数中的变量叫静态变量,它的生命周期是从函数第一次被调用开始一直到脚本程序执行结束。
在函数定义一个静态变量,使用static关键字
总结:函数的静态变量,在函数消失后,它不会消失,它的值也会保留。当下一次函数被调用时,使用其当前的值。 静态变量在此函数多次调用时,是共享的!
静态变量只初始化一次。
静态变量同样是局部变量,在全局是访问不到它的。
递归的思路是把大问题转成小问题。
迭代是通过循环结构来解决问题。实际上由小求解出大问题。
我们可以用斐波那契数列的例子来对比
我们用迭代的方式来实现
相比较,肯定是迭代的效率高。
结论:如果能够使用迭代实现,就不要用递归。
补充知识:关于函数在结构中或函数中定义的情况
函数是可以定义在任何位置的,如在分支结构中,在函数中
函数的定义:不能重复定义
比如在函数中定义的函数,在外部的函数未被调用过时,里面的函数系统是不知道的,
我是小咖
发个邀请:
如果你正好想学习php,可以与我一起交流,我的VX:feilueze333。下面资料免费赠送。