标签:php 基础
08.函数的核心
学习要点:
1.函数的定义与调用
2.参数传递方式
主讲教师:李炎恢
本课程属于 直播班专享 课程
本节课我们来学习一下函数的核心思想,理解函数的定义与调用方式,以及参数的传递
方式等。
一.函数的定义与调用
1.什么是函数?及其作用。
a) 函数是一段被命名的、完成特定任务的代码块;
b) 函数可以接收一系列值或参数;
c) 函数大多数情况下提供结果返回值;
d) 函数的目的是避免代码重复减少冗余;
e) 函数可降低开发维护成本提高代码可读性。
2.函数的定义规则
a) 函数以 function 开后,空格后跟随函数名;
b) 函数名以字母或下划线开头,其后跟随零个或多个字母、下划线和数字任何的
字符串组合;
c) 函数名不要和关键字、保留字和内置函数名冲突,建议设置固定前缀区分。
3.函数的声明方式
//一个简单函数
function fnArea()
{
return 20.5;
}
注意:return 表示返回,这里如果换成 echo,则表示函数执行后打印日期。一般来说,
函数用于返回的居多,可以在外部进行打印、计算等更多处理方式。
4.函数的调用方式
//调用函数,并打印返回值
echo fnArea();
二.参数的传递方式
1.按值传递参数
这种方式是最常用的传参方式,我们大部分会使用这种方式。
//计算一个圆的面积,圆周率和半径通过传参传入
function fnArea($pi, $r)
{
return $pi * $r * $r;
}
echo fnArea(3.14, 20);
注意 1:这里的($pi, $r)中的两个变量是形参,用于接收一个值,类似变量赋值;而
(3.14, 20)这里的两个表达式是实参,用于给函数传递值。形参只能是变量,而实参可以
是常量、变量或表达式。
注意 2:形参$pi 和$r 属于函数内部的变量,它作用域只在 fnArea 函数内部。外部无
法访问。更多关于作用域的问题,会在后续专门章节探讨。
2.按引用传递参数
这种传递方式运行忽略普通的作用域规则,可让函数直接访问和操作参数变量。按引用
传递时,传递的实参必须变量,而形参前面需要加上‘&‘符号。
//按引用传递示例
function fnArea(&$pi)
{
$pi ++;
}
$mypi = 3.1415926;
fnArea($mypi);
echo $mypi;
注意:如果按引用传递,函数将$mypi 的引用指针传给了$pi,也就是说,$pi 只不过
是$mypi 的别名,是它的影子,而不是独立的存在。$pi++其实改变的是$mypi。也就是说:
按值传递,是两个独立物体指之间的传递;而引用只是自己传给自己的影子。
3.默认参数
有时函数的形参可能不接受实参传递,从而导致形参变量没有赋值而出错。而不接受实
参传递的形参,我们可以直接设定一个默认值,从而避免出错。
//$pi 如果没有设置,将会出错
function fnArea($r, $pi = 3.14)
{
return $pi * $r * $r;
}
echo fnArea(20);
注意:$pi 形参我们设置在了右边,因为在传递实参时,左边无法设置不传值。所以,
需要将有默认值的参数设置在最右边。而如果实参此时传递一个新值,将覆盖默认值。
4.可变参数
所谓可变参数,就是传入的函数是不确定的个数。通过一个参数接收函数来一一获取这
些参数集合。
function fnList()
{
$count = 0;
//循环参数列表
for ($i = 0; $i < func_num_args(); $i++) {
//获取每一个参数,并累加
$count += func_get_arg($i);
}
return $count;
}
//传递三个参数
echo fnList(1, 2, 3);
//通过数组下标得到指定参数
$count += func_get_args()[$i];
5.匿名函数
匿名函数也成为闭包函数,是一种临时创建一个没有指定名称的函数。通常用于一些回
调函数的参数的值。
//匿名函数的简单写法
$fnList = function ()
{
return ‘fnList‘;
};
echo $fnList();
注意:这里只不过将一个你们函数的返回值赋给了一个变量,然后通过变量+()的方式
打印出返回值,本质上和普通函数并没有太大区别。
//很多函数内部参数就是一个函数,不支持匿名函数就需要这么写
function callback($arg)
{
echo $arg;
}
call_user_func(‘callback‘, ‘test‘);
//如果使用匿名函数,这个回调函数就干脆多了,整体性也强了不少
call_user_func(function ($arg) {
echo $arg;
}, ‘test‘);
一.变量作用域
1.局部作用域
函数内部的变量我们称为:局部变量。这个变量可以是传递过来的形参,也可以是函数
内部声明的变量。这种变量仅在函数内部访问,在外部是无法访问。而我们之前的普通变量,
也就是在函数外部声明的变量为:全局变量。
//两个局部变量
function fnList($name)
{
$count = 1;
echo $name.‘第‘.$count.‘次访问‘;
}
fnList(‘蜡笔小新‘);
注意 1:此时的$name 和$count 在外部均不能访问,再执行函数时期局部变量被创建,
而当函数执行完毕后,局部变量则被销毁。
注意 2:函数外部声明的全局变量,并不能在函数内部直接使用,因为默认情况下是无
法访问的,需要做一些设置。
2.全局作用域
在函数外部声明的变量为全局变量,原则上在程序的任意部分均可访问。默认情况下,
程序关闭了在函数内部是的访问权限,需要手动定义开启。
//全局变量
$count = 10;
function fnList($name)
{
//将外部的全局变量授权到此函数
global $count;
echo $name.‘第‘.$count.‘次访问‘;
}
fnList(‘蜡笔小新‘);
注意:如果设置 global 关键字授权权限,那么在函数内部对此变量进行赋值改变后,
外部的变量也更改了,因为他们就是一个变量。
//内部全局变量++
function fnList($name)
{
global $count;
$count++;
echo $name.‘第‘.$count.‘次访问‘;
}
3.超级全局变量
还有一种变量叫做:超级全局变量,有很多种类别,都是以数组形式存在的。这里介绍
一个可以在函数外声明,且无缝访问权限的超级全局变量:$GLOBAL 数组。
//超级全局变量
$GLOBALS[‘count‘] = 1;
function fnList($name)
{
echo $name.‘第‘.$GLOBALS[‘count‘].‘次访问<br>‘;
}
4.静态变量
静态变量即函数被调用多次时,内部的这个变量值不会被销毁丢失。当然,此变量的可
访问范围还是作用域函数内部。
//静态变量适合做计数累计
function fnList($name)
{
static $count = 0;
$count++;
echo $name.‘第‘.$count.‘次访问<br>‘;
}
fnList(‘蜡笔小新‘);
fnList(‘蜡笔小新‘);
fnList(‘蜡笔小新‘);
二.垃圾收集
PHP 使用引用计数和写时复制来管理内存。引用计数保证了不再需要时将内存释放给操
作系统;而写时复制则保证了变量间复制不浪费内存。由于涉及到 PHP 底层的一些知识,
对于初学者理解起来也较为困难,故不展开说明。
除了系统自动销毁和回收变量,我们也可以手动去进行操作。
//检测变量是否存在
$name = ‘张三‘;
echo isset($name);
//销毁变量
$name = ‘李四‘;
unset($name
代码重用
1.降低成本
在第一次开发项目系统时,项目中的所有代码都是第一次开发。而在这个项目中,如果
用到相同的代码,我们可以把它包装成函数放在一个公共的文件中去,通过包含文件引入到
需要使用这个函数的文件内,直接调用。而当下次一次项目中,这些公共文件和通用函数,
可以直接拿过来使用,成本随着项目的累积而逐步降低。
//tool.php 文件
function fnList($pi, $r)
{
return $pi * $r * $r;
}
//引入文件后调用
require ‘tool.php‘;
echo fnList(3.14, 20);
2.可靠性
如果一种功能代码在程序中已经使用,但随着需求的深入,增加一些代码或修复一些缺
陷。但这种重构的可靠性就略显低下,如果将这个功能性代码包装成函数,并进行一定程序
的完善。届时,在后面项目中直接使用的话,它的可靠性是非常高的。
3.一致性
如果已经包装好的函数,并在项目中已有使用。但随着功能的扩展,需要重构函数时,
最早期调用函数的对外接口能够保持调用的一致性。
//增加周长,但并不会影响面积的调用方式
function fnList($pi, $r, $d = false)
{
if ($d) {
//返回周长
return $pi * $r * 2;
} else {
//返回面积
return $pi * $r * $r;
}
}
4.递归函数
这里补充一个函数方式:递归函数。这个函数并不是新的语法,只是普通函数的一种使
用策略:自己调用自己。递归函数和循环类似,都是重复的做一些事情。
//递归累加
function fnNum($num)
{
if ($num == 0) {
return 1;
} else {
return $num + fnNum($num - 1);
}
}
标签:php 基础
原文地址:http://8818968.blog.51cto.com/8808968/1978957