PHP(六)函数

当程序代码多了之后,用函数来组织这些程序。PHP最初的设计原则是用函数来组织程序,以让一段代码造成一个”程序模块“,无论在什么地方使用这些函数时,便可调用函数,省去了重复编写代码的麻烦,也方便了代码的审阅、修改和完善。
php

如何使用函数

函数相似于一个黑盒。放入须要的东西,返回给你结果。html

”函数名()“能够调用函数。mysql

系统(内置)函数

PHP有不少标准的函数,这些函数分为两部分,一部分是核心函数,例如字符串和变量函数,在PHP安装后,默认就有。还有一些函数须要和特定的PHP扩展模块一块儿安装,不然在使用它们的时候就会获得一个致命的”未定义函数“错误。例如,要使用图像函数imagecreatetruecolor(),须要在安装PHP的时候加上GD(一个图像处理库)的支持。或者,要是用MySQL数据库的链接函数mysql_connect(),就要在安装PHP的时候加上MySQL数据库的支持。要知道当前你是用的PHP有哪些函数,能够调用phpinfo()函数或者get_loaded_extensions()函数获得PHP加载了哪些扩展库。sql

对于默认就是有效的函数库,PHP手册中的函数参考章节按照不一样的扩展库组织了它们的文档。数据库

自定义函数

函数以关键字function开头,而后是空格,紧接着是本函数的函数名称,接着是一对括号,括号里面是函数参数,括号后面是大括号,和其中的内容,叫函数体,即实现函数功能的代码,大括号用来界定函数代码的范围,代表其内的代码属于此函数,最后一句能够有return语句,这代表函数返回结果。
数组

在目前的PHP版本中,函数具备全局属性,也就是说在定义一个函数以后,能够在程序的任何地方使用,定义函数的位置能够在程序的任何地方,甚至能够放在另外一个函数的内部。函数

函数参数

函数的参数是用来和函数沟通的途径,参数以逗号做为分隔符。
ui

调用函数时,须要给参数传值,传值有3种方式:spa

  • 按值传递设计

  • 引用传递,把变量的值赋给参数,那个变量的值会随参数的改变而改变,格式是在参数前加一个&

  • 默认值,在定义函数参数的时候就给它设定一个默认值,若是调用函数时没有给参数,那么便会使用它的默认值,若是给了,就会使用给定的参数值。默认值必须是常量表达式,不是变量、类成员,或者函数调用等。在函数参数使用默认值的时候,若是有多个参数,那么须要将有默认值的参数放在任何非参数默认值的右边,否则会报错。

返回值

函数值经过使用可选的返回语句返回。一般使用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的值依旧存在。

函数生存期的例子:不推荐在函数中定义函数,一旦这样的话,上层函数就只能调用一次,由于不能重复定义函数中的那个函数。

相关文章
相关标签/搜索