PHP -- 函数
2019-07-02 本文已影响0人
潘肚饿兵哥哥
<?php
header("Content-type:text/html;charset=utf-8");
/* 如果要输出下面这个*号组成的三角形,就要打这段代码,
写起来太麻烦了,而且写完了之后,改起来也很麻烦.
要重复使用这段代码,就要简化他,把他包起来,
直接调用就有效果,这就要用到函数
*/
/*
函数:
就是一段已命名的具有特定功能的代码块。
****************************************************
声明:
参数不给默认值:
function 函数名(参数){
函数体(包裹的部分)
}
参数给默认值:
如果参数只有一个数,那就直接写等号后面跟参数,不需要写[];
function 函数名(参数=[]){
函数体(包裹的部分)
}
***********************************************************
之所以要有参数是因为:
调用函数的时候是一整段直接调用的,但是函数里面的值是写死了的,所以就不方便了,
需要留口子改变函数的参数,以便不同的地方调用可以写入不同的参数
*******************************************************
函数命名规则:
函数名的命名规则和变量类似
不同的是函数名不区分大小写,变量区分
1.由数字、字母、下划线组成
2.数字不能开头
3.不能使用关键字
4.不区分大小写(定义的时候用驼峰法,调用的时候全部写小写都可以,但是一般不这么做)
5.由多个单词组成的话用驼峰法或下划线形式组成
调用:
函数名();
*/
// ***************************************************
/*
打印五角星:
不定义成函数的时候,要打印五角星就要写这一大段代码:
$row = 5;
for($i=1;$i<=$row;$i++){
for($m=1;$m<=$row-$i;$m++){
echo ' ';
}
for($j=1;$j<=2*$i-1;$j++){
echo '*';
}
echo '<br />';
}
*/
// *****************************************************
// 把打印五角星的代码块封成一个函数:
// function 函数名([参数1,参数2...]){
// 函数体(包裹的部分)
// }
//function 函数名([参数1=[默认值],参数2...]){
// 函数体(包裹的部分)
// }
//php的函数参数可以写默认值,js的不可以
//写默认值的作用是如果给了实参,那么就以实参为准,
//不给实参,就以形参设定的默认值为准.
//默认参数写在后面,形参写在前面,否则下面给实参的时候,连默认参数都还要再写一遍,否则会报错
//写法:
//function print_star($row=5]){
// 函数体(包裹的部分)
// }
//star 星星 start 开始
// function print_star(){
// $row = 5;
// for($i=1;$i<=$row;$i++){
// for($m=1;$m<=$row-$i;$m++){
// echo ' ';
// }
// for($j=1;$j<=2*$i-1;$j++){
// echo '*';
// }
// echo '<br />';
// }
// }
//
// print_star();//调用函数
// echo '<h1>123</h1>';
// print_star();
/* 这里调用函数可以打印五角星,但是两次打印出来的都是5层,
就是因为参数已经写死了,
所以要在小括号里写参数,以便不同的地方调用,还可以更改. */
// ***********************************************************
/*
function print_star($row){
for($i=1;$i<=$row;$i++){
for($m=1;$m<=$row-$i;$m++){
echo ' ';
}
for($j=1;$j<=2*$i-1;$j++){
echo '*';
}
echo '<br />';
}
}
print_star(3);//调用函数
echo '<h1>123</h1>';
print_star(5);
*/
// ***************************************************
//99乘法表:
function print_chengfabiao($width=600,$bgcolor){
echo '<table width="'.$width.'"bgcolor="'.$bgcolor.'">';
echo '<caption>九九乘法表</caption>';
for($i=1; $i<=9; $i++){
echo'<tr>';
for($j=1; $j<=$i; $j++){
echo'<td>', $j,'×',$i,'=',$i*$j,'</td>';
}
echo '</tr>';
}
echo '</table>';
}
print_chengfabiao($width=600,'skyblue');
//这里的$width=600虽然是默认参数,但是不写会报错,不写会默认只给了一个参数
//如果把默认参数写在后面去,前面放形参的话,那么下面只给一个实参就不会报错
?>
<?php
header("Content-type:text/html;charset=utf-8");
function add($number=100){
for($i=1, $sum=0; $i<=$number; $i++){
$sum+=$i;
}
echo $sum;
}
add(50);
?>

