(独孤九剑)--函数
【一】函数基本语法概述
简介:函数就是功能,调用一个函数就是在调用一个功能
特性:①可以通过函数名调用;②可以反复调用
分类:自定义函数,系统函数
案例:比如之前介绍过的几个函数,例如is_int(),phpinfo()等函数,例如
<?php $value = 66.6; var_dump(is_int($value));//输出结果bool(false) ?>
【二】自定义函数
①函数名与变量名命名规则基本一样。但是不区分大小写,在开发时最好保持调用和命名时函数名一致
命名注意:函数名只能是数字、字母、下划线的组合,之间不能包含空格,数字不能放在首位
②所谓参数就是变量,即形参。而调用时传入的则为实参
③函数的功能体,即函数的具体功能用大括号{}括起来,代表一个函数的功能区间
④函数可以有返回值,也可以没有返回值
⑤return执行,其后的代码均不执行
⑥函数不能被重载,即相同文档下不能被定义两次
⑦函数体的参数如果定义了,调用时未传参数,就会报错
Warning: Missing argument 1 for value()//翻译为警告:value()缺少参数1
⑧函数体的参数如果有默认值,调用时参数可以不填,代码也不会报错
<?php $name = "我被传入调用了"; value($name); value(); function value($par = "我是默认形参"){ echo "$par"; }
//输出我被传入调用了,我是默认形参 ?>
⑨函数执行完后,return可以将函数体内的值带到函数体外(注意:return只返回,不会输出,若想输出看到结果可以用echo)
<?php function value(){ $a = 1; $b = 2; $c = $a + $b; return $c; } $fun = value(); echo "函数执行返回结果为".$fun; ?>
案例:传参调用
<?php $name = "我被传入调用了"; value($name); function value($par){ echo "$par";//输出我被传入调用了 } ?>
【三】自定义函数---变量函数
可变函数可以理解为可变变量的变形表达
①先来回顾下可变变量:
<?php $hello = "world"; $world = "你好"; echo $$hello; ?>
$$hello会解析两次
注意:$$hello外不能加双引号,否则只会按照双引号默认的解析一次的方式来解析
②变量函数
可变函数也叫变量函数,可以用于以后的MVC(模块视图控制器的设计模式),面向对象的设计模式等。比如构造函数里判断有没有登录,登录之后有无操作权限的问题等
这里我通过改变变量$fu,来调用不同的函数
<?php function one(){ echo "函数1"; } function two(){ echo "函数2"; } $fu = 'one';//输出函数1 $fu = 'two';//输出函数2 $fu(); ?>
【四】自定义函数---回调函数
回调函数是一种可以配合变量函数、匿名函数实现更加优化和复杂的一种函数结构
简单理解:就是带有return返回值的函数的随意调用。
场景:在处理一个功能的同时,为了让这个功能的自定义能力在强一些。所以在调用这个函数的时候,还可以传入另一个函数协调处理。
<?php function main($a,$b,$count){ if(!is_callable($count)){ return false; } echo $a+$b+$count($a,$b); } function part_plus($x,$y){//回调函数+ $result = $x+$y; return $result; } function part_less($x,$y){//回调函数- $result = $x-$y; return $result; } echo main(1,2,'part_plus');//调用+ echo main(1,2,'part_less');//调用- ?>
【五】自定义函数---匿名函数
匿名函数就是没有名字的函数,写法较为灵活
写法一:变量式匿名函数
直接把函数赋值给变量,调用变量即为调用函数
<?php $show = function($value){//函数赋值给变量 echo $value."你好"; }; $show("Tony");//调用变量 ?>
写法二:回调式匿名函数
就是将回调函数不用加函数,直接写到调用处
将上面回调函数的案例代码修改一下,把加法的回调函数直接写成匿名函数调用
<?php function main($a,$b,$count){ if(!is_callable($count)){ return false; } echo $a+$b+$count($a,$b); } echo main(1,2,function($x,$y){//调用 $result = $x+$y; return $result;//返回值 }); ?>
【六】自定义函数---内部函数
内部函数就是在函数内部又声明了一个函数
注意:①内部函数名,不能是已存在的函数名
<?php function parent(){ echo "我是父级函数"; function child(){ echo "我是子级函数"; }; }; // child();调用失败,因为还不存在 parent();//现在可以调用子级函数了 child();//因为parent()的执行,使得child()变为已定义的函数 ?>
【七】自定义函数---变量作用域
函数里的参数仅在函数内部执行。函数内声明的变量与函数外变量无关
个别情况:①想在函数外部执行函数内的私有变量;②想在函数内执行函数外变量
这时就需要用到超全局变量,例如$_COOKIE,$_SESSION,$_FILES,$_GET,$_POST,$_REQUEST等
如果想在函数内部访问外部变量,可以用超全局变量$_GLOBALS()将变量转为全局变量(注意:$GLOBALS['var']是外部的全局变量本身)
<?php $value = 1; function parent(){ echo $GLOBALS['value']; } parent(); ?>
或者利用global传递变量(注意:global是起传递参数的作用,而并非使变量的作用域为全局)
global可以跟多个变量,例global $a,$b,$c等等
<?php $value = 1; function parent(){ global $value; echo $value; } parent(); ?>
案例:利用超全局变量$_GLOBALS()将变量转为全局变量,并在函数内部修改外部变量大小
<?php $value = 1; function parent(){ // global $value; $change = 2; $GLOBALS['value'] = $change; echo $GLOBALS['value']; } parent(); echo $value; ?>
代码解析:这里我用$_GLOBALS()将变量转为全局变量,所以即使在函数内部。仍然可以覆盖变量值
【八】自定义函数---参数引用
函数参数的引用于变量类似
(1)先来回顾下变量的引用:
<?php $value1 = 1; $value2 = &$value1; $value1 = 2; echo $value1.$value2;//输出结果2,2 ?>
代码里&$value1里&为取地址符号,这里将value1的地址指向value2,两者指向了同一个内存地址。所以,只要改变一个,另一个也跟着变化
(2)函数参数的引用
如果形参加入了取地址符号,那么参数引用就类似于$value2 = &$value1,就是将形参和实参指向同一个内存。
此时如果形参在函数体内发生变化,那么实参也会发生变化
<?php $value1 = 1; function demo(&$n){ $n = 10; return $n; } echo demo($value1);//输出10 echo $value1;//输出10 ?>
【九】自定义函数---递归函数
主要用在文件和文件夹操作
例如:读取Submit文件夹下多少个子文件,或者具体递归查找某个文件
特性:递归函数与for循环类似,必须有结束条件,不然会陷入死循环
递归函数的效率相对于for和switch较低,运用较少,了解即可
【十】自定义函数----静态变量static
特点:声明一个静态变量,第二次调用函数的时候,静态变量不会再初始化。
场景:例如想统计函数被多次调用的次数,可以在函数内部定义一个静态变量,从而保证变量不会在每次加载时被初始化
<?php function demo(){ static $num = 0; $num++; echo "我被调用了".$num."次<br>"; } demo(); demo(); demo(); ?>
原理:静态变量的值在计算机内存会自动保存;而正常变量的值在使用完之后便销毁
【十一】系统内置函数
对于PHP服务器开发,手册十分重要
使用函数重点:①了解函数功能,特别是常用函数的功能;②了解函数参数;③了解函数返回值
列举6个常用函数注意点
(1)直接返回boolean
作用:拷贝一个文件,参数为文件(string类型)
<?php if(copy('a.txt', 'b.txt')){ echo "复制成功"; }else{ echo "复制成功失败"; } ?>
(2)带有mixed参数的函数调用(mixed表示任何类型的数据),如Array_unshift()
(3)参数中带有&(取地址符)的参数,一定要传入一个变量作为参数,函数内部改变值
(4)带有[]的参数表示可选项
(5)带有callback的函数,表示回调函数,需要传一个函数进来。Array_map
(6)函数支持的版本
【十二】文件包含函数
实际开发里常把程序共用代码放到一个文件里,使用时调用即可,提高了代码的重用率,同时利于编写和维护。
include,require,include_once,require_once四种写法,参数为文件名(string类型)
(1)include 和 require 语句
通过 include 或 require 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前)。
include 和 require 语句是相同的,除了错误处理方面:
语法:
include 'filename'; require 'filename';
错误处理方面对比:
①require 会生成致命错误(E_COMPILE_ERROR)并停止脚本,通常包含极为重要的文件
②include 只生成警告(E_WARNING),并且脚本会继续
注意:出错后会出现warning警告,而警告不会终止程序的执行
因此,如果希望继续执行,并向用户输出结果,即使包含文件已丢失,就得使用 include。
否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,必须始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。
作用:包含文件省去了大量的工作。这意味着可以为所有页面创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,只需更新这个页头包含文件即可
使用场景:
①require :当文件被应用程序请求时使用require,因为在框架、CMS或者复杂的PHP应用程序编程中,必须始终使用 require 向执行流引用关键文件。在某个关键文件意外丢失的情况下,这有助于提高应用程序的安全性和完整性。
②include:当文件不是必需,且应用程序在文件未找到时应该继续运行时使用include。因为如果希望继续执行,并向用户输出结果,即使包含文件已丢失,就得使用 include。
(2)include_once()和require_once()
include_once和require_once:除了功能外,还可以检测,确保文件只被包含一次
开发里推荐使用include_once和require_once,确保文件不会被重复调用
【十三】数学常用函数
列举几个常用数学函数
注意:以下函数只能传入一个参数
①绝对值:abs()
<?php $value = abs(-4); echo $value;//输出-4的绝对值4 ?>
②向上取整:ceil()
③向下取整:floor()
④取余:fmod()
⑤返回数的n次方:pow()
⑥保留指定小数点:round()
<?php $value = round(2.2356,2); //保留2位小数点 echo $value; ?>
⑦平方根:sqrt()
<?php $value = sqrt(16); echo $value;//输出4 ?>
⑧最大值:max()---输出数组或者数值最大值
<?php $array = array('age' => 2,'age' => 3,'age' => 4 ); $value = max($array); //输出数组里最大值4 $value = max(1,2,3)//输出最大值3 echo $value; ?>
⑨最小值:min()---输出数组或者数值最小值
⑩随机范围整数:mt_rand()
<?php $array = mt_rand(0,1); echo $array;//输出0或1 ?>
⑪随机范围整数:rand()
⑫获取圆周率:pi()
【十四】时间函数
首先了解几个概念时区,世界时,unix时间戳
时区:1884年华盛顿召开国际经度会议,为了克服时间上的混乱,将全球划分为24个时区。在中国,采用北京所在的东8区为全国统一时间。因此有了时差
世界时:以格林尼治时间(英国某地区)作为世界时间。国际上某些重大事件用其来标记
unix时间戳:从Unix纪元(1970年1月1日零时)开始到某一时间的秒数
(1)设置时区
通常在配置文件里写好时区设置,每次程序运行,都会读取时区的设置来显示时间
PHP中设置时区方法小结
设置时区的函数:date_default_timezone_set(‘');
获取当前时区的函数:date_default_timezone_get(‘');
配置好之后重启一下生效
(2)获取当前unix时间戳
time()函数用于获取当前unix时间戳
(3)date() 函数用于对日期或时间进行格式化
语法:date(format,timestamp)
日期(格式,时间戳)
获取简单时间:
format格式参数是必需的,它们规定如何格式化日期或时间
下面列出了一些常用于日期的字符:
d - 表示月里的某天(01-31)
m - 表示月(01-12)
Y - 表示年(四位数)
1 - 表示周里的某天
其他字符,比如 "/", "." 或 "-" 也可被插入字符中,以增加其他格式。例如
<?php echo "今天是".date("Y年m-d") .date("-l"); //打印结果今天是2017年03-12-Monday ?>
【十五】日期验证函数
常用于检测用户输入的时间是否正确
语法:checkdate(int $day,int $month,int $year)
如果时间日期有效就返回true,否则返回false
<?php date_default_timezone_set("Asia/Shanghai"); var_dump(checkdate(2, 4, 2019)); //返回true
var_dump(checkdate(2,40,2019)); //返回fasle ?>
【十六】获取本地化时间戳函数
例如:获取从昨天到此刻的注册用户
需要两步
(1)得到当前unix时间戳,用time()函数即可;
(2)获取昨天指定时间,需要用到mktime()函数(即:make time创建时间),返回时间戳
语法:mktime(时(必选),分,秒,月,日,年),其中小时为必选参数
返回的时间戳对用户意义不大,所以需要date函数完成时间的转换
<?php $time = mktime(10,20,20,3,8,2018); echo date('y年m月d日',$time);//输出18年03月08 ?>
(3)strtotime()
strtotime() 转换字符串返回时间戳,创建日期
语法:strtotime(time,now)
预设时间(具体时间,当前)
下面的例子通过 strtotime() 函数创建日期和时间:
<?php $d=strtotime("10:38pm April 15 2015"); echo "创建日期是 " . date("Y-m-d h:i:sa", $d); //输出:创建日期是 2015-04-15 10:38:00am ?> <?php $d=strtotime("now"); echo "当前日期是 " . date("Y-m-d h:i:sa", $d); //输出:当前日期是 2017-03-12 10:38:00am ?>
PHP在将字符串转换为日期这方面非常聪明,所以能够使用各种值:tomorrow,next Saturday,+3 Months等。但是strtotime() 并不完美,所以必须记得检查放入其中的字符串。
案例:输出举例国庆放假还有几天
<?php date_default_timezone_set("Asia/Shanghai"); $d1=strtotime("October 1"); $d2=ceil(($d1-time())/60/60/24); echo "距离国庆放假还有:" . $d2 ." 天。"; ?>
代码解析:
①time()返回当前时间戳;
②ceil()函数,向上取整(注意:与四舍五入不同,只要多出一点就向上取)
Math.ceil(5.1)//取整为6 Math.ceil(5.05)//取整为6 Math.ceil(5)//取整为5
智能用法:
strtotime("+1 day")当前时间加1天;strtotime("+1 week")当前时间加1周
【十七】程序执行时间检测
经常需要记录程序执行的时间
测试某个函数运行效率的快慢,有时需要根据程序执行时间做效率判断,有时程序太快,甚至到微秒级别
所以我们用microtime()函数,返回当前时间戳和微秒数(精确到微秒)
传入参数true,会返回一个浮点类型的时间戳,便于运算
<?php $time_start = microtime(true); for($i=0;$i<100000;$i++){ }; $time_end = microtime(true); $time = $time_end - $time_start; echo "$time"; ?>
【十八】字符串常用函数
参考:https://www.cnblogs.com/weblm/p/5791016.html
数组,字符串,数据库是函数里最常用的3类函数,
(1)单字节字符串处理函数
(2)多字节字符串处理函数
(3)字符串编码转换函数
注意点:①中文在GBK编码下为2字节,在UTF-8下为3字节。而函数只能处理英文和数字,不能处理中文
(1)单字节字符串处理函数
统计:
strlen() 统计字符串长度
删除:
1. trim() 删除字符串两端空格
2. ltrim() 删除字符串左侧空格
3. rtrim() 删除字符串右侧空格
4. chop() rtrim()的别名
填充:
str_pad() 填充指定长度字符串
str_repeat() 重复使用指定字符串
加密:
md5() 字符串md5编码加密
sha1() 俗称傻1加密
其他:
strrev() 反转字符串
<?php echo strrev("Hello Tony!");//!ynoT olleH ?>
分割:
chunk_split() 按照指定长度,用给定字符分割----------实例chunk_split('123456789',3,',') 分割为123,456,789
大小写转换:
strtolower() 字符串小写
strtoupper() 字符串大写
ucfirst() 首字母大写
ucwords() 每个首字母大写
(2)多字节字符串处理函数
mb_和conv_用于处理多字节字符,例如:中文
(3)字符串编码转换函数
中文主要是GBK和UTF-8两种编码方式
GBK是双字节,一个中文占2个Bytes字节;UTF-8是三字节
多看手册练习
.