• 函数介绍


    1.函数的概念
    2.函数声明语法
    3.函数调用方法
    4.函数的传参方式
    5.函数的作用域
    6.动态函数
    7.函数的参数个数与默认参数
    8.函数的命名规范
    9.函数的执行权与交回
    10.超级全局变量
    11.函数参数的引用赋值

    从编程的角度来理解的。
    把若干语句,封装在一块,起一个名字
    下次根据名字来调用这个封装的块,就可以称之为函数

     1 /*
     2 假设如下场景:
     3 来客人了,需要安排书童,沏茶
     4 书童比较笨,需要你把步骤说的特别细
     5 于是不客人来的时候
     6 */
     7 
     8 echo '把水灌水壶,烧开','<br />';
     9 echo '茶叶放到茶杯','<br />';
    10 echo '把水倒进茶杯','<br />';
    11 echo '端上茶杯','<br />';
    12 //
    13 ////第二天,又来客人
    14 ////只好再对书童大喊4声
    15 
    16 echo '把水灌水壶,烧开','<br />';
    17 echo '茶叶放到茶杯','<br />';
    18 echo '把水倒进茶杯','<br />';
    19 echo '端上茶杯','<br />';
    20 //第三天……又来客人了……
    21 //第四天……又来客人了……
    22 
    23 //我们思考,当客人来的时候,把'沏茶'这个过程执行一遍
    24 //这样对书童说:客人来的时候,把'那个过程整体执行一遍?'
    25 
    26 //书童的疑问:哪个过程?什么样的过程?
    27 //
    28 //教书童沏茶
    29 //看好了,我把这4句话写在一块
    30 {
    31 echo '把水灌水壶,烧开','<br />';
    32 echo '茶叶放到茶杯','<br />';
    33 echo '把水倒进茶杯','<br />';
    34 echo '端上茶杯','<br />';
    35 
    36 }//包成一个复合语句, 一大句话。
    37 
    38 //再给这个复合语句,加上一个名字就是函数名
    39 function qicha(){
    40 echo '把水灌水壶,烧开','<br />';
    41 echo '茶叶放到茶杯','<br />';
    42 echo '把水倒进茶杯','<br />';
    43 echo '端上茶杯','<br />';
    44 }//此时,函数已经有名字了。                 返回目录
    45 qicha();

     从数字的角度来理解

    函数的概念:函数是变量 之间的关系。

     1 /*
     2 例:y=2*x;
     3 
     4 当:x=1,则y=2
     5 ……
     6 ……
     7 可以看出,y与与x之间存储一种关系。
     8 返回的y是根据x值乘以2
     9 
    10 
    11 问男生:你谈过几个女朋友?
    12 男生的真实谈过女朋友==他说的个数/3
    13 女生的真实谈过的男朋友 ==她说的个数*3
    14 
    15 来一个男友个数推测机
    16 $real = $say *3;
    17 
    18 给我一个数,我帮你算出一个3倍后的数---这样一个量与量的关系。
    19 怎么给函数一个值,然后函数又怎么乘以3,再还给我呢?
    20 
    21 给函数一个值
    22 函数乘以3,再还给我
    23 
    24 此时的函数,像不像豆浆机?
    25 入口输入:黄豆
    26 机器内:搅拌黄豆
    27 出口:豆浆
    28 */
    29 
    30 function she($say){ //参数的入口
    31     $real = $say *3;//函数体是加工处
    32     return $real; //出口
    33 }
    34 
    35 $num =5;
    36 echo '大S说她谈过',$num,'次恋爱<br />';
    37 echo '推测其真实谈过',she($num),'次恋爱<br />';
    38 
    39 //函数的声明 的语法
    40 //
    41 //最简单的函数声明
    42 function foo(){//没有参数
    43 }
    44 
    45 function foo($arg1,$arg2,$arg3){
    46 return 值;//可以return 值,也可以不return 
    47 }
    48 
    49 //函数就是一个加工机
    50 //输入黄豆,加工,return豆浆
    51 //输入苹果,加工,return罐头
    52 //输入淑女,加工,return 辣妹
    53 //
    54 function foo(){
    55     echo 'foo';
    56 }
    57 
    58 foo();
    59 
    60 ////如果函数指定的参数的话。
    61 //// 还需要传参数
    62 function bar($num){
    63 echo $num*10;
    64 }65 
    66 bar(); //出错,缺少参数

    函数的命名规范

    1 //8.函数的命名规范
    2 
    3 //和变量一样,不区大小写
    4 //以后学到的面向对象时,方法(理解成函数)也是不区分大小写
    5 
    6 function foo(){
    7     echo 'foo';
    8 }
    9 foo();                                                        返回目录

    4.函数的传参方式

      1 //4.函数的传参方式 
      2 //
      3 //长方形面积公式 = 长 * 高
      4 //初中时:s = a * b
      5 //
      6 //高中时:s=α*β
      7 //
      8 //来分析 这3个公式,变的是什么,不变的是什么 ?
      9 //
     10 //用来表示矩形的2个边的‘名称’变了,叫‘长宽’,叫‘ab’……
     11 //不变的是‘关系’,即无论表示方式怎么变,面积都始终等于长*宽
     12 //
     13 //你是中国人,你想让他帮你算面积的话
     14 //你告诉他长,宽,没用
     15 //
     16 //要把你的长宽,让英国小孩脑子中,知道你在说的是a,b的值才行。
     17 
     18 //
     19 function 面积($长,$宽){
     20     return $长*$宽;
     21 }
     22 echo 面积(10,8);
     23 
     24 
     25 
     26 //上面的过程,参数是如何传过去的?
     27 //答:
     28 //
     29 //1.面积函数开始调用,在函数内部,声明两个变量,$长,$宽
     30 //2.把接收到的值,按顺序分赋给形参
     31 //3.此时,形参已经有值了
     32 //4.函数体执行
     33 //5.最后 返回
     34 //
     35 //-------------------------------------------------------
     36 //
     37 function she($say){ //参数的入口
     38     $real = $say *3;//函数体是加工处
     39     return $real; //出口
     40 
     41 }
     42 //
     43 //she函数调用
     44 //
     45 //传参$num ,真正用的是什么?
     46 //答:用的是$num的值
     47 //函数先在函数体体内声明$say变量
     48 //再把$num值,赋给$say 
     49 //执行,返回
     50 //
     51 //模拟执行如下:
     52 //
     53 function she($say){ //参数的入口
     54     she($num);
     55     $say = $num;
     56     $real = $say *3;//函数体是加工处
     57     return $real; //出口
     58 
     59 }
     60 //--------------------------------------------------------
     61 //声明函数时的参数 ---->叫形式上的参数,形参  --->变量名
     62 //调用函数时的参数 ---->叫实际传递的参数,实参--->变量的值
     63 
     64 //
     65 function foo($num){
     66     $num += 1;
     67     $num *= 2;
     68     $num /= 3;
     69     $num += 999;
     70     return $num;
     71 }
     72 
     73 $price =100;
     74 echo foo($price),'<br />';
     75 echo $price;
     76 //
     77 ////因为,在函数运行,$price的(值)传递给$num
     78 //因此,函数体内的$num,无论怎么变,和$price无关了。
     79 //=======================================================
     80 
     81 //形参与实参的顺序/个数的关系,
     82 //
     83 //实参的值,要赋给形参变量
     84 
     85 function foo($x,$y,$z){
     86 return 2*$x+3*$y+$z;
     87 
     88 }
     89 echo foo(1,2,3);
     90 
     91 //在调用的过程中,
     92 //实参,形参,从左到右,严格的逐一对应
     93 //一一对应上,然后实参值,挨个儿赋给形参
     94 //
     95 //
     96 //如果实参少于形参,没对应上
     97 echo foo(1,2);  //warning警告,并尽量往下执行。
     98 //--------------------------------------------------------
     99 //
    100 echo foo(1,2,3,4,5);//还是11;
    101 //因为实参对号给形参赋值时,后面多出来的实参,将会被舍弃掉
    102 
    103 //---------------------------------------------------------       返回目录         

     参数的默认值

     1 //参数的默认值
     2 //来人报国籍
     3 //要是指明自己是某国人,即说我自某国
     4 //不指明,就默认为‘中国’
     5 
     6 //
     7 function intro($country='中国'){
     8     echo '我来自',$country,'<br />';
     9 }
    10 
    11 intro('美国');
    12 intro('日本');
    13 ////--------------------------------------------------------
    14 intro();
    15 
    16 function intro($country='中国'){
    17     $country = '中国';
    18     echo '我来自',$country,'<br />';
    19 }
    20 //---------------------------------------------------------
    21 intro('美国');
    22 function intro($country='中国'){
    23     $country = '中国';
    24     $country = '美国';
    25     echo '我来自',$country,'<br />';
    26 }
    27 
    28 //----------------------------------------------------------
    29 
    30 //默认参数,并不能改变,实参与形参,严格按顺序赋值的原则
    31 
    32 function sum($x=4,$y,$z){
    33     return 2*$x + 3*$y + $z;
    34 }
    35 sum(5,6); //行吗?
    36 
    37 //模拟执行:
    38 
    39 sum(5,6); 
    40 
    41 function sum($x=4,$y,$z){
    42     $x =4;
    43     $x = 5;
    44     $y =6;
    45 
    46     return 2*$x + 3*$y + $z;
    47 }
    48 
    49 //sum(4,5,6); //想一想,既然有了默认参数,调用时,又没能少传实参?
    50 //想一想,怎么样才能少传一个实参,利用上默认上参数.
    51 
    52 //如果参数有默认值的话,要把该参数写到后面去。
    53 
    54 function sum($x,$y=3,$z=4){
    55 return $x + 2*$y + $z;
    56 }
    57 
    58 echo sum(1);
    59 
    60 //模拟执行:
    61 
    62 
    63 function sum($x,$y=3,$z=4){
    64     $x = null;
    65     $y = 3;  
    66     $z = 4;//这三行是函数声明引起的
    67 
    68     $x = 1;// 这1行,是函数调用传实参引起的
    69     return $x + 2*$y + $z;
    70 }
    71 
    72 echo sum(1);  // 11
    73 //----------------------------------------------------
    74 //模拟执行:
    75 
    76 
    77 function sun($x,$y=3,$z=4){
    78     $x = null;
    79     $y = 3;  
    80     $z = 4;//这三行是函数声明引起的
    81 
    82     $x = 1;// 这1行,是函数调用传实参引起的
    83     $y = 2;//这1行,是函数调用传实参引起的
    84 
    85     return $x + 2*$y + $z;
    86 }
    87 echo sun(1,2);  //  9
    88 
    89 //
    90 //函数可以设置默认值
    91 //有默认值参数一般放在后面
    92 //那么,实参的值,将要覆盖 默认值。                                  返回目录 

    函数与变量的作用域 

      1 //函数与变量的作用域
      2 
      3 $num = 5;
      4 function t(){
      5     $num = 9;
      6 }
      7 t();
      8 echo $num;
      9 
     10 
     11 //默认状况下 ,
     12 //函数运行时,有其自己独有的变量空间
     13 //函数体内的变量,与外界的变量,无关
     14 //
     15 //即使是变量的名字相同。
     16 
     17 
     18 //当函数调用时,系统为其申请一块独立的‘调用空间’
     19 //函数体内的变量,在其独立的‘调用空间内’
     20 //与外界的变量无关。
     21 //
     22 //内部叫:局部变量
     23 //外部叫:全局变量
     24 //
     25 //函数调用结束后,申请的独立的‘调用空间’,就释放掉
     26 //下次,再调用,再申请,函数还得从头初始化
     27 
     28 function t2(){  
     29     echo $num;
     30 }
     31 t2();
     32 
     33 //-------------------------------------------------
     34 var num = 5;
     35 <script type="text/javascript">
     36 
     37     function t(){
     38         alert(num);
     39     }
     40 </script>
     41 
     42 t();
     43 
     44 //在js中,有作用域链的概念,在函数内找不到局部变量num,就会往外层寻找。
     45 //在php中,则不会跑到外层去寻找。
     46 
     47 //-------------------------------------------------
     48 //
     49 function t2(){
     50     echo $num;
     51 
     52 }
     53 
     54 //t2(); //局部内,即t2的空间内,有$num变量吗?
     55 //虽然全局内有$num,但php中,函数并不会去全局寻找$num
     56 //简单说:php函数内的变量,就局限在函数的{}内。
     57 
     58 function t3(){
     59     $age =19;
     60     $age+=1;
     61     echo $age,'<br />';
     62 }
     63 
     64 t3();
     65 t3();
     66 t3();
     67 
     68 //-------------------------------------------------
     69 
     70 function calc($num1,$act,$num2){
     71     $res =null;
     72    switch ($act){
     73         case '+':
     74             $res = $num1 + $num2;
     75             break;
     76         case '-':
     77            $res = $num1 - $num2;
     78             break;
     79         case '*':
     80             $res = $num1 * $num2;
     81             break;
     82         case '/':
     83             if($num2==0){
     84                 echo '0不能作除数';
     85                 break;
     86              }
     87             $res = $num1 / $num2;
     88             break;
     89    }
     90    return $res;
     91 }
     92 
     93 
     94 echo calc(3,'+',2),'<br />';
     95 echo calc(3,'/',0),'<br />';
     96 
     97 //====================================================
     98
    249                                                                    返回目录 

    超级全局变量  

      1 //
      2 //一般情况下,页面内声明的“普通全局变量”
      3 // 在函数内访问不到,
      4 //
      5 //函数:常量 在函数能访问到
      6 //而且,还有一类变量  ------超级全局变量任意一处,
      7 //无论是多深层的函数内,还是以后的对象的方法体内,都可以直接访问到
      8 //
      9 //
     10 //
     11 //九大超级全局变量[注意全大写]
     12 $_GET                 //地址栏的参数
     13 $_POST                //接POST型的表单参数(比如:用户注册时的内容,往往用$_POST来接)
     14 $_REQUEST             //默认情况下,包含了$_GET,$_POST,$_COOKIE的数组,即$_REQUEST是前三者的并集
     15                       //比如不想区分 $_GET,$POST  可以用$_REQUEST来代替
     16 
     17 $_FILES               //文件上传时学
     18 
     19 $_COOKIE              //用户登陆时学
     20 $_SESSION
     21 
     22 $_ENV
     23 $_SERVER              //服务器还有访客一些信息,放置的是运行脚本的当前服务器信息,和当前运行的环境信息
     24 $_GLOBLES             //所有变量的一个注册表
     25 
     26 
     27 
     28 //----------------------------------------------------
     29 function t2(){
     30     echo '你想注册<br />';
     31     echo '姓 名 是',$_POST['username'],'<br />';
     32     echo '密 码 是',$_POST['password'],'<br />';
     33     echo 'email 是',$_POST['email'],'<br />';
     34     echo '性 别 是',$_POST['sex'],'<br />';
     35 }
     36 
     37 
     38 function t(){
     39     $id =$_GET['id'];
     40     echo '如果我会mysql,将会取出',$id,'号贴子的内容给你';
     41     t2();
     42 }
     43 
     44 t();
     45 //----------------------------------------------------
     46 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
     47 <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
     48 <head>
     49 <title>新建网页</title>
     50 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     51 <meta name="description" content="" />
     52 <meta name="keywords" content="" />
     53 <script type="text/javascript">
     54 
     55 </script>
     56 
     57 <style type="text/css">
     58 </style>
     59 </head>
     60     <body>
     61         <form action="02.php?id=99" method="post">
     62           <h2>用户注册</h2>      
     63         <dd>用户名:<input type="text" name="username" /></dd>
     64         <dd>密  码:<input type="password" name="password" /></dd>
     65         <dd>E_mail:<input type="text" name="email" /></dd>
     66          
     67         <dd>性别:
     68                 男<input type="radio" name="sex" value="男" />
     69                 女<input type="radio" name="sex" value="女" /></dd>
     70         <dd><input type="submit" value="提交" /></dd>
     71 
     72         </form>
     73     </body>
     74 </html>
     75 //----------------------------------------------------
     76 
     77 //id,email等都能打印出来
     78 //这就说明,超全局变量,即使在函数内,甚至深层调用的函数内,也一样能接收
     79 
     80 
     81 //有一天,经理告诉你,把来访者的IP记录下来。分析哪个省的客户最多
     82 //并且,分析分析,用户用的是哪个浏览器
     83 
     84 
     85 
     86 
     87 
     88 REMOTE_ADDR
     89 remote_addr
     90 
     91 echo '你来自',$_SERVER['REMOTE_ADDR'],'<br />';
     92 echo '你的浏览器信息是',$_SERVER['HTTP_USER_AGENT'];
     93 //为什么有的论坛,有一种动态签名档
     94 //你去访问的时候显示
     95 //
     96 //你好,来自于北京电信的朋友,
     97 
     98 //$GLOBALS是页面内所有全局变量的一个'名单',在GLOBALS里
     99 //你能找到你声明过的所有变量
    100 
    101 
    102 $a = 3;
    103 $b ='hello';
    104 print_r($GLOBALS);
    105 
    106 //
    107 //而$GLOBALS又是超全局的,这意味着:我们通过$GLOBALS可以操作普通的全局变量.
    108 //
    109 $var1 = 5;
    110 $var2 = 1;
    111 function get_value(){
    112     $var1 = 0;      //局部$var1
    113    $GLOBALS['var2']++;  //影响全局的var2,变成2
    114 }
    115 
    116 var_dump(get_value());
    117 echo $var1,"\n";
    118 echo $var2;
    119 
    120 $age = 5;
    121 function t(){
    122     global $age;  //global 关键字,用在变量前面,声明:这个变量是全局范围内的变量 ,而不要在局部内生成$age
    123 
    124     $age++;
    125 }
    126 
    127 t();
    128 
    129 echo $age;
    130 
    131 
    132 /*
    133 函数 和局变量并不是水火不容的
    134 1.通过引用传参,能影响全局变量 
    135 2.通过global声明,也能直接使用外部的变量(不推荐,好多公司明确禁止使用global ,自己想想危害)
    136 3.直接操作超级全局变量.
    137 */                                                                        返回目录 

    动态函数 

     1 //动态函数
     2 
     3 
     4 */
     5 
     6 function wel(){
     7     echo '欢迎<br />';
     8 }
     9 
    10 function love(){
    11 echo '基大都是<br />';
    12 }
    13 function cry(){
    14     echo '55<br />';
    15 }
    16 //执行哪一个呢?不一定
    17 //决定,用户输入哪个函数名,我就执行哪个?
    18 
    19 
    20 $func = $_GET['func'];//wel /love /cry 
    21 echo $func;
    22 echo $func();//加个小括号来调用,则会把$func的值,当成“函数名”,
    23 //来调用该函数,php的灵活之处,以后学面向对象时,类名字也可以是变量
    24 
    25 //同样的操作在java里,就要用反射
    26 //即 函数名也可以用变量来表示
    27 //====================================================
    28 
    29 
    30 function t($num){
    31     $num+=5;
    32     return $num;
    33 }
    34 
    35 $age = 19;
    36 echo t($age);
    37 echo $age,'<br />'; //19
    38 
    39 /*
    40 function t($num){运行
    41 $num = $age;
    42 $num +=5;
    43 
    44 }
    45 
    46                                                 返回目录 

     函数的执行权与执行权的交回

      1 函数的执行权与执行权的交回
      2 
      3 function t(){
      4     echo 'a<br />';
      5     echo 'b<br />';
      6     echo 'c<br />';
      7 }
      8 
      9 echo 'x','<br />';
     10 t();
     11 echo 'z','<br />';//z是等到t函数运行结束后,才运行的
     12 
     13 //总结:
     14 //当调用函数的时候
     15 //程序的执行权,进入到函数的内部
     16 
     17 
     18 
     19 
     20 
     21 //运行x,z
     22 //函数并没有发挥作用,因为没有调用
     23 //
     24 //
     25 //函数就像一台加工机
     26 //如豆浆机,如洗衣等
     27 //
     28 //豆浆机,洗衣机,人不去调用,会自动发挥作用吗?不会
     29 //
     30 //同理:函数写好后,并不会自动的发挥作用,得调用,才能发挥
     31 //
     32 
     33 
     34 //问:
     35 //程序的执行权,进入到函数内部之后
     36 //什么时候,交回执行权?
     37 
     38 function t1(){
     39 t2();
     40 echo 't1<br />'
     41 
     42 }
     43 
     44 function t2(){
     45 echo 't2<br />'
     46 t3();
     47 }
     48 
     49 function t3(){
     50 echo 't3<br />'
     51 }   
     52  
     53 t1();
     54 
     55  t2,t3,t1;
     56 
     57 
     58 //1.函数的语句执行完毕后,执行权交回
     59 //2.
     60 
     61 function bar(){
     62     echo 'a';
     63     echo '<br />';
     64     return;
     65 
     66     echo 'b';
     67     echo 'c';
     68 }
     69 echo '<hr />';
     70 
     71 echo 'x','<br />';
     72 bar();
     73 echo 'z';
     74 
     75 
     76 //函数  既然比喻 成加工机
     77 //入口----原料----传参数
     78 
     79 /*
     80 调用函数的返回值
     81 即是return返回的值
     82 
     83 如果没有return  语句,或者‘return;’
     84 则返回值是NULL
     85 
     86 
     87 思考:函数可不可以return 回来2个值?
     88 
     89 答:不可能,函数的定义就决定了不能。
     90 从数学上来,一组确定的参数,只能得到一个确定的函数结果
     91 从程序来说,return 值;之后,函数结束,也不可能再return第2个值
     92 
     93 有同学说:用数组
     94 return array(1,2);// 数组是一个值,只不过是一个复合值。
     95 
     96 
     97 
     98 function t3(){
     99 return 3,9;
    100 }
    101 
    102 echo $x = t3();
    103 
    104 //====================================================             返回目录 

     函数参数的引用赋值    

     1  函数参数的引用赋值
     2 250 
     3 251 */
     4 252 //
     5 253 function foo(&$num){   //此处,即是指传参,不再是传实参的值,而是传实参的地址
     6 254     $num += 5;
     7 255 
     8 256 }
     9 257 $age = 19;
    10 258 echo foo($age),'<br />';
    11 259 
    12 260 $age = 19;
    13 261 echo foo($age),'<br />';
    14 262 function foo(&$num){   //此处,即是指传参,不再是传实参的值,而是传实参的地址
    15 263     $num = &$age; //此时,函数内部的$num,指向外部的一个全局变量的地址
    16 264     $num += 5;
    17 265 
    18 266 }
    19 267 echo $age,'<br />';$age受到了foo函数的影响返回目录 

     相关的视频连接:

    1. 燕十八-PHP公益培训-YY直播-019-函数概念&声明&调用

    2. 燕十八-PHP公益培训-YY直播-020-形参与实参概念详解

    3. 燕十八-PHP公益培训-YY直播-021-实参传值过程详解

    4. 燕十八-PHP公益培训-YY直播-022-函数的作用域

    5 .燕十八-PHP公益培训-YY直播-023-函数的执行权与交回

    6. 燕十八-PHP公益培训-YY直播-024-函数的返回值

    7. 燕十八-PHP公益培训-YY直播-025-动态函数

    8. 燕十八-PHP公益培训-YY直播-026-引用传参

    9. 燕十八-PHP公益培训-YY直播-027-超全局变量

    /** 燕十八 公益PHP培训 课堂地址:YY频道88354001 学习社区:www.zixue.it **/
  • 相关阅读:
    bzoj 1013: [JSOI2008]球形空间产生器sphere
    bzoj 1012: [JSOI2008]最大数maxnumber
    bzoj 1010: [HNOI2008]玩具装箱toy
    bzoj 1008: [HNOI2008]越狱
    bzoj 1007: [HNOI2008]水平可见直线
    UVa12105 越大越好
    POJ
    最优点配对问题(紫书)
    Ned 的难题
    UVA
  • 原文地址:https://www.cnblogs.com/lgs198712/p/2909961.html
Copyright © 2020-2023  润新知