码迷,mamicode.com
首页 > Web开发 > 详细

PHP基础

时间:2017-11-04 14:56:27      阅读:236      评论:0      收藏:0      [点我收藏+]

标签: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基础

标签:php 基础

原文地址:http://8818968.blog.51cto.com/8808968/1978957

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!