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-函数的执行权与交回