【一】函数基本语法概述

简介:函数就是功能,调用一个函数就是在调用一个功能

特性:①可以通过函数名调用;②可以反复调用

分类:自定义函数,系统函数

案例:比如之前介绍过的几个函数,例如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";
?>

 

【十八】字符串常用函数

 

 数组,字符串,数据库是函数里最常用的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是三字节

 多看手册练习

 

 

 

 

 

 

 

 

 

 

 

 

.