第6天 函数的使用及有关定义

来源:互联网 发布:2011安全生产事故数据 编辑:程序博客网 时间:2024/06/05 21:11

函数的基本使用


函数定义形式:

function函数名(形参1,形参2,。。。){

//函数体


}


函数调用形式:


本质上就是使用一个名字来达到执行其中函数代码的作用。通常可以分为两种情形的

调用:

1.没有返回值的调用,调用语句是独立语句。

函数名(实参1,实参2,……);//实参个数应该和形参有匹配性。

2.有返回值得函数,则调用语句通常会会在在别的语句中,并将该调用语句

当做一个数据来使用。

A:$v1 =函数名();//赋值给其他变量

B:$v2 =函数名()×3+6//参与运算,然后在赋值

C:echo函数名()

Decho函数名()*3+6 //参与运算在输出

E:$v1 =函数名2(函数名(),实参2,实参3,。。。)//当做实参使用



函数调用流程分析:

1.开始调用,实际参数出数据给形式参数。

2.程序执行流程进入到函数中(一个独立的运行空间),跟全局之星空间是隔离的。

3.按照常规的程序逻辑执行函数中的代码。

4.如果碰到return语句,则终止函数的执行,返回函数开始调用的地方。

5.如果执行导函数的最后位置,同样也会回调到开始调用函数的位置。


函数参数分为形式参数和实际参数。

一个函数子啊定义时,有形式参数。

形参是一个变量名

该变量名只能是在该函数中有效的变量名。

而且只在该函数调用并且执行时有效,函数结束,变量通常销毁。

在调用时,当做实际参数。

实际参数可以是一个直接数据,也可以是一个变量中存储的数据。

实际参数应该和形参有一个11对应的关系。

定义形式:function函数名(形参1,形参2,。。。。){。。。}

调用形式:函数名(实参1,实参2,。。。)


默认值参数:

<?php

#定义一个函数计算圆的面积$pi就是默认参数。function getArea($r, $PI= 3.14){    $result = $r*$r*$PI;    return $result;}$a1 = getArea(1, 3.1416);#计算半径为1 pi3.1416的半径$a2 = getArea(1);#第二次调用时没有传递$PI得值echo "$a1";?>注意:默认值不能使对象或者资源类型。默认值只能是常量表达式,或者常量,不能使变量例如:function f1($v1=3+1){}, function f2($v2 = $v3) 都是错误的函数的参数处安置问题默认都是值传递。引用传递的形参(实参),在函数内部改变其值,在函数外部也会发生修改。


#注意这里&$r是引用传递$m1 = 10;function getArea2(&$r, $PI= 3.14){    $result = $r*$r*$PI;   $r ++;//这里$m1会变成11   return $result;}$a3 = getArea2($m1);echo "m1:$m1";//输出11注意:当某个形参设定为引用传递,此时实参只能使用变量,否则会出现语法错误。


$m1=10;

