【四】php 函数
一:函数
作用:为了分割那些能够独立完成有明确任务的代码,更易于阅读
调用函数:function_name(args1,args2...);
args可以是任何一种php变量,包括数组或对象
函数名不区分大小写,变量名区分
命名规则:
- 不能和已有的函数重名
- 只能包含字母、数字和下划线
- 不能以数字开头
php函数不支持重复使用函数名称
作用域:
- 局部变量(函数作用域):函数内部声明的变量在函数外不可用
- 全局变量(全局作用域):函数外部声明的变量在函数内不可用
global:制定一个在函数中定义或使用的变量变量具有全局作用域
function func(){ global $var; $var="hello"; } func(); echo $var; //输出hello return:将终止函数的执行
二:自定义函数
基本概念:为完成某一功能的程序指令的集合,成为函数
语法结构:
function 函数名(参数列表){
//函数体(完成某一功能的指令集合,必须有);
//return 语句;(return语句主要的用处是返回一个结果)
}
特点:
- 函数的参数列表可以是多个
- 参数的数据类型可以是php语言支持的任意类型
- 函数的开头的字幕不要用数字或者特殊字符开头
- 函数名不区分大小写,变量区分大小写
- 函数内的变量是局部的
入门案例:使用函数写一个+-*/的计算器
function.php
1 <?php 2 //1.function是个关键字 3 //2.jisuan是函数名 4 //$num1,$num2,$oper是函数的参数 5 function jisuan($num1,$num2,$oper){ 6 $res=0; 7 switch ($oper) { 8 case '+': 9 $res=$num1+$num2; 10 break; 11 case '-': 12 $res=$num1-$num2; 13 break; 14 case '*': 15 $res=$num1*$num2; 16 break; 17 case '/': 18 $res=$num1/$num2; 19 break; 20 default: 21 echo "youwu"; 22 break; 23 } 24 return $res; 25 } 26 ?>
function1.php
1 <?php 2 //引入你需要的php文件 3 require 'function.php'; 4 $num1=22; 5 $num2=11; 6 $oper="-"; 7 $res=jisuan($num1,$num2,$oper); 8 echo "jisuanjieguo=".$res; 9 ?>
三:引入其他页面的函数
一共有四种方式:
- require
- requice_once
- include
- include_once
require和require_once的区别为:前者包含文件,后者会判断是否已经包含过了,如果包含过了则不包含文件
require和include 的区别:
- 相同点就是都可以引入页面
- 不同点是include如果出现错误可以继续执行下面的代码,则require出现错误会终止程序
-
1.require是一个函数,include是一个关键字
2.require是无返回值,include有返回值
3.include()会产生一个警告,而require()则导致一个致命的错误(出现错误,脚本停止执行
在开发过程中,基本使用用require_once
1 <?php 2 //使用别的php文件中定义的函数 3 //第一种方式 4 //require 'aa.php'; 5 //2.通过变量方式引入 6 // $filename="aa.php"; 7 // require $filename; 8 // 3. 9 //require("aa.php"); 10 //include "aa.php"; 11 include_once "aa.php"; 12 include_once "aa.php"; 13 abc(); 14 echo "qqq"; 15 ?>
注意:只要一调用函数,则php就会开辟一个新栈。各个栈里面的变量是相互独立的
1 function abc($n){ 2 if ($n>2) { 3 abc(--$n); 4 } 5 echo '$n='.$n."<br/>"; 6 } 7 abc(4); 8 打印结果: 9 $n=2 10 $n=2 11 $n=3
四:递归函数
递归函数:函数调用自己本身
递归函数为自调用函数,在函数体内直接或间接自己调用自己,但需要设置自调用的条件,若满足条件,则调用函数本身,若不满足则终止本函数的自调用,然后把目前流程的主控权交回给上一层函数来执行。
/** * 第一步,执行test("hello"),然后因为5>0,执行test("ello")(注意:后面还有没来得及执行的echo h) * 第二步,执行test("ello"),然后因为4>0,执行test("llo")(注意:同样后面还有没来得及执行的 echo e) * 第三步,执行test("llo"),然后因为3>0,执行test("lo")(注意:同样后面还有没来得及执行的 echo l) * 第四步,执行test("lo"),然后因为2>0,执行test("o")(注意:同样后面还有没来得及执行的 echo l) * 第五步,执行test("o"),然后因为1>0,执行test("")(注意:同样后面还有没来得及执行的 echo o) * 第六步,执行test (""),此时0>0的条件不满足,不在执行test()函数 * 而是echo “<-->”,并且执行后面的 echo substr($str,0,1);此时函数已经不再调用自己,开始将流程的主控权交回给上一层函数来执行,也就是开始执行刚刚所有test()函数没来得及输出的最后一个echo。 * o的一层是l,也就是输出l,l的上一层是l, l的上一层是e,e的上一层是h,也就是输出h,h没有上一层所以呢输出的内容就是hello<-->olleh */ function test($str){ if (strlen($str)>0){ test(substr($str,1)); } echo substr($str,0,1); return ; } test("hello"); //olleh