函数参数传递的两种方式:
1.值(变量)传递
2.引用传递
第一种:
值传递,返回值也是10;
定义函数只是定义,并没有执行,到下面$a=10;时程序才会执行
function test($a){
$a = 20;
}
$a = 10;
test($a);
echo $a;//结果是10

第二种:引用传递
将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。
<?php
function foo(&$var)
{
$var++;
}
$a=5;
foo($a);
// $a is 6 here
function foo(&$a)
{
$a=20;
}
$a=5;
test($a);
echo $a;
这里值是20;
?>
返回值:
如果在一个函数中调用 return 语句,将立即结束此函数的执行并将它的参数作为函数的值返回。
一个函数只能有一个返回值(不是只能设置一个return,而是最终只能接收一个返回值,例如,if里一个return。else里一个return,那也是只有一个返回值)
function 函数名(参数){
函数体(包裹的部分)
return 值;
}
<?php
header("Content-type:text/html;charset=utf-8");
function add($number=100){
for($i=1, $sum=0; $i<=$number; $i++){
$sum+=$i;
}
return $sum;
}
$sum = add();
echo '<h1 style="color:red">',$sum,'</h1>';
?>
返回值:

案例:
在页面中输入一个数字,并计算从1累加到这个数的总和:
<?php
function add($number=100){
for($i=1, $sum=0; $i<=$number; $i++){
$sum+=$i;
}
return $sum;
}
//$number = isset($_POST['number']);这里的isset()函数用于检测一个变量是否存在,返回值是布尔值
$number = isset($_POST['number'])?$_POST['number']:0;//如果输入数字则将数字赋给$number,否则将0赋给$number
//$number = $_POST['number']; 将html表单里获取到的数字赋给$number
$number = intval($number);//将输入的数字转为整数值,如果输入abc会转为0
$sum = add($number);//这里把接收到的number带入到代码中计算出累加的结果,,然后把数字赋给sum,最后在html里面调用$sum显示这个结果
?>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title></title>
</head>
<body>
<form action="" method="post"><!-- 这里默认get,用get表单里填什么都会在url里显示出来 post不会 action=""是要把表单提交给谁-->
<p>
输入<input type="text" name="number" />计算累加和
</p>
<p><button>计算</button></p>
</form>
<p>1+2+3...+<?php echo $number; ?>的结果 = <?php echo $sum;?></p>
<!--第一个<?php echo $number; ?>表示要累加到数字几,这个数字是接收的用户输入的数字。-->
</body>
</html>
结果:

上面例子的拓展:
html代码中最下面那段代码其实只要输出结果的p标签就可以了,之所以还要加一个if是因为假如输入的数字是负数的话,他还是会计算,会显示输出的结果是0,这是错的。所以,加了这个if之后,如果是正数就会计算,如果是负数他就不计算
<?php
function add($number=100){
for($i=1, $sum=0; $i<=$number; $i++){
$sum+=$i;
}
return $sum;
}
//$number = isset($_POST['number']);这里的isset()函数用于检测一个变量是否存在,返回值是布尔值
$number = isset($_POST['number'])?$_POST['number']:0;//如果输入数字则将数字赋给$number,否则将0赋给$number
//$number = $_POST['number']; 将html表单里获取到的数字赋给$number
$number = intval($number);//将输入的数字转为整数值,如果输入abc会转为0
$sum = add($number);//这里把接收到的number带入到代码中计算出累加的结果,,然后把数字赋给sum,最后在html里面调用$sum显示这个结果
?>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title></title>
</head>
<body>
<form action="" method="post"><!-- 这里默认get,用get表单里填什么都会在url里显示出来 post不会 action=""是要把表单提交给谁-->
<p>
输入<input type="text" name="number" />计算累加和
</p>
<p><button>计算</button></p>
</form>
<!-- 下面这段代码其实只要中间的p标签就可以了,之所以还要加一个if是因为假如输入的数字是负数的话,他还是会计算,会显示输出的结果是0,这是错的。所以,加了这个if之后,如果是正数就会计算,如果是负数他就不计算 -->
<?php
if($number>0){
?>
<p>1+2+3...+<?php echo $number; ?>的结果 = <?php echo $sum;?></p>
<?php
}
?>
</body>
</html>
打印等腰三角形:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title></title>
</head>
<body>
<form action="" method="post">
//action=""是提交到哪一个文件,如果是本文件,可以不写
//post是以哪一种方式提交,接收的时候同样是以这种方式接收
<p>
输入层数:<input type="text" name="row" />
</p>
<p><button>打印星星</button></p>
</form>
<?php
function print_star($row = 5){
for($i=1;$i<=$row;$i++){
for($m=1;$m<=$row-$i;$m++){
echo ' ';
}
for($j=1;$j<=2*$i-1;$j++){
echo '*';
}
echo '<br />';
}
}
$row = isset($_POST['row'])?$_POST['row']:0;
// 接收用户输入的数字row,如果接收到了,就赋给$row,如果没有接收到数字,就返回0给$row
$row = intval($row);//intval() 函数用于获取变量的整数值,就是把这个获取到的数转为整数。
//intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。
print_star($row);//将接收到的数作为实参传给函数进入循环
?>
</body>
</html>

