函数
函数是在代码执行的阶段,碰到函数名字的时候才会调用,不是在编译阶段,所以函数调用可以在定义之前。
常见函数规范命名:
1.驼峰法:除了第一个单词,后面单词首字母都大写。例如showParentInfo()
2.下划线法,单词都小写,下划线隔开。例如:show_parent_info()
函数形式参数的默认值
用法:
function add($a=0,$b=0){
}
注意事项:
1.默认值的定义是放在最后边的,不能左边形参有默认值但是右边没有。例如:实参少于形参的情况
2.实参可以比形式参数多,函数内部不用而已
3.实参可以比形参少,如果形式参数都有默认值的话(从左往右传值)
4.实参不能少于形参的个数(如果形参没有默认值的话)
函数参数引用传值
是指函数内部对外部数据的值进行直接操作(实参的地址)
例如:
funciton hanshuming(形参1,&形参2){
函数体;
}
注意:在实际使用时,传递参数跟平常一样,传入时必须是变量
例: hanshuming($a,$b);
函数返回值
1.如果函数没有设置return,则函数默认返回Null
2.return可以在文件中直接使用(不在函数里面):代表文件将结果return后面跟的内容,转交给包含当前文件的位置(通常在系统配置文件中使用较多)。在文件中也代表终止文件后面的代码:return之后的内容不会执行。
参考视频:https://www.bilibili.com/video/BV18x411H7qD
作用域
1.函数内部也不可直接访问全局变量,可以通过$GLOBALS以数组的形式访问或者引用传值实现或者下述方法。
2.global关键字:
global $a; //不能赋值
则在$GLOBALS二维数组中存在a对应值为1
①如果使用global定义的变量名在外部存在(全局变量),name系统在函数内部定义的变量直接指向外部全局变量所指向的内存空间(同一个变量)。
②如果使用global定义的变量名在外部不存在(全局变量),系统会自动在全局空间(外部)定义一个与局部变量同名的全局变量。
本质的形式:在函数的内部和外部,对一个同名变量(全局和局部)使用同一块内存地址保存数据,从而实现共同拥有。
静态变量
关键字:static
是在函数内部定义的变量,用来实现跨函数共享数据的变量。函数运行结束所有局部变量都会清空,如果重新运行一下函数,所有的局部变量又会重新初始化。
注意:跨函数的意思是同一个函数多次调用这个变量而不是跨越这个函数
基本语法:
function 函数名(){
//定义变量
static $变量名 = 值; //通常会在定义的时候就直接赋值
}
原理:
系统在进行编译的时候就会对static这一行进行初始化:为静态变量赋值
函数在调用的时候,会自动跳过static关键字这一行。
静态变量的使用
1.为了统计当前函数被调用的次数
2.为了统筹函数多次调用得到的不同结果(递归思想)
可变函数
当前有一个变量所保存的值刚好是一个函数的名字,那么就可以使用变量+()来充当函数名使用
例如:
function display(){
echo 'Nihao';
}
$func = 'display';
$func();
将一个用户定义的函数传入给另外一个函数(函数名)去使用的过程,称之为毁掉过程,而被传入的函数称之为回调函数。
匿名函数
没有名字的函数
基本语法:
变量名=function(){
函数体0
}
例如:
$func=function(){
echo 'nihao';
};
//调用匿名函数
$func();
变量保存匿名函数,本质的道德是一个对象(closure)
闭包
简单理解:函数内部有一个局部变量(要执行的代码块),在函数执行之后没有被释放,是因为在函数内部还有对应的函数在引用(函数的内部函数:匿名函数)
伪类型
伪类型:假类型,实际上在PHP中不存在的类型,通过伪类型可以帮助程序员更好的查看操作手册从而更方便学习
伪类型主要有两种:在三大类八小类之外
Mixed:混合的,可以使多种PHP中的数据类型和
Number:数值的,可以使任意数值类型(整形和浮点型)
常用系统函数之输出函数和时间函数
1 有关输出的函数
echo
var_dump
print:类似于echo输出提供的内容,本质是一种结构(不是函数),返回1 可以不使用();
print_r():类似于var_dump()函数 ,但是比var_dump简单,不会输出数据的类型,只会输出值(数组打印使用比较多)
2 有关时间的函数
data():按照指定格式对应的时间戳(从1970年格林威治时间开始计算的秒数),如果没有指定特定的时间戳,那么就是默认解释当前时间戳
time():获取当前时间对应的时间戳
microtime():获取微秒级别的时间
strtotime():按照规定格式的字符串转换成时间戳
3 有关数学的函数
max():指定参数中最大的值
min():比较两个数中较小的值
rand():得到一个随机数,指定区间的随机整数
mt_rand():与rand一样,只是底层结构不一样,效率比rand高,一般用这个
round():四舍五入
cell():向上取整
floor():向下取整
pow():求指定数字的指定指数次结果:pow(2,8)=256
adb():求绝对值
sqrt():求平方根
4 有关函数的函数
function_exists():判断指定的函数名字是否在内存中存在,帮助用户不去使用一个不存在的函数,让代码安全性更高
func_get_arg():在自定义函数中去获取指定数值对应的参数
func_get_args():在自定义函数中获取所有的参数,得到的是一个数组
func_num_rgs():获取当前自定义函数的参数数量
错误处理
系统或者用户在对某些代码进行执行时发现有错误,就会进行错误处理的形式告知程序员。
错误分类
1 语法错误(parse error)
2 运行时错误(runtime error)条件不满足导致的错误,代码编译通过
3 逻辑错误
错误代号
所有看到的错误代码在PHP中都被定义成了系统常量(可以直接使用)
1 系统错误
E_PARSE:编译错误,代码不会执行
E_ERROR:fatal error,致命错误,导致代码不能正确继续执行(出错的位置断掉)
E_WARING:warning,警告错误,不会影响代码执行,但是可能得到意想不到的结果
E_NOTICE:notice,通知错误,不会影响代码执行
2 用户错误 E_USER_ERROR E_USER_WARING E_USER_NOTICE
用户在使用自定义错误触发的时候,会使用到的错误代号(系统不会用到)
3 其他:E_ALL,代表所有的错误(通常在错误控制是使用较多) ,建议在开发过程中使用
所有E开头的错误常量其实都是由一个字节存储,然后每一种错误占据一个对应的位。,,如果想进行一些错误的控制。可以使用位运算
排除通知级别notice:E_ALL&~E_NOTICE
只要警告和通知:E_WARING|E_NOTICE
错误触发
程序运行时触发:主要针对代码的语法错误和运行时错误
人为触发:知道某些逻辑可能会出错,从而使用对应的判断代码来触发相应的错误提示
trigger_error(); 默认notice,代码会继续执行
trigger_error('除数不能为0',E_USER_ERROR); 代码不会继续执行
错误设置
错误显示设置
两种方式来设置当前脚本的错误处理
1 php的配置文件,全局配置:php.ini
display_error 是否显示错误
error_reporting 显示什么级别的错误
2 可以在运行的php脚本中去设置 在脚本中定义的配置项级别比php.ini中级别高(通常在开发中都会在代码中去进行控制和配置)
error_reporting() 设置对应的错误显示级别
ini_set(‘配置文件中的配置项’,配置值)
错误日志设置
生产环境中一般不显示错误
在php配置文件中或者代码中 ini_set设置对应的error_log
1 开启日志功能
log_errors on/off
2 指定路径
自定义错误处理
最简单的错误处理:trigger_errors 函数,但是该函数不会阻止系统报错
PHP提供了一种用户处理错误的机制:用户自定义错误处理函数,然后将该函数增加到系统错误处理的句柄中,系统再碰到错误后,使用用户定义的错误函数
1 如何将用户自定义的函数放到系统中 set_error_handler()
2 自定义错误函数 系统有要求
代码实现
1 自定义错误处理函数:注意参数
https://www.bilibili.com/video/BV18x411H7qD?p=75
2 注册自定义函数:修改错误处理机制