php自定义函数详解------03

目录

一: php自定义函数之回调函数

二: php自定义函数之变量函数

三: php自定义函数之匿名函数

四: php自定义函数之内部函数

五: php自定义函数之变量作用域

六: php自定义函数之参数的引用

七: php自定义函数之递归函数

八: php自定义函数之静态变量


一: php自定义函数之回调函数

1.定义:

1).回调函数,可以配合匿名函数和变量函数实现更加优美、复杂的一种函数结构。

2).回调函数,就是在处理一个功能的时候,让这个功能自定义能力再强一些,我准许调用这个函数的时候,还可以传入一个函数配合、协助进行处理

2.eg:

<?php
function woziji($one,$two,$func)
{
 //检查$func是否是函数,如果不是函数停止执行本段代码,返回false
 if(!is_callable($func)){
 return false;
 }
 //我把$one、$two相加,再把$one和$two传入$func这个函数中处理一次
 //$func是一个变量函数
 echo $one + $two + $func($one,$two);
}

//我们定义几个函数试试
function plusx2( $foo , $bar)
{
 $result = ($foo+$bar)*2;
 return $result;
}
function jian( $x , $y )
{
 $result = $x - $y;
 return $result;
}

//调用一下函数,woziji,向里面传入参数试试
echo woziji(20,10,'plusx2');  //90
echo "<br />";
echo woziji(20,10,'jian');   //40
?>

注意: 在一个调数里面,再传入一个函数名,将函数名加上()括号。识为变量函数,配合执行。

二: php自定义函数之变量函数

1.定义: 可变函数仅仅是可变变量的一个变种、变形表达;可变函数,我们也会称呼为变量函数;

<?php 
$hello = 'world';
$world = '你好';
//输出的结果为:你好
echo $$hello; 
?>

  注意:因为$hello先被解释成了world,再world前加上$符就输出了:你好。

2.eg:

<?php
function test(){
 echo '小鸡炖蘑菇';
}
$fu = 'test';
$fu();  //小鸡炖蘑菇
?>

三: php自定义函数之匿名函数

1.匿名函数,也就是没有函数名的函数;匿名函数的第一种用法,直接把赋数赋值给变量,调用变量即为调用函数。

2.变量函数式的匿名函数

<?php
$greet = function($name)
{
 echo $name.',你好';
};
$greet('明天');
echo "<br />";
$greet('PHP中文网');
?>

效果:

明天,你好
PHP中文网,你好

3.回调式的匿名函数

<?php
function woziji($one,$two,$func){
       //检查$func是否是函数,如果不是函数停止执行本段代码,返回false
       if(!is_callable($func)){
               return false;
       }
       //我把$one、$two相加,再把$one和$two传入$func这个函数中处理一次
       //$func是一个变量函数
       echo $one + $two + $func($one,$two);
}

woziji(20,30,function( $foo , $bar){
               $result = ($foo+$bar)*2;
               return $result;
           }
);

//页面输出150
?>

四: php自定义函数之内部函数

1.内部函数,是指在函数内部又声明了一个函数。

2.注意事项:

1).内部函数名,不能是已存在的函数名

2).假设在函数a里面定义了一个内部函数,不能定用两次函数a。

3.eg:

<?php
function foo()
{
 echo '我是函数foo哟,调一下我才会执行定义函数bar的过程<br />';
 function bar()
 {
 echo '在foo函数内部有个函数叫bar函数<br />';
 }
}

//现在还不能调用bar()函数,因为它还不存在
// bar();
foo();
echo "<hr />";
//现在可以调用bar()函数了,因为foo()函数的执行使得bar()函数变为已定义的函数
bar();
//再调一次foo()是会报错的
// foo();
?>

结论: 

    1. foo()调用两次会报错;

    2. 如果不调foo()函数无法执行bar函数,因为bar是在foo的内部;

五: php自定义函数之变量作用域

1.函数规则:

  • 函数定义时后括号里面接的变量是形式上的参数(形参),与函数体外的变量没有任何关系,仅仅是在函数内部执行;
  • 函数内声明的变量也与函数外的变量没关系;

2.我们实际的处理情况中会遇到这样的一个情况:

  •  我想在函数体内定义的变量在函数体外用
  •  我想把函数体外的变量拿到函数体内来使用

   这个时候我们就需要用到超全局变量

全局变量名功能说明
$_COOKIE得到会话控制中cookie传值
$_SESSION得到会话控制中session的值
$_FILES得到文件上传的结果
$_GET得到get传值的结果
$_POST得到post传值的结果
$_REQUEST即能得到get的传值结果,也能得到Post传值的结果

3. 我们所有声明的变量都放到了$GLOBALS这个数组下面

<?php
$hello = 10;
echo $GLOBALS['hello'].'<br />';
$GLOBALS['hello'] = '我爱你';
echo $hello; //10
?>

4.将函数体内的变量(局部变量)在函数外部使用。也可以让函数外的变量到函数里面来使用。

1).通过$GLOBLAS来读取外部变量

<?php
$one = 10;
function demo(){
   $two = 100;
   $result = $two + $GLOBALS['one'];
   return $result;
}
//你会发现结果变成了110
echo demo();
?>

