燕十八

函数介绍

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-超全局变量

 

posted @ 2013-02-11 08:39  启红  阅读(252)  评论(0编辑  收藏  举报