作业:
计算器:
加法:
<?php
function counter($num1, $num2,$oper){//operation运算符
$sum = 0;
switch($oper){
case '+':
$sum = $num1 + $num2;
break;
}
return $sum;
/* if($oneNumber && $twoNumber != null){
if('name="plus"'){
echo $oneNumber,'+',$twoNumber;
}
} */
}
$num1 = 10;
$num2 = 5;
$oper = '+';
$sum = counter($num1,$num2,$oper);//这个$sum不是counter函数里的$sum,而是这个函数的实参叫$sum,虽然看起来是一样的,但是实际上不一样
echo "{$num1}{$oper}{$num2}={$sum}";
?>

如果除数是0的情况:
<?php
header("Content-type:text/html;charset=utf-8");
function counter($num1, $num2,$oper){//operation运算符
$sum = 0;
switch($oper){
case '+':
$sum = $num1 + $num2;
break;
case '-':
$sum = $num1 - $num2;
break;
case '*':
$sum = $num1 * $num2;
break;
case '/':
if($num2 == 0){
$sum = '除数不能为0';
}else{
$sum = $num1 / $num2;
}
break;
default:
$sum = '操作符有误';//如果输入的不是这四个符号中的一个,就输出这句话
}
return $sum;
}
$num1 = 10;
$num2 = 0;
$oper = '/';
$sum = counter($num1,$num2,$oper);//这个$sum不是counter函数里的$sum,而是这个函数的实参叫$sum,虽然看起来是一样的,但是实际上不一样
if(is_numeric($sum)){//is_numeric($sum);判断一个变量是否为数字或数字字符串
echo "{$num1}{$oper}{$num2}={$sum}";//如果这个$sum是一个数字,就正常计算
}else{
echo $sum;//如果$sum不是一个数字,或者是0,就输出一句话
}
?>

