函数,从数学的角度来说就相当于 y=ƒ(x) 表达式,其中:x 相当于函数的参数,y 就是函数的返回值。对于 PHP 来说,函数同样也有参数和返回值的概念,除此之外,还有 函数名作用域 等概念,本节教程就带你认识 PHP 中的函数,如何定义,如何使用。

conception

函数的概念

函数就是有一定功能的代码组织在一起的一种形式,在 PHP 中,我们大多会使用自己定义的 自定义函数,或直接使用系统提供的 内置函数。虽然函数的概念很抽象,但是也不是很难理解。比如你在网上点餐,点的什么吃的,需要支付多少钱,配送地址和配送时间都可以抽象为函数的参数;而函数的返回就是在规定的时间配送员送上来的热气腾腾的饭菜。

在 PHP 中,大部分函数是有名字的,(没有名字的叫匿名函数或回调函数,在后面的章节中会讲解。)我们称之为调用函数或命名函数。他们每一个函数体都是独立于其他函数的,互相不干预,不起冲突。最后,他们会返回这个函数的计算结果给外界,这就是函数的基本概念。

那么为什么要使用函数呢?在面向对象设计模式中,函数和对象是必不可少的两个重要元素。函数与函数之间的配合,可以将复杂的代码抽离出具有独特功能的代码块。可以提高程序的 可读性,重用性,和开发效率

下面我将带领大家一起学习 自定义函数 的声明以及调用方法。

definition

声明自定义函数

PHP 给我们提供了超级多的内置函数供我们使用,但是没法应对复杂多变的需求。所以我们就会在内置函数满足不了的情况下编写能够实现指定功能的自定义函数。一个函数的声明方式如下:


function 函数名 (参数1, 参数2, ...参数n)
{
	函数体;
	return 返回值;
}
		
  • 我们一般称第一行的结构为“函数头”,它是由关键字 function 后跟 函数名称参数列表 组成。其中,参数列表可以省略,就是说这个函数可以不接受任何参数。

    即使参数可以全部省略,函数名后的括号 () 也不可不写。

  • 在一个域内(可以暂时先理解为同一个文件内)不能有同名的函数出现,函数并不像变量一样可以覆盖声明。如果声明了重复的函数名,会抛出致命错误。

  • 这个函数的所有逻辑将会写在函数头下面的函数体内,也就是 {} 内。在函数体内的结尾会使用 return 关键字将函数体内的任何值返回。当然,你也可以不返回任何值,甚至你也可以不写函数体,声明一个空函数(估计很少这么做吧)。

  • 基于 return 控制语句的特性,在函数体内所有声明在 return 之后的代码将不会执行。会直接将要返回的值返回给调用者,调用者会继续之后的代码逻辑。

所以,以下几种声明函数的方式都是正确的:


// 没有参数列表
function 函数名()
{
	函数体;
	return 返回值;
}
// 没有返回值
function 函数名(参数1, 参数2, ... 参数n)
{
	函数体;
}
// 除了名字什么都没有(无意义)
function 函数名() {}
		

举个例子:比如我想输出 1 到 100 的所有数字,如果使用以前 for 循环的例子,只需要把 $i >= 10 改为 100 就行了。但是我想输出 1-100 300-700 和 900-1000 怎么办呢?难道要写三遍 for 循环吗?当然不是!我们可以定义一个输出自定义序列的函数,然后重复调用它,只需要传递不同的参数就行,像这样:


// 创建这个自定义函数
function getNumList($start, $end)
{
	for ($i = $start; $i <= $end; $i++) {
		echo $i;
	}
}
// 重复调用 实现效果
getNumList(1, 100);
getNumList(300, 700);
getNumList(900, 1000);
		

这样就可以调用 getNumList() 这个函数来输出任何范围的数字序列了,而且不用写很多代码。是不是验证了函数的 复用性提高开发效率 的特性呢?

use function

调用函数

在上面的示例中,你已经看到了如何调用一个自定义函数。在这里需要注意的是,如果我不主动调用的话,这个函数是 永远不会 执行的。我来总结一下函数的调用特性:

  1. 只需声明一次,使用几次,就调用几次。
  2. 特殊情况 外,函数无需在调用之前被定义。
  3. 如果不传递函数规定必传的参数,会导致函数报错。

在一个作用域内,一个函数只要定义了,就可以在任何地方被调用。无论调用的地方是在这个函数被声明之前还是之后。


// 输出 300-700 字符串 不会报错
getNumList(300, 700);

function getNumList($start, $end)
{
	for ($i = $start; $i <= $end; $i++) {
		echo $i;
	}
}
// 输出 1-100 字符串
getNumList(1, 100);
		
特殊情况

如果某个函数被声明在了条件语句里,那就必须要在这个函数声明之后调用该函数了。比如这个例子:


$defined = false;

// 此时程序会报错 找不到 wowphp 这个函数
echo wowphp();

if ($defined) {
	function wowphp() {
		return "Can I do something?";
	}
}

if ($defined)
	// 此时可以调用 wowphp 这个函数
	echo wowphp();
		

函数里可不可以写函数呢,当然可以!但是调用的时候也要先调用最外面一层的函数,才能调用外部函数体内的子函数,像这样:


function wow()
{
	function php()
	{
		return 'wowphp!';
	}
}

// 想要调用 php() 就必须先调用 wow()
wow();
// 此时可以调用 php()
echo php();
		
	

请登录

WOWPHP 账号登录 GitHub 账号登录

还没有账号?现在去注册一个~