函数

/** 
燕十八 公益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 />';

posted on 2012-09-26 16:14  besile  阅读(263)  评论(0)    收藏  举报