完整的计算器:
<?php
header("Content-type:text/html;charset=utf-8");
function counter($num1, $num2,$oper){//operation运算符
$sum = 0;
switch($oper){
case '+':
$sum = $num1 + $num2;
break;
case '-':
$sum = $num1 - $num2;
break;
case '*':
$sum = $num1 * $num2;
break;
case '/':
if($num2 == 0){
$sum = '除数不能为0';
}else{
$sum = $num1 / $num2;
}
break;
default:
$sum = '操作符有误';//如果输入的不是这四个符号中的一个,就输出这句话
}
return $sum;
}
// 用户在输入框输入什么这里就接收什么
// 接收用户输入的数字num1、num2,如果接收到了,就赋给$num,如果没有接收到数字,就返回null给$num,操作符oper也是一样的原理
$num1 = isset($_POST['num1'])?$_POST['num1']:null;
$num2 = isset($_POST['num2'])?$_POST['num2']:null;
$oper = isset($_POST['oper'])?$_POST['oper']:null;
//isset() 函数用于检测变量是否已设置并且非 NULL。
//如果已经使用 unset() 释放了一个变量之后,再通过 isset() 判断将返回 FALSE。
//若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。
if(isset($num1) && isset($num2) && isset($oper)){//若数字1,数字2,操作符都存在且不为空,则运算
$sum = counter($num1,$num2,$oper);//这个$sum不是counter函数里的$sum,而是这个函数的实参叫$sum,虽然看起来是一样的,但是实际上不一样
if(is_numeric($sum)){//is_numeric($sum);判断一个变量是否为数字或数字字符串
$result = "{$num1}{$oper}{$num2}={$sum}";//如果这个$sum是一个数字,就正常计算
}else{
$result = $sum;//如果$sum不是一个数字,或者是0,就输出一句话
}
}
?>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title></title>
</head>
<body>
<form action="" method="post">
<p>输入第一个数:<input type="text" name = "num1"></p>
<p>输入第二个数:<input type="text" name = "num2"></p>
<p>
<input type="radio" name = "oper" value = "+" checked/>+<!--checked 默认选中此选项-->
<input type="radio" name = "oper" value = "-" />-
<input type="radio" name = "oper" value = "*" />×
<input type="radio" name = "oper" value = "/" />÷
</p>
<p><button>计算:</button></p>
</form>
<!-- 在这里输出计算的结果: -->
<h3>
<?php
if(isset($result)){
echo $result;
}
?>
</h3>
</body>
</html>

打印几种图形:
<?php
#打印直角三角形
function print_star1($row = 5){
for($i=1;$i<=$row;$i++){
for($j=1;$j<=2*$i-1;$j++){
echo '*';
}
echo '<br />';
}
}
#打印等腰三角形
function print_star2($row = 5){
for($i=1;$i<=$row;$i++){
for($m=1;$m<=$row-$i;$m++){
echo ' ';
}
for($j=1;$j<=2*$i-1;$j++){
echo '*';
}
echo '<br />';
}
}
#打印空心三角形
function print_star3($row = 5){
for($i=1; $i<=$row; $i++){//输出的每一行
for($m=1; $m<=$row-$i; $m++){//每一行的空格数
echo ' ';
}
for($j=1; $j<=(2*$i-1); $j++){//每一行的星号个数
if($i==1 || $i==$row){//如果是第一行和最后一行全打印
echo '*';
}else{
if($j==1 || $j==2*$i-1){//第一个*和最后一个*打印
echo '*';
}else{//其他时候打印空格
echo ' ';
}
}
}
echo '<br/>';
}
}
#打印菱形
function print_star4($row = 5){
$top_row = $row-1;
for($i=1;$i<=$top_row;$i++){
for($m=1;$m<=$row-$i;$m++){
echo ' ';
}
for($j=1;$j<=2*$i-1;$j++){
echo '*';
}
echo '<br />';
}
for($i=$row;$i>=1;$i--){
for($m=1;$m<=$row-$i;$m++){
echo ' ';
}
for($j=1;$j<=2*$i-1;$j++){
echo '*';
}
echo '<br />';
}
}
?>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title></title>
</head>
<body>
<form action="" method="get">
<p>
请输入层数:<input type="text" name = "row" />
</p>
<p>
请选择图形:
<select name = "style">
<option value="1">直角三角形</option>
<option value="2">等腰三角形</option>
<option value="3">空心三角形</option>
<option value="4">菱形</option>
</select>
</p>
<p><button>打印图形</button></p>
</form>
<?php
//接收html的数据:用户输入的层数 和 选择的图形
$row = isset($_GET['row'])?$_GET['row']:null;
$style = isset($_GET['style'])?$_GET['style']:null;
//isset()用于检测变量是否已设置并且非NULL,就是检查是否接收到数据
if(isset($row) && isset($style)){
// switch($style){
// case 1: print_star1($row); break;
// case 2: print_star2($row); break;
// case 3: print_star3($row); break;
// case 4: print_star4($row); break;
// }
//注释掉的这段代码和下面的两行代码功能一样
//case1 就对应style1,其他三个也一样
//
$fun_name = 'print_star'.$style;
$fun_name($row);
}
?>
</body>
</html>
