函数
/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/
1.1: 函数概念
1.2:函数的定义格式
1.3 函数的命名规范
1.4 函数的返回值
1.5 参数的传值方式
1.5 动态函数
1.6 函数中变量的作用域
/*
假设如下场景:
来客人了,需要安排书童,沏茶
书童比较笨,需要你把步骤说的特别细
*/
// 于是当客人1来的时候
echo '把水灌进水壶,烧开,<br />';
echo '把茶叶放到茶杯,<br />';
echo '往茶杯冲开水<br />';
echo '端上茶杯<br />';
// 第二天,又来客人
// 只好再对书童大喊4声
echo '把水灌进水壶,烧开,<br />';
echo '把茶叶放到茶杯,<br />';
echo '往茶杯冲开水<br />';
echo '端上茶杯<br />';
// 第三天... 又来客人....
// 第四天... 又来客人
// 我们思考: 当客人来的时候,把"沏茶"这个过程执行一遍.
// 这样对书童说: 客人来的时候,把"那个过程整体执行一遍?"
// 书童的疑问: 哪个过程? 什么样的过程?
// 教书童沏茶
// 看好了, 我把这4句话,写在一块
{
echo '把水灌进水壶,烧开,<br />';
echo '把茶叶放到茶杯,<br />';
echo '往茶杯冲开水<br />';
echo '端上茶杯<br />';
} // 包成一个复合语句,一大句话.
// 再给这个复合语句,加上个名字,就是函数名
function qicha() {
echo '把水灌进水壶,烧开,<br />';
echo '把茶叶放到茶杯,<br />';
echo '往茶杯冲开水<br />';
echo '端上茶杯<br />';
} // 此时,复合语句已经有一个名字了.
echo '<hr />';
qicha();
// 这是最简单的函数
/*
是从编程的角度来理解的.
从编程角度看,
把若干语句,封装在一块,起一个名字.
下次根据名字来调用这个封装的块,就可以称之为函数.
*/
/*
从数学的角度来理解
函数的概念: 函数是变量之间的关系.
例: y = 2*x;
当:x=1, 则y=2
当:x=3, 则y=6
...
...
可以看出,y 与 x之间存储一种关系.
返回的y是根据x的值乘以2.
*/
/*
问男生:你谈过几个女朋友?
男生的真实谈过的女朋友 == 他说的个数/3
女生的真实谈过的男朋友 == 她说的个数*3
来一个男友个数推测机
$real = $say * 3;
给我一个数,我帮你算出一个3倍后的数---这样一个量与量的关系.
给函数一个值,
函数乘以3,
再还给我
此时的函数,像不像 豆浆机?
入口处输入: 黄豆
机器内: 搅拌黄豆
出口: 豆浆
*/
function she($say) { // 参数是入口
$real = $say * 3; // 函数体是加工处
return $real; // 出口
}
$num = 5;
echo '大S说她谈过',$num,'次恋爱<br />';
echo '推测其真实谈过',she($num),'次恋爱';
/***
函数的声明的语法
最简单的函数声明
function foo() { //没有参数
}
也可以带有参数
function foo($arg1,$arg2,$arg3) { // 可以有1个或N个参数
return 值;// 可以return 值,也可以不return
}
/***
函数就是一个加工机
输入黄豆,加工,return 豆浆
输入苹果,加工,return 罐头
输入淑女,加工,return 辣妹
***/
/***
函数的调用?
函数以其名称来调用
***/
function foo() {
echo 'foo';
}
foo();
echo '<br />';
// 如果函数指定的参数的话.
// 还需要传参数
function bar($num) {
echo $num * 10;
}
// bar(); // 出错,缺少参数
bar(9);
/***
至此,我们先讨论清
函数概念
函数声明语法
函数调用方法
接下来,讨论深入的东西
函数的命名规范
函数的参数个数与默认参数
函数的传参方式
函数参数的作用域[2012年9月25日晚,讲到此]
函数的返回值
函数的执行权与交回
动态函数
***/
// 函数的命名规范
// 和变量一样,以字母数字下划线组合而成,但数字不能开头.
// 但是 不区分大小写
// 以后学到的面向对象时, 方法(理解成函数),也不区分大小写.
function foo() {
echo 'foo';
}
FOO(); // 函数的名字,不区分大小写的
/**
小学时:长方形面积 = 长 * 高, (长城高?)
初中时: s = a * b
高中时: s = α * β
来分析 这3个公式, 变的是什么,不变的是什么?
用来表示矩形的2个边的"名称"变了,叫"长宽",叫"a b",叫"α β"
不变的是"关系", 即无论方式来说明,面积都始终等于长*宽.
假设,碰到一个英国小孩,不会中文.
他脑子中 s = a * b
你是中国人,你想让他帮你算面积的话,
你告诉他 长 宽,没用.
要把你的长 宽,让英国小孩脑子中,知道你在说的是 a b的值才行.
**/
function 面积($长,$宽) {
return $长 * $宽;
}
echo 面积(10,8);
/***
上面的过程,参数是如何传过去的?
答: 面积函数开始调用,
在函数内部,声明2个变量, $长,$宽; // 形参
把接收到的值,按顺序分别赋给形参
此时,形参已经有值了.
函数体执行.
最后 返回.
***/
// 看下面这个例子
function she($say) { // 参数是入口
$real = $say * 3; // 函数体是加工处
return $real; // 出口
}
$num = 5;
echo '大S说她谈过',$num,'次恋爱<br />';
echo '推测其真实谈过',she($num),'次恋爱';
/***
she函数调用
传参$num,真正用的是什么?
答:用的是$num的值.
函数先在函数体体内声明, $say变量,
再把 $num的值 赋给 $say
执行,返回
模拟执行如下
she($num);
she($say) {
$say = $num;
$real = $say * 3; // 函数体是加工处
return $real; // 出口
}
***/
/***
声明函数时,的参数---> 叫形式上的参数, 形参
调用函数时,的参数---> 叫实际传递的参数,实参.
说白了:
形参在函数体内提供?? -->变量名
实参在函数体内提供?? -->值
***/
// 考考你,对形参,实参理解了没有?
function foo($num) {
$num +=1;
$num *=2;
$num /= 3;
$num +=999;
return $num;
}
$price = 100;
echo foo($price),'<br />';
echo $price;
// 因为,在函数运行,$price的(值) 传递给 $num
// 因此,函数体内的$num,无论怎么变,和$price无关了.
// 形参与实参的顺序/个数的关系.
// 实参的值,要赋给形参变量
function foo($x,$y,$z) {
return 2*$x + 3*$y + $z;
}
echo foo(1,2,3),'<br />';
// 在调用的过程中,
// 实参,形参,从左到右,严格的逐一对应.[对号入座]
// 一一对应上,然后实参值,挨个儿赋给形参.
/****
如果实参少于形参,没对应上
****/
// echo foo(1,2); // warning警告,并尽量往下执行.
/****
如果实参多于形参,
****/
echo foo(1,2,3,4,5,6,7),'<br />'; // 还是11
// 因为实参对号给形参赋值时, 后面多出来的实参,将会被舍弃掉. 没有其他副作用.
// 参数默认值
// 来人,报国籍.
// 要是指明自己是某国人,即说我来自某国
// 不指明,就默认为"中国"
function intro($country='中国') {
echo '我来自',$country,'<br />';
}
intro();
/**
intro($country='中国') {
$country='中国';
echo '我来自',$country,'<br />';
}
**/
intro('美国');
/*
intro($country='中国') {
$country='中国';
$country='美国';
echo '我来自',$country,'<br />';
}
*/
intro('日本');
/*
intro($country='中国') {
$country='中国';
$country='日本';
echo '我来自',$country,'<br />';
}
*/
/*****
默认参数,并不能改变 实参与形参 严格按顺序赋值的原则.
*****/
function sum($x=4,$y,$z) {
return 2*$x + 3 * $y + $z;
}
// sum(5,6); // 行吗?
/*
5--->$x
6--->$y
没有值--->$z
sum($x=4,$y,$z) {
$x = 4;
$x = 5;
$y = 6;
// z 没有接到值.
return 2*$x + 3 * $y + $z;
}
*/
// 想一想,既然有了默认参数,调用时,又没能少传实参?
// 想一想,怎么样才能少传一个实参,利用上默认参数?
// 番茄回答, 把','把第一个参数空出来 (点评:高,实在是高)
// sum(,5,6); // 行不通,语法错误
// 如果参数有默认值的话,要把该参数,写到最后面
// 见09.php
// 函数参数与默认值
function sum($x,$y=3,$z=4) {
return $x + 2*$y + 3*$z;
}
echo sum(1),'<br />';
/**
sum($x,$y=3,$z=4) {
$x = null;
$y = 3;
$z = 4; // 这3行,是函数声明引起的
$x = 1; // 这1行,是函数调用,传实参引起的.
return $x + 2*$y + 3*$z;
}
**/
echo sum(1,2); // 17
/**
sum($x,$y=3,$z=4) {
$x = null;
$y = 3;
$z = 4; // 这3行,是函数声明引起的
$x = 1;
$y = 2; // 这2行,是函数调用,传实参引起的.
return $x + 2*$y + 3*$z;
}
**/
/***
函数可以设置默认值.
有默认值参数一般后面.
如果某个有默认值的形参,对应位置传了实参
那么,实参的值 将要覆盖 默认值.
***/
// 函数与变量的作用域
$num = 5;
function t() {
$num = 9;
}
t();
echo $num,'<br />'; // 5
/**
默认状况下,
PHP中,
函数运行时, 有其自己,独立的变量空间.
函数体内的变量,与外界的变量,无关.
即使是变量的名字相同.
**/
/**
当函数调用时,系统为其申请一块独立的"调用空间"
函数体内的变量,在其独立的"调用空间内",
与外界的变量无关.
内部叫:局部变量
外部叫:全局变量
**/
function t2() {
echo $num;
}
t2();
// 局部内,即t2的空间内,有$num变量吗?
// 没有,虽然全局内有$num,但PHP中,函数并不会去全局寻找$num
// 简单说:PHP函数内的变量,就局限在函数的{}内.
/*
函数调用结束后,申请的独立的"调用空间",就释放掉.
下次,再调用,再申请,函数还得从头初始化.
*/
function t3() {
$age = 19;
$age += 1;
echo $age,'<br />';
}
t3();
t3();
t3();
// 小小计算器,只计算+ - * /
function calc($num1,$act,$num2) {
$res = null;
switch ($act) {
case '+' :
$res = $num1 + $num2;
break;
case '-':
$res = $num1 - $num2;
break;
case '*':
$res = $num1 * $num2;
break;
case '/':
if($num2 == 0) {
echo '0不能作除数';
break;
}
$res = $num1/$num2;
break;
}
return $res;
}
echo calc(3,'+',2),'<br />';
echo calc(3,'*',7),'<br />';
echo calc(3,'/',0),'<br />';
浙公网安备 33010602011771号