2).通过$GLOBLAS,在函数内修改外部变量

<?php
$hongniu = '我是一个兵,来自老百姓';
function test(){
   echo '执行了函数test哟<br />';
   //调用test()函数,将通过$GLOBALS['hongniu'],把$hongniu的值改变掉
   $GLOBALS['hongniu'] = '帮助别人很快乐';
}

test();
//发现输出的值变:  帮助别人很快乐
echo $hongniu;
?>

3).通过$GLOBLAS,在函数内创建全局变量

<?php
function hello(){
   $GLOBALS['que'] = '提神喝茶更好哟';
   echo '你调了一下函数hello<br />';
}
hello();
echo $que; //提神喝茶更好哟
?>

4).在函数内使用global关键词后面跟一个或多个变量,就把变量变为了全局变量,格式如下:

global $变量1[,变量2,....变量n]

  在global后面可以跟一个或者多个变量,变量用逗号分开

<?php
$a = 10;
$b = 100;
function test(){
   global $a , $b;
   echo $a + $b;
}
test(); //110
?>

  注意:不可在global 后写 $变量 = 值。

六: php自定义函数之参数的引用

1.变量的引用

<?php
$a = 10;
$b = &$a;
$a = 100;
echo $a.'---------'.$b;//100---------100
?>

变量引用是指变量$a和$b指向到了同一个存储位置,来存值,一个变量变化,另一个也跟着变化。

2.函数的参数引用,将形参和实参指向到同一个位置。如果形参在函数体内发生变化,那么实参的值也发生变化;

<?php
$foo = 100;
//注意:在$n前面加上了&符
function demo(&$n){
       $n = 10;
       return $n + $n;
}
echo  demo($foo).'<br />'; //20
//你会发生$foo的值变为了10
echo $foo;    //10
?>

  注意: 我们发现实参为$foo,在调用demo的时候,让$foo和$n指向到了同一个存储区域,当$n的值发生变化的时候。那么$foo的值也发生变化。

七: php自定义函数之递归函数

1.递归函数:函数体内调用函数自己。

2.递归在实际工作中主要是用在:文件和文件夹操作的时候有使用到。

3.递归思想:

  • 代码是从上到下执行的,所有代码没有exit等停止符,函数必须执行完。
  • 如果函数从函数A跳至函数B后,必须把函数B执行完成再执行函数A余下的代码。
  • 递归函数必须要能执行完有结束条件,不然函数就会限入死循环。函数会永远的自我执行下去。

4.递归小案例

<?php
$num = 10;
//调用一次函数A();
A($num);

function A( $arg ){
   echo $arg;
   //在函数A里面去,跑去执行函数B去了
   B($arg);
   echo '我们需要不断的努力,努力到上天都为我们感动';
   echo $arg.'<br />';
}

function B( $number ){
       echo $number;
       echo '俺是狗蛋,执行完了<br />';

}
?>

页面输出:

1010俺是狗蛋,执行完了
我们需要不断的努力,努力到上天都为我们感动10

5.递归实现

<?php
$n = 2;
function dg( $n ){
   echo $n.'<br />';
   $n = $n - 1;
   if($n > 0){
       //在函数体内调用了dg自己哟
       dg($n);
   }else{
       echo '--------------';
   }
   echo '俺是狗蛋,俺还没执行' . $n . '<br />';
}
dg(3);
?>

效果:

3
2
1
--------------俺是狗蛋,俺还没执行0
俺是狗蛋,俺还没执行1
俺是狗蛋,俺还没执行2

注意:

1).第一次调用dg(),将数字$n = 2传到dg中,先显示出来了2

2).然后将$n - 1 $n的值为了1

3).接着判断$n 是否大于0,肯定是大于0的,所以调用递归自己,再把自己执行一次。

4).而第二次在执行自己dg()的时候,而最下面的 echo '俺是狗蛋,俺还没执行' . $n . ''; 还没有执行到。等待执行完成后再来执行

5).$n此时等于1 ,所以显示出来1。

6).$n把自己减了一次,$n的结果为0

7).$n大于0肯定不成立的,所以显示了一条:"--------------"

8).而这个时候该执行:echo '俺是狗蛋,俺还没执行' . $n . '';

9).第二次执行dg()执行完成。第一次dg()的代码还没执行完,将第4点中的余下代码执行完。

八: php自定义函数之静态变量

1.背景: 如果我想知道函数被调用了多少次怎么办?  用静态变量来处理;

2.静态变量的特点是:声明一个静态变量,第二次调用函数的时候,静态变量不会再初始化变量,会在原值的基础上读取执行。

3.有了这个特点,我们就可以实现,最开始我们的提问:函数调用次数的统计。

4.eg:

<?php
function demo()
{
   $a = 0;
   echo $a;
   $a++;
}

function test()
{
   static $a = 1;
   echo $a;
   $a++;
}

demo();
demo();
demo();
demo();
demo();
test();
test();
test();
test();
test();

?>

 test();执行一次数值就会加1,而demo()输出的显示结果,始终为0。

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值