function getArea2(&$r, $PI= 3.14){    $result = $r*$r*$PI;   $r ++;//这里$m1会变成11    return $result;}$a3 = getArea2(23);//这里会出现错误Fatal error: Only variables can be passed by reference in /var/www/html/day6/hanshujichu.php on line 26参数的数量问题:1.函数的参数的数量可以是多个,具体由需要决定。2.通常实际参数的数量应该和形式参数的数量一致。3.但是当有默认参数时,可以不遵循第2即:实参的个数不少于形参中非默认参数值的个数。4.特殊的处理参数:自有参数数量定义时可以不给定形参,但调用时,却又可以给定任何数量的实参。在系统中,var_dump()这个函数也具有同样的使用效果。var_dump($v1);var_dump($v1,$v2);

这种应用的实现,是依赖系统中的三个系统函数来达到的。

func_get_args()//获取所有传递过来的实际参数,结果是一个数组

func_get_arg(n)//获得第n个参数(n0开始)

func_num_args()//获得所有实际参数的个数。


例子:

<?php

//不定形参个数的特殊函数的使用实例//求偌干个数的和function getSum(){      $arr = func_get_args();//获得所有的实参,结果是数组    $sum = 0;//初始化一个变量,用于存储总和    foreach ($arr as $key=>$value){        $sum += $value;    }    return $sum;}$sum_total = getsum(34, 53, 3423,5);echo "$sum_total";?>

返回值:

通常来说,在一个函数中,使用return语句

通常情况下,函数返回的数据都是以值传递的形式返回,函数中的变量的值拷贝一份,然后

返回给接受的位置的对应代码。

但是我们也可以用引用传递的方式返回

定义函数:

function&函数名(形参1,形参2.。。。){

$result= 0;//初始化

return$result ;//此时返回的数据只能是变量}

调用函数:

$v1= &函数名(实参1,实参2,。。。);

应用返回的函数,自然是有返回值。

<?php

function &f1($p1, $p2){    static $result = 0;    //定义为静态变量,即不会随着函数的结束而销毁    //及以后在调用该函数,也不会初始化。    //第一次应该是0,第二次应该是6    echo "result=$result";    $h = $p1*$p1 + $p2*$p2;    $result = pow($h, 0.5);    return $result;}//这里的引用,体现为$v1 和函数中的$result 指向同一个数据$v1 = &f1(3,4);echo "v1=$v1";//应该是5$v1++;//则按理来说,$result也自加了,但是这里并不能体现出来。应该是6$v2 = &f1(4, 5);//再调用一次,取函数中输入$result;

输出结果:

result=0 v1=5 result=6


函数的其他形式:

可变函数:

就是函数名字可变 – 其实跟可变变量一样

$str1=‘f1’;//只是一个字符串,内容为‘f1’

$v1= $str1(3,4);//形式上看起来像变量加括号,实际上是f1(3,4);


匿名函数:

表现1

$f1= fucntion(){}//这里的匿名函数没有名字,但实际上将名称赋值给了变量$f1,使`用时就跟可变函数一样。$v1= $f1()

<?php

$v1 = function($a){    echo "$a";};$v2 = $v1('he');?>

表现2

调用其它函数2(匿名函数,实参1,实参2,。。。。)

说明:

1.此形式的匿名函数只有定义的函数体(无函数名)

2.该形式的匿名函数只能作为其它函数调用时的参数(其它函数通常有特定用处)

3.匿名函数会在调用其它函数的“过程中”被执行。

能够使用(匿名函数)当做实参的函数并不多。

其中常见的一个是:call_user_func_array()

其使用形式为:

call_user_func_array(匿名函数,数组);

含义:

将数组作为该匿名函数的实参,传递到该匿名函数中并且执行该匿名函数。可以

从该匿名函数中返回数据。

call_user_func_array(        function($m1, $m2, $m3){            echo "<br/>m1=$m1";            echo "<br/>m2=$m2";            echo "<br/>m3=$m3";        }, array(1,2,3));$a1 = array(1,2,3,45,5);$s = call_user_func_array(        function (){            $a = func_get_args();            $sum = 0;            foreach ($a as $key=>$value){                $sum += $value;            }            return $sum;        },$a1    );//继续改造匿名函数$a1 = array(1,2,3,45,5);$fun1 = function (){    $a = func_get_args();    $sum = 0;    foreach ($a as $value){        $sum += $value;    }    return $sum;};$s = call_user_func_array($fun1, $a1);echo "<br/>和为:$s";


变量的作用域:

通常说作用域有两个:

局部作用域:只能在所定义的函数范围内使用

全局作用域:在函数的‘外部’范围使用

--php中,局部和全局作用域不重叠

--js中,全部包括局部作用域


但是还有:

超全局:就是在函数的内部和外部都可以使用

只有系统内部预定义的那几个,不能自己创建全局变量。

静态局部作用域:其实也是局部,但是多一个特征,数据能够在函数退出后

仍然保持不丢失。

<?php$v1 = 10;//全局变量function f1(){    //这里是局部作用域    echo "<br/> v1= $v1";//局部作用域不能使用全局的变量    $v2 = 20;//局部变量};f1();echo "<br/> v2 = $v2";//全局不能使用局部变量?>例子2:内外部变量可以重复,互不相关。$v1 = 10;function f2(){    $v1 = 100;    echo "<br/>内部:v1=$v1";//v1=100;    $v1 ++;}f2();echo "<br/>外部:v1=$v1";//v1=10;局部访问全局变量的特定语法1.在局部范围内,使用global关键字对全局变量进行一次申明,则可以使用该全局变量。//超全局变量$v1 = 10;//全局变量function f3(){    //这里是声明全局作用域    global $v1;    echo "<br/> v1= $v1";//此时可以使用外部全局变量 此时结果为10    $v2 = 20;//局部变量};f3();说明1.实际上,内部函数中的global语句,其实是创建了一个跟外部变量同名的局部变量,并通过‘引用’来指向和全局变量相同的内存位置//超全局变量的本质$v1 = 10;//全局变量function f3(){    //这里是声明全局作用域    global $v1;    echo "<br/> v1= $v1";//此时可以使用外部全局变量,其本质是创建了一个新的局部变量    echo "<br/> v1++";    $v1 ++;//这里也影响了外界的$v1    unset($v1);    echo "<br/> 内部断开后:v1=$v1";//这里只是断开了内部创建的$v1变量,而与外界的变量无关    $v2 = 20;//局部变量};f3();echo "<br/>外部v1 = $v1";//这里输出v1=11;2.在函数中(局部范围)来时用$GLOBALS全局数组来引用全局变量。$GLOBALS超全局数组来访问所有的变量。----------------------------------------------------------------------$v1 = 10;function f4(){    //这里是局部    echo "<br/>内部开始:v1=".$GLOBALS['v1'];    $GLOBALS['v1'] ++;}f4();echo "<br/>外部v1=$v1";//v1=11;同样能改变全局变量但通过globals变量来unset变量,则外部全局变量也被unset掉(和python一样)3.实际上,我们还可以在函数内部直接使用$GLOBALS来访问数组function f5(){    $GLOBALS['kaixin'] = 'hu';}f5();echo "kaixin=$kaixin";//从外部可以访问到变量kaixin. 输出为:kaixin=’hu’全局变量访问局部变量的特定语句通过引用传递的方式向形参传递一个引用实参变量举例$v1 =10; function f1(&$p1, $p2){}//$p1 势函数的形参,也就是函数的内部(局部)变量$v2 = f2($v1, 10)// 此时我们认为$v1就可以使用函数中$p1的值使用函数的引用返回形式。见前面引用传递的方式返回数据。函数中使用global关键字来首次引用一个全局变量,则函数结束以后在全局范围内就可以使用该变量了。function f6(){    global $v6;//此变量之前所有额代码都没有定义过                //实际$v6为局部变量                //但同时也会创建一个同名的全局变量    $v6 = 60;//虽然函数结束后,此局部变量会销毁,但是全局变量的值已经被引用。}f6();echo "<br/>v6=$v6";//输出结果为v6=60;有关函数的系统函数function_exists():判断某个函数是否被定义过,返回布尔值。iffunction_exists(‘func1’ == false){function func1(){….};//定义函数}func_get_arg(n):获得一个函数的第n个实参值(n0开始)func_get_args():获得一个函数的所有实参,结果是一个数组func_num_args():获得一个函数的所有实参的个数。有关函数的编程思想:1.递归思想:递归思想的基本形式是:在一个函数中,有至少一条语句,回去调用该函数本身。但是从代码角度来看,如果单纯是函数内部调用函数,则会出现超出迭代次数的现象,则我们必须解决:该思想的过程依赖两个条件:1.一直同类最小问题的答案2.大一级问题的答案可以通过小一级问题的答案经过运算获得如何终止(停止)这种调用 -----如何找到递归函数的出口:<?phpfunction f1(){    static  $i = 1;    $i ++;    echo "$i";    if ($i<10){//出口条件,只有在$i<10的时候才会调用        f1();}//函数中调用函数};f1();案例分析:1)1的阶乘是1(2)大于1的阶乘,是这个数-1的数的阶乘,乘以该数的结果