zoukankan      html  css  js  c++  java
  • 函数介绍

    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 **/
  • 相关阅读:
    UVa 10118 记忆化搜索 Free Candies
    CodeForces 568B DP Symmetric and Transitive
    UVa 11695 树的直径 Flight Planning
    UVa 10934 DP Dropping water balloons
    CodeForces 543D 树形DP Road Improvement
    CodeForces 570E DP Pig and Palindromes
    HDU 5396 区间DP 数学 Expression
    HDU 5402 模拟 构造 Travelling Salesman Problem
    HDU 5399 数学 Too Simple
    CodeForces 567F DP Mausoleum
  • 原文地址:https://www.cnblogs.com/lgs198712/p/2909961.html
Copyright © 2011-2022 走看看