前面,我们已经使用过不少PHP中定义的内置函数,使用这些函数,我们可以完成很多基础工作,但在软件开发过程中,我们经常会封装一些自己的代码,以完成特定的工作。在PHP中,封装代码主要有两种基本方法,使用自定义函数和创建类(class);本节,我们将介绍如何创建自己的函数,在下一章,将专门介绍与类相关的内容。
首先,在我们需要定义一个函数之前,可以使用function_exists()或is_callable()函数判断函数名是否已存在,参数是一个有效的函数名称,函数存在时返回true,否则返回false。如下面的代码。
var_dump(function_exists('substr')); // 显示 bool(true),即函数名存在
在使用PHP内置函数时,我们可观察到这些函数的命名规则是都使用小写字母,每个单词使用下划线进行连接;为了区分内置函数和自定义函数,我们约定:自定义函数名称不使用下划线,而是采用首字母小写,然后每个单词首字母大写的形式。
创建函数
在PHP中创建函数使用function关键字,一个最简单的函数定义和调用如下面的代码:
function myFirstFunction()
{
echo '我的第一个函数';
}
myFirstFunction(); // 调用函数
代码会显示“我的第一个函数”,这就是一个最简单的自定义函数。
参数与返回值
函数中,参数的概念并不难理解,我们使用参数将需要的数据带入到函数中,根据这些数据进行相应的处理后,就可以返回函数的处理结果;如下面的函数,它的功能就是计算圆的周长。
function getPerimeterOfCircle(radius)
{ returnradius * 2 * M_PI;
}
echo ‘圆的半径为’, $radius, ‘,其周长为’,getPerimeterOfCircle(10); 函数中,我们使用return语句返回计算结果,这也是函数的返回值。本代码运行会显示“圆的半径为10 ,其周长为62.831853071796”。如果你觉得小位数太多,可以使用round()函数进行四舍五入,如下面的代码。
echo round(getPerimeterOfCircle(10), 2); // 显示 62.83
按引用传递参数
有些时候,我们可能需要在函数内对带入的变量进行实际的修改,而此时,参数的定义就应该添加&符号,其含义为参数按引用传递。如下面的代码。
function addOne(&num)
{num++;
}
num1 = 10;
addOne(num1);
echo $num1; // 显示11
如果我们将“&num”修改为“num”,则显示结果就是10;这是因为,在默认情况下,参数带入的是变量的一个副本,对这个副本的操作不会影响变量原有的值。
请注意,如果参数是一个对象,默认情况下就是传递对象的引用,在函数内对象的操作都会实际反映到原对象上,下面的代码演示了这一点,大家先看一下,从下一章开始,我们详细介绍面向对象编程后,这些代码就非常容易理解了。
class CTest
{
public num;
}
function addOne(CTestobj)
{
obj->num++;
}obj = new CTest();
obj->num = 10;
addOne(obj);
echo $obj->num; // 显示11
CTest是一个类,而obj同是一个CTest类的实例(即对象),addOne()函数会对CTest对象中的num成员进行加1操作。
利用参数的按引用传递特性,我们还可以实现一个函数返回多个结果的功能,如下面的代码。
function func(str, &sum)
{
count = strlen(str);
num_count = 0;sum = 0;
for(i=0;i<count;i++)
{
if(is_numeric(str{i}))
{
num_count++;sum+=intval(str{i});
}
}
return num_count;
}str = 'a5e3k2nki1';
sum = 0;num_count = func(str,sum);
echo '字符串包含', num_count, '个数字,它们的和是',sum;
代码运行结果显示“字符串包含 4 个数字,它们的和是 11”。
我们定义的func()函数,其返回值是字符串中的数字的个数,我们同时通过第二个参数$sum返回了这些数字的和。
可选参数
在定义函数时,如果我们给参数设置了默认值,即它就成为一个可选参数,在调用函数时就可以不指定这个参数;可选参数可以有多个,但它们必须放在参数列表的最后,如下面的代码。
function printInteger(min,max, step=1)
{ for(i=min;i<=max;i+=step) { echoi,',';
}
}
printInteger(1,10); // 显示1,2,3,4,5,6,7,8,9,10,
echo '<br>';
printInteger(1,10,2); // 显示1,3,5,7,9,
关于mixed类型
查看PHP文档时,我们可以看到很多函数或方法返回的类型是混合类型,即mixed;这说明,这些函数和方法返回的类型可以不止一种,比如一个函数需要返回远程资源(如string类型),但是,但远程连接错误时,就可以返回false值来通知调用者。
在我们定义函数时,并不需要指定函数的返回值,但是,我们在项目中还是应该对函数的返回值类型做出约定,以便正确调用。