1.定义函数
PHP中,函数使用关键字function来定义,通常由函数名称、参数、函数体和返回值4部分组成。自定义函数的语法格式如下:
function 函数名称([参数1,参数2,参数3……]){
函数体;
return 返回值;
}
上述语法格式中:
l 函数名称,用来标识某个函数,PHP中不允许函数重名。函数名只能包含数字、字母、下划线,且不能用数字开头。函数名不区分大小写。
l 参数,作用是使函数外部能够向函数中传递数值。可以没有,也可以有一个或多个。
l 返回值,作用是在函数执行成功后,将执行结果返回给函数外部。可以使任何数据类型,也可以没有返回值。
l 函数体,该函数的执行规则,任何有效的PHP代码都可以出现在函数体中。函数体内也可以调用PHP内置函数或者其它自动以函数。
示例:
自定义一个函数,该函数实现的功能是计算n的阶乘。代码如下:
<?php
function nRecursion($n){
$s = 1;
for($i=1;$i<=$n;$i++){
$s=$s*$i;
}
return $s;
}
var_dump(nRecursion(4)); // 调用函数 输出:int(24)
?>
2.函数的调用方法
在PHP中,可以直接使用函数名进行函数的调用。如果函数带有参数,调用时需要传递相应参数。调用系统内置函数和自定义函数的方法都是相同的。语法如下:
function 函数名([参数1,参数2,参数3……]);
以下调用函数round()的示例,round()是PHP内置函数,其语法格式如下:
float round(float $var[,int $precision])
该函数的功能、参数和返回值的含义:
l 功能: 实现对浮点数进行四舍五入的功能,并可以指定从浮点数的位置开始进行四舍五入。
l 参数: 该函数有两个参数,分别是var和precision。参数的含义是从浮点数var的第precision个长度的位置开始进行四舍五入。中括号标识可选参数。
l 返回值:该函数返回值的类型是float型。
<?php
$floatNumber = 725.386;
echo "原浮点数为:".$floatNumber."<br />";
$result1 = round($floatNumber); // 725
echo "从小数点处进行四舍五入的结果为:".$result1."<br />";
$result2 = round($floatNumber,2); // 725.39
echo "从小数点后两位处进行四舍五入的结果为:".$result2."<br />";
$result3 = round($floatNumber,-2); // 700
echo "从小数点前两位处进行四舍五入的结果为:".$result3;
?>
如果调用一个不存在或错误的函数,系统报错,可根据报错信息进行排错。
l 检查该函数是否正确存在与PHP文件中。
l 检查函数名称拼写是否正确。
l 还有可能是所调用的函数是PHP扩展的一部分,而该部分并没有被载入。
二、函数的返回值
函数成功执行后,可通过return语句将结果返回给函数外部。函数返回值可以使任何数据类型,也可以是数组或者对象。若不需要返回值,则可省掉return语句。
1.单一返回值
使用return语句可以且只能返回一个值,在return语句执行后,整个函数的运行终止。
以下是通过函数计算两个数乘积并返回其结果的例子,代码如下:
<?php
function multiplication($a,$b){
$result = $a * $b;
return $result;
}
echo "3 * 10 = ".multiplication(3,10);
?>
2.多返回值
如果需要函数返回多个值时,可以通过数组的形式来得到多个返回值。示例如下:
<?php
function number(){
Return array(1,2,3);
}
list($one,$two,$three)=number(); // list函数把数组中的值赋给一些变量
echo "$one是".$one."<br />";
echo "$two是".$two."<br />";
echo "$three是".$three."<br />";
?>
三、函数的重要元素——参数
所谓参数,就是在函数声明的圆括号内的变量或常量,同通过参数向函数传递信息。
1.参数的声明方式
参数是一个用逗号作为分隔符的表达式列表,如果参数不存在则参数列表为空。在PHP中,声明参数时不需要指定该参数的数据类型,它可以自动识别变量类型,然后对其做相应操作。
比如,以下函数可以计算两个数的最大公约数,在声明时只需在括号内定义两个变量即可。
<?php
function divisor($m,$n){
if($m%$n==0){
return $n;
}else{
return divisor($n,$m%$n);
}
}
$a = 12;
$b = 8;
$result = divisor($a,$b);
echo $a."和".$b."的最大公约数为:".$result; // 12和8的最大公约数为:4
?>
2.参数的默认值
PHP中允许将参数定义成C++风格的默认值,也就是说允许实参与形参个数不同,实现的方法是在形参列表中对一个或几个形参指定默认值,该默认值必须为常量表达式。默认参数必须放在非默认参数的右侧,否则可能会得到与预期不同的执行结果。
比如,程序中参数b含有默认值,而参数a和c没有默认值,代码如下:
<?php
function printVar($a,$b=10,$c){ // 默认参数$b没在非默认参数右侧,故报错
echo "a = $a b = $b c = $c";
}
$a = 1;
$c = 3;
echo printVar($a,$c);
?>
【PHP中不带可以使用数值类型作为默认参数,还允许使用数组,特殊类型NULL做默认参数。】
3.参数的两种传递方式—值传递和引用传递
在PHP中,参数有两种传递方式,分别是值传递和引用传递。值传递是将要传递的值作为一个副本进行传递;而引用传递则是引用对象的内存地址。
① 值传递
参数在调用函数前后不发生改变,传给函数的只是这个参数的值。即在传递参数时函数范围内对这些值的改变都在函数外被忽略掉。PHP中除对象类型外,其它类型的参数传递方式都是值传递。
下面是一个使用值传递方式来增加变量的示例,代码如下:
<?php
function change($number){
$number = $number +1; // 是变量$number的值增加1
echo "函数内部/$number的值为:".$number."<br />"; // 内部变量11
}
$number = 10;
change($number); // 调用change()函数
echo "函数外部/$number的值为:".$number; // 显示函数外部变量$number
?>
② 引用传递
如果要在函数内部修改参数值,且函数的外部也能同时改变该参数值,可以使用引用传递。引用传递参数的方式为在参数前面添加“&”符号。
在引用传递方式中,当参数传给函数时,函数不会再创建一个新变量,而是直接获得一个原有变量的引用。可以像使用其他变量一样使用引用变量,其区别在于:不是获得变量本身的值,而是指向原来的值。任何对该引用的修改都会影响到原始变量值。
下面是一个通过引用传递来增加变量值的示例,代码如下:
<?php
function change($number){
$number = $number +1;
echo "在函数内部/$number的值为:".$number."<br />"; // 显示内部值11
}
$number = 10;
chang(&$number); // 调用chang()函数
echo "在函数外部/$number的值为:".$nubmer; // 显示外部$number的值11
?>
四、函数的作用域
PHP中,函数的作用域用来控制函数及函数中变量在哪里是可见并且可用的。不同的编程语言有不同的变量作用域规则,PHP中的函数及函数中的变量作用域规则如下:
l 函数的作用域 指在函数内部声明的变量作用域是从声明的那条语句开始是到函数的末尾。
l 全局作用域 指在函数外部声明的变量作用域是从那条语句开始到声明所在的文件末尾。
l 使用关键字global或$GLOBALS[]数组可以手动指定一个函数中使用的变量为全局变量。
l 通过参数列表传递给函数的变量,对于函数来说是局部变量,但是在传递时带有引用符号(&)的除外。
l 可以使用unset()函数手动删除一个变量,该变量也在其作用域内同时被销毁。
l 使用require()和include()这两个函数并不会影响到作用域。如果它们用于函数内部,则函数作用域适用。如果它们不在函数内部,则全局作用域适用。
示例代码如下:
<?php
$price = 0; // 定义全局变量
function sale($price){
$price = 100; // 定义局部变量
$newPrice = $price*0.95; // 促销商品为9.5折
echo "商品的原价为:".$price."<br />";
return $newPrice; // 返回变量$newPrice的值
}
echo "商品的折扣价为:".sale($price)."<br />";
echo "商品的原价为:".$price;
?>
五、变量函数
PHP支持变量函数的概念,如果一个变量名称的后面带有圆括号,例如:$var()、$variable()等,虽然这些变量名称并不是一个合法的函数名称,但是类似的函数调用却可以正确执行。因为PHP可以去除保存在$var变量中的值,在程序中寻找相同名称的函数,然后尝试调用执行该函数,这就是变量函数的工作原理。
下面是一个使用变量函数实现计算某长方形面积的功能,代码如下:
<?php
function caculate($length,$width){
$area = $length * $width;
echo "长方形的长为:".$length."<br />";
echo "长方形的宽为:".$width."<br />";
echo "长方形的面积为:".$area."<br />";
}
$length = 10;
$width = 5;
$myFunction = "caculate";
$myFunction($length,$width);
?>
变量函数的优点是可以增加程序的灵活性,但是滥用变量函数会降低PHP代码的可读性,使程序逻辑变得难以理解,为代码的维护带来极大的困难,甚至可以引发一系列的安全问题。所以在编程中应该尽量少用或者避免使用变量函数。
六、PHP内置函数
PHP内置函数非常丰富,涉及到Web开发的各个方面。如:工具函数、数学函数、日期函数、文件包含函数等。
1.工具函数
主要指一些在开发过程中经常使用的函数,它们很具通用性。如:exit()函数可以终止程序运行,empty()可以检测变量是否为空值等,都统称为工具函数。
(1)die() 和 exit()
其实die() 和 exit()两个函数在PHP中指向的是同一个函数,die() 是 exit()函数的别名。
函数exit()语法如下:
void exit([string $status])
如果参数status是字符串,则该函数会在退出前输出字符串;如果参数status是整数,这个值会被用作退出状态。退出状态的值在0~254之间,状态0用于成功终止程序。exit()函数没有返回值。
下面是使用exit()函数提前中止函数的示例,代码如下:
<?php
$var = "PHP开源技术";
echo $var;
exit(0); // 终止函数,其后的部分不被执行
echo "这句话没有执行"; // 仅输出:PHP开源技术
?>
(2)empty()
empty()函数用于检查是否为0值或者空值,如果变量为0或者空值则返回true,否则返回false。使用false。使用该函数检测变量时,在“”、0、“0”、NULL、FALSE、array()、$var等情况下都将被认为是空的。其语法格式如下:
bool empty(mixed $var)
参数var用来指定要检测的变量名称。下面是empty()函数的示例,代码如下:
<?php
$var = "PHP笔记";
if(empty($var)){ // 判断变量$var是否为空值
echo "/$var为0或者空值<br />";
}else{
echo "/$var的值为/"".$var."/"<br />";;
}
$null = "";
if(empty($null)){ // 判断变量$null是否为空值
echo "/$null为0或者空值<br />";
}else{
echo "/$null的值为/"".$null."/"<br />";
}
$zero = 0;
if(empty($zero)){ // 判断变量$zero是否为空值
echo "/$zero为0或者空值<br />";
}else{
echo "/$zero的值为/"".$var."/"<br />";
}
?>
(3)iset()和unset()
isset()函数使用于检测是否已经为变量设定值,如果改变量已经设定值则返回true,否则返回false。其语法如下:
bool isset(mixed $var);
参数var用来指定要检测的变量名称。
unset()函数用于将已经被赋值的变量删除,使改变量成为一个没有赋值的变量,该函数的返回值永远为true,其语法格式如下:
void unst(mixed $var)
参数var用来指定要检测的变量名称。下面是使用isset()函数提前终止函数的示例,代码如下:
<?php
$var1 = $variable;
$var2 = null;
if(isset($var1)){
echo "/$var1和/$var2已经被设定值";
}else{
echo "/$var1和/$var2没有被设定值";
}
?>
(4)settype()
settype()函数是用来设置变量类型的,如果设置变量成功该函数会返回true,否则返回false。settype()函数的语法格式为:
bool settype(mixed & $var,string $type)
l var:指定需要设置数据类型的变量名称。
l type:指定需要设置的数据类型,该参数可取值如下:
参数值 | 说 明 |
boolean | 表示布尔类型 |
integer | 表示整型 |
float | 表示浮点型 |
string | 表示字符串类型 |
array | 表示数组类型 |
object | 表示对象类型 |
null | 表示空 |
下面是使用settype()函数为变量设置数据类型的示例,代码如下:
<?php
$php = "PHP技术";
echo "/$php的原值为:".$php."<br />";
settype($php,"integer");
echo "/$php的新值为:".$php;
?>
(5)is_bool()
is_bool()函数可用来检测某变量是否为布尔型,如果变量为布尔类型时该函数会返回true,否则返回false,其语法格式为:
bool is_bool(mixed $var)
参数var用来指定需要检测的变量名称。
下面是使用is_bool()函数来检测变量是否为布尔类型的示例,代码如下:
<?php
$php = true;
if(is_bool($php)){
echo "/$php是布尔型的";
}else{
echo "/$php不是布尔类型的";
}
?>
与is_bool()函数类似,PHP变量函数库中还提供了许多以“is_”为前缀的其它数据类型检测函数,例如:要检测某变量是否为字符串类型时,可以使用is_string()函数;而要检测某变量是否为浮点数类型时,可以使用if_float()函数。
2.数学函数
数学函数主要用来进行长整型和浮点型数据的计算,在函数中使用的数据精度不能超过长整型和浮点型这两个范围。
PHP中常用的数学函数如下表。在使用数学函数时,只要弄清函数的作用和参数,就可以灵活地使用这些PHP自带函数进行各种数学运算。
PHP常用数学函数
函数格式 | 功能描述 |
mixed abs(mixed $number) | 求参数number的绝对值 |
float acos(float $arg) | 求参数arg余弦值所对应的弧度值 |
float cos(float $arg) | 求参数arg的余弦值 |
float asin(float $arg) | 求参数arg正弦值所对应的弧度值 |
float sin(float $arg) | 求参数arg的正弦值 |
float atan(float $arg) | 求参数arg正切值所对应的弧度值 |
float atan2(float $y,float $x) | 同atan()相似,按输入参数的的正负决定输出值所在象限 |
float tan(float $arg) | 求参数arg的正切值 |
sting base_convert(string $number,int $frombase,int $tobase) | 求number的基数从frombase转换为tobase |
int bindec(string $binary_string) | 将二进制转换为十进制 |
string decbin(int $number) | 将十进制转换为二进制 |
int hexdec(string $hex_string) | 将十六进制字符串转换为十进制整数 |
int octdec(string $octal_string) | 将八进制字符串转换为十进制整数 |
string dechex(int $number) | 将十进制整数转换为十六进制字符串 |
string decoct(int $number) | 将十进制的整数转换为八进制字符串 |
float exp(float $arg) | 计算指数为arg,底数为E的幂 |
float pow(float $base,float $exp) | 计算底数为base,指数为exp的幂 |
int floor(float $number) | 返回小于等于number的最大整数 |
double round(double $val[,int $precision]) | 将val四舍五入 |
int ceil(float $number) | 返回大于等于number的最小整数 |
int getrandmax(void) | 返回rand()函数能产生的最大随机数 |
int rand([int $min],[int $max]) | 产生一个在min和max之间的随机数 |
void srand(int $seed) | 用整数seed给随机数产生器设置启动源 |
float log(float $arg) | 以E为底计算arg的对数 |
float log10(float $arg) | 以10为底计算arg的对数 |
mixed min(mixed $arg1,mixed $arg2,mixed $argn) | 计算所给参数中的最小值 |
mixed max(mixed $arg1,mixed $arg2,mixed $argn) | 计算所给参数中的最大值 |
string number_format(float $number,int $decimals,string $dec_point,string $thousands_sep) | 将浮点数number按格式输出 |
double pi(void) | 返圆周率值 |
float sqrt(float $arg) | 返回arg的平凡根 |
|
|
下面是部分数学函数的应用示例,代码如下:
<?php
$float = 7.16;
Echo "/$float的值为:".$float."<br />"; // $float的值为:7.16
Echo "四舍五入取整数为:".round($float)."<br />"; // 四舍五入取整数为:7
Echo "去尾取整数为:".floor($float)."<br />"; // 去尾取整数为:7
Echo "进位取整数为:".ceil($float)."<br /><br />"; // 进位取整数为:8
$int = 1234;
Echo "/$int的值为:".$int."<br />"; // $int的值为:1234
Echo "转换成十六进制的值为:".dechex($int)."<br />"; // 转换成十六进制的值为:4d2
Echo "转换成八进制的值为:".decoct($int)."<br />"; // 转换成八进制的值为:2322
Echo "转换成二进制的值为:".decbin($int)."<br /><br />";
// 转换成二进制的值为:10011010010
?>
注:在PHP中提供两种方法可以获取圆周率的值,他们分别为:
l 使用数学常量M_PI来表示圆周率。
l 使用pi()函数来表示圆周率。
3.日期函数
日期函数中定义了有关日期的所有相关函数,通过这些函数可以进行日期的修改、更新与、格式化输出。
(1)time()
time()函数可以用来获取当前的时间戳,其中时间戳是指从公元1970年1月1日开始到当期那时间的秒数。time()函数能够以整型形式返回当前的UNIX时间戳,其语法格式如下:
int time(void)
注:
公元1970年1月1日也被成为UNIX纪元,使用UNIX保存日期和时间,可以避免产生著名的千年虫问题。在Windows操作系统中同样使用UNIX纪元来保存日期和时间。
(2)mktime()
mktime()函数可以返回一个日期的UNIX时间戳。mktime()函数与date()结合使用对于日期运算和验证是非常有用的,它可以自动校正越界的输入。其语法格式如下:
Int mktime([int $hour[,int $minute[,int $second[,int $month[,int $day[,int $year]]]]]])
上述语法中涉及到的说明如下。
l hour:用来指定小时。
l minute:用来指定分钟。
l second:用来指定秒数。
l month:用来指定数字表示的月份。
l day:用来指定日期。
l year:用来自动那个年份。
该函数的参数可以按照从右向左的顺序省略,任何省略的参数都回被设置成本地日期和时间的当前值。
(3)date() 和 mgdate()
date() 和 mgdate()这两个函数都能将时间按照某种格式以字符串的形式输出。date() 函数是按照本地事件输出日期的,而mgdate()函数则是按照格林威治时间输出日期的。date() 和 mgdate()的语法格式如下:
String date (string $format [,$timestamp])
String gmdate(string $format [,$timestamp])
上述语法中涉及到的参数说明如下:
l Format:指定日期的输出格式。
l Timestamp:指定一个UNIX时间戳,如果没有给出该参数,则默认为本地当前时间的时间戳。
日期输出格式
参数 | 描 述 |
a | 以am或pm表示上午或下午 |
A | 以AM或PM表示上午或下午 |
d | 使用两位数字输出日期值,范围从01到31 |
D | 使用3个字符表示星期值,例如:Fri |
F | 使用英文单词全名显示月份,例如:January |
h | 使用12小时制输出小时数,范围从01到12 |
H | 使用24小时制输出小时数,范围从00到24 |
g | 使用12小时制输出小时数,但不补零,范围从1到12 |
G | 使用24小时制输出小时数,但不补零,范围从0到24 |
i | 输出分钟数,范围从0到59 |
j | 输出日期值,但不补零,范围从1到31 |
l | 使用英文单词全名表示星期值,例如:Friday |
L | 输出0表示不是闰年,输出1表示是闰年 |
m | 使用两位数输出月份值,范围从01到12 |
n | 输出月份值,但不补零,范围从1到12 |
M | 使用3个字母的简称输出月份值 |
s | 输出秒数,范围从00到59 |
S | 输出秒值时带上英语后缀,例如:th和nd |
t | 输出所在月份的天数,范围从28到31 |
U | 输出从公元开始到现在的时间,以秒值表示 |
w | 使用数字表示星期值,范围从0(表示星期日)到6(表示星期六) |
y | 使用两位数表示年份,例如:10 |
Y | 使用四位数表示年份,例如:2010 |
z | 输出一年中第几天,范围从0到365 |
举一个具体的date()函数的应用例子,代码如下:
<?php
echo "date()函数的应用为:".date("Y年n月j日 H:i:sa")."<br />";
echo "gmdate()函数的应用为:".gmdate(Y年n月j日H:i:sa)."<br />";
?>
(4)getdate()
getdate()函数可用于获得时间及日期信息。getdate()函数的语法格式如下:
array getdate([int $timestamp])
参数timestamp用来指定UNIX时间格式中的时间。如果没有给出时间戳,则默认为是本地当前时间的时间戳。
getdate()函数根据时间戳值timestamp返回各种时间标记值到数组中,数组中的元素及其对应值如表:
getdate()返回的数组值
参数 | 描 述 |
seconds | 秒的数字表示,范围从0到59 |
minutes | 分钟的数字表示,范围从0到59 |
hours | 小时的数字表示,范围从0到23 |
mday | 当月第几天的数字表示,范围从1到31 |
wday | 当周第几天的数字表示,范围从0(表示周日)到6(表示周六) |
mon | 月份的数字表示,范围从1到12 |
year | 年份的完整4位数字表示,例如:2010 |
yday | 当年第几天,范围从0到365 |
weekday | 星期的英文单词,例如:Friday |
month | 月份的英文单词表示,例如:January |
0 | 自从UNIX纪元开始至今的秒数,和time()的返回值及用于date()的值类似 |
举一个具体的getdate()函数应用示例,代码如下:
<?php
$today = getdate();
print_r($tody);
?>
输出结果:
Array ( [seconds] => 5 [minutes] => 18 [hours] => 9 [mday] => 16 [wday] => 2 [mon] => 3 [year] => 2010 [yday] => 74 [weekday] => Tuesday [month] => March [0] => 1268702285 )
(5)checkdate()
checkdate()函数是用来检查日期是否有效,其语法格式如下:
bool checkdate(int $mounth,int $day,int $year)
上述语法中涉及到的参数说明如下:
l mouth:指定要检查的日期的月份。
l day:指定要检查的日期。
l year:指定要检查的日期的年份。
使用checkdate()函数检查日期的格式,若日期是有效的则返回true,若日期有问题则返回false。该函数可以用来检查日期是否是有效的范围值,如表所示:
参数 | 范 围 |
年 | 0至32767 |
月 | 1至12月 |
日 | 随着月份及闰年变化 |
举一个具体的checkdate()函数应用例子,代码如下:
<?php
$month = 5;
$day = 33;
$year = 2010;
$boolean = checkdate($month,$day,$year);
if($boolean==true){
echo "该日期的格式是正确的。";
}else{
echo "该日期的格式是错误的。";
}
?>
(6)文件包含函数
在实际项目开发中,通常根据业务逻辑编写的一些工具类或函数都保存在独立的文件中,然后根据需要在使用文件包含函数时将相关类或函数引入。
1) include()与include_once()
使用include()函数可以在指定的位置包含一个文件,当一个文件被包含时,其中所包含的代码和include()函数所在行具有相同的作用域,即调用文件在该行处可用的任何变量在被调用文件中也都可用。
例如,有两文件分别为“const.php”和“include.php”,代码如下:
const.php
<?php
$OK = 1;
$ERROR = 0;
?>
include.php
<?php
include"const.php";
echo "OK的值为:".$OK."<br />";
echo "ERROR的值为:".$ERROR;
?>
include_once()和include()函数类似,不同的是,使用include_once()函数在包含文件时,如果该文件中的代码已经被包含了,则不会再次包含。include_once()函数应用于脚本执行期间同一个文件有可能被包含超过一次的情况下,以确保它只被包含一次,从而避免出现函数从定义、变量重新赋值等问题。
2) require()和require_once()
require()和include()函数除了在错误处理方式上不同,功能上几乎完全一样。当包含文件失败时,require()函数就会抛出一个致命错误并中止程序的执行,而include()函数则只会抛出警告信息并继续执行程序。
require_once()和include_once()函数功能类似,他在包含文件之前也会先检查当前文件是否被包含过,如果该文件被包含了,该文件就会被忽略,而不回被再次包含。Require_once()函数应用于脚本执行期间相同一个文件有可能被包含超过一次的情况下,以确保它只被包含一次,从而避免出现函数重定义、变量重新赋值等问题。
3) eval()
eval()函数与include()函数比较相似,其区别在于eval()函数可以动态执行PHP代码,而include()函数无法完成这样的功能。
比如,使用eval()函数将字符串“exit();”作为PHP代码来执行,代码如下:
<?php
$string = "exit()";
eval($str);
echo "这条语句不会被执行!";
?>
该程序在echo语句执行前就已经结束了,所以什么也没有输出。
尽管eval()函数非常有用,但是,由于使用eval()函数时代码的执行效率十分低,所以应该尽量避免使用eval()函数。
注:
在处理用户输入的功能时(比如,表单等),切记严禁直接使用eval()函数,因为它允许用户去执行任意代码,从而引起严重的安全性问题。