当程序代码多了以后,用函数来组织这些程序。PHP最初的设计原则是用函数来组织程序,以让一段代码形成一个”程序模块“,不管在什么地方使用这些函数时,即可调用函数,省去了重复编写代码的麻烦,也方便了代码的审阅、修改和完善。
函数类似于一个黑盒。放入需要的东西,返回给你结果。
”函数名()“可以调用函数。
PHP有很多标准的函数,这些函数分为两部分,一部分是核心函数,例如字符串和变量函数,在PHP安装后,默认就有。还有一些函数需要和特定的PHP扩展模块一起安装,否则在使用它们的时候就会得到一个致命的”未定义函数“错误。例如,要使用图像函数imagecreatetruecolor(),需要在安装PHP的时候加上GD(一个图像处理库)的支持。或者,要是用MySQL数据库的连接函数mysql_connect(),就要在安装PHP的时候加上MySQL数据库的支持。要知道当前你是用的PHP有哪些函数,可以调用phpinfo()函数或者get_loaded_extensions()函数得到PHP加载了哪些扩展库。
对于默认就是有效的函数库,PHP手册中的函数参考章节按照不同的扩展库组织了它们的文档。
函数以关键字function开头,然后是空格,紧接着是本函数的函数名称,接着是一对括号,括号里面是函数参数,括号后面是大括号,和其中的内容,叫函数体,即实现函数功能的代码,大括号用来界定函数代码的范围,表明其内的代码属于此函数,最后一句可以有return语句,这表明函数返回结果。
在目前的PHP版本中,函数具有全局属性,也就是说在定义一个函数之后,可以在程序的任何地方使用,定义函数的位置可以在程序的任何地方,甚至可以放在另一个函数的内部。
函数的参数是用来和函数沟通的途径,参数以逗号作为分隔符。
调用函数时,需要给参数传值,传值有3种方式:
按值传递
引用传递,把变量的值赋给参数,那个变量的值会随参数的改变而改变,格式是在参数前加一个&
默认值,在定义函数参数的时候就给它设定一个默认值,如果调用函数时没有给参数,那么便会使用它的默认值,如果给了,就会使用给定的参数值。默认值必须是常量表达式,不是变量、类成员,或者函数调用等。在函数参数使用默认值的时候,如果有多个参数,那么需要将有默认值的参数放在任何非参数默认值的右边,不然会报错。
函数值通过使用可选的返回语句返回。通常使用return语句,任何类型都可以返回,其中包括列表和对象。如果return语句在函数中,那么执行后将会立即停止该函数运行,并将控制权传递回它被调用的行。函数不能返回多个值,但是可以返回一个数组来得到多个值。
同样,函数也可以返回一个调用,这和变量的引用类似,只需要在函数前加一个&,下面举一个例子:
<?php function &returnReference(){ $someReference = "you are hansome"; return $someReference; } $reference = &returnReference(); echo $reference; ?>
变量$reference是函数returnReference返回的一个引用。
栗子:
普通做法:
<?php //设置字符串转换方式:小写(strtolower),大写(strtoupper) $functionName = 'strtolower'; $string = "ABC"; //设置要处理的字符串 //判断用户设置 if($functionName == 'strtolower'){ //调用函数处理 $string = strtolower($string); } ?>
另一种做法,动态调用函数
<?php //设置字符串转换方式:小写(strtolower),大写(strtoupper) $functionName = 'strtolower'; $string = "ABC"; //设置要处理的字符串 $functionName($string); ?>
上面的就是PHP中的动态调用函数,注意第六行,变量后面有圆括号,这意味着PHP将寻找与变量$functionName的值同名的函数,并且将尝试执行它,结果为处理$string的函数是strtolower,如果设置为strtoupper,那么处理$string的函数是strtoupper。
动态调用函数不能用于语言结构,例如echo()、print()、unset()、isset()、empty()、include()、require()及类似的语句,除非将这些语言结构重新用自定义函数包装起来,然后使用包装的函数调用。
下面要说的是变量和函数在文件结构中的作用域以及一些改变其作用域的方法。
局部作用域即只是在某一个区间内有效。
函数内定义的变量无法直接在函数外使用。
函数外定义的变量无法直接在函数内使用。
函数内要使用函数外定义的变量,需在变量前加上关键字global,后面是空格和变量,这样函数内姐可以使用函数外的变量了,如果有多个变量的话,就要使用逗号隔开。
还有一种方法是使用超全局变量来访问具有全局作用的变量,但是通常情况下不这样做。(我现在还不懂这个)
在前面提到过,函数具有全局作用域,也就是定义一个函数,那么该函数可以在程序的任何地方使用。在PHP中,虽然直接在文件开头定义的变量是全局变量,但是在函数中却需要加关键字global才可以使用,但如果有必要可以将变量定义在预定义变量中,因为PHP预定义变量是超全局变量,超全局变量在PHP中任何地方都可以使用,这个特性和函数的特性一样。
举一个例子:
<?php //定义变量$test $test = 'abcd'; //定义函数printVar function printVar(){ echo '在函数printVar内显示的$GLOBALS[\'test\']:'.$GLOBALS['test']; echo "<br>"; } printVar(); echo '直接显示的$GLOBALS[\'test\']:'.$GLOBALS['test']; echo "<br>"; echo '直接显示的$test:'.$test; ?>
效果:
在函数printVar内显示的$GLOBALS['test']:abcd 直接显示的$GLOBALS['test']:abcd 直接显示的$test:abcd
再举一个例子:
<?php //定义变量$test $test = 'abcd'; //定义函数printVar function printVar(){ $wahaha = 'wahaha'; } echo '直接显示的$GLOBALS[\'test\']:'.$GLOBALS['test']; echo "<br>"; echo '直接显示的$GLOBALS[\'wahaha\']:'.$GLOBALS['wahaha']; ?>
运行之后会发现提示“Notice:Undefined index:wahaha in ....”,意思是未定义的索引“wahaha”,“$GLOBALS['wahaha']:”后面没有显示结果。
$test变量没有在任何函数内或者foreach等结构内,所以具有全局属性,这些变量都可以用超全局变量$GLOBAL访问,反之,在函数printVar内定义的变量$wahaha则具有局部属性,只是在函数printVar中才有效,所以不能用$GLOBAL访问
变量和函数放在不同的地方会有不一样的生存期,变量生存期的内容与函数及结构息息相关。
举一个栗子:
<?php function test(){ $a = 0; echo $a; $a++; } test(); test(); ?>
结果是:
00
函数内的$a是一个局部作用域变量,每次调用函数都会将变量$a的值设为0并输出0,将变量自加1的$a++没有作用,因为一旦退出本函数变量$a就不存在了。
那么要将函数内的变量$a保留下来,除了return返回值之外,还可以使用静态变量,在$a前面加上关键字static,之后变量$a的生存期就被改变,不因为调用的结束而结束,当第二次调用该函数时,变量$a的值依旧存在。
函数生存期的例子:不推荐在函数中定义函数,一旦这样的话,上层函数就只能调用一次,因为不能重复定义函数中的那个函数。