PHP入门学习笔记四

一、php练习题

1.1 求数组的和以及数据的平均值。

代码如下:

<?php
    $num = 0;
    $arr = 0;
    $arr = [1,3,4,3,2,1];
    foreach($arr as $key => $value) {
    
    
        $num+=$value;
    }
    echo '和是:'.$num.'<br/>';
    echo '平均值是:'.$num/count($arr).'<br/>';
?>  

效果:
在这里插入图片描述
可以使用number_format(数字,精确到小数点后几位)来格式化到小数点后面几位。
例:

<?php
    $num = 0;
    $arr = 0;
    $arr = [1,3,4,3,2,1];
    foreach($arr as $key => $value) {
    
    
        $num+=$value;
    }
    echo '和是:'.$num.'<br/>';
    echo '平均值是:'.number_format($num/count($arr), 1).'<br/>';
?>  

效果:
在这里插入图片描述

1.2 数组翻转。

代码如下:

<?php
    $arr=[1,2,3,4,5];
    for($i = 0, $j = count($arr)-1; $i < $j; $i++, $j--) {
    
    
        [$arr[$i], $arr[$j]] = [$arr[$j], $arr[$i]];
    }
    print_r($arr);
?>  

效果:
在这里插入图片描述

1.3 遍历二维数组

例:

<?php
    $arr=[
        [1,2,3,4],
        [5,6,7,8]
    ];
    for($i=0; $i<count($arr); $i++) {
    
    
        for($j=0; $j<count($arr[$i]); $j++) {
    
    
            echo $arr[$i][$j], '&nbsp;';
        }
        echo '<br/>';
    }
?>  

效果:
在这里插入图片描述

1.4 循环输出1-100。

循环输出1-100,其中3的倍数输出A,5的倍数输出B,15的倍数输出C。
此题必须先判断能被15整除的数,因为如果先判断3的倍数那么将不会出现C,因为能被15整除的数都能被3整除。
例:

<?php
    for($i=1; $i<=100; $i++) {
    
    
        if ($i%15 ==  0) {
    
    
            echo 'C&nbsp;';
        }
        elseif ($i%3 == 0) {
    
    
            echo 'A&nbsp;';
        }
        elseif ($i%5 == 0) {
    
    
            echo 'B&nbsp;';
        }
        else {
    
    
            echo $i.'&nbsp;';
        }
    }
?>  

效果:
在这里插入图片描述

1.5 打印水仙花数

例:

<?php
    for($i=100; $i<=999; $i++) {
    
    
        $a = (int)($i/100); // 百位数
        $b = (int)($i%100/10); // 十位数
        $c = $i%10; // 个位数
        if ($i== pow($a, 3) + pow($b, 3) + pow($c, 3)) {
    
    
            echo $i, '<br/>';
        }
    }
    // pow(数值,数值指数)
?> 

效果:
在这里插入图片描述

1.6 打印100以内的斐波那契数

斐波那契数的原理:一个数等于前面两个数之和。

<?php
    $num1=1;
    $num2=1;
    echo $num1, '&nbsp;', $num2, '&nbsp;';
    while (true) {
    
    
        $num3 = $num1 + $num2;
        if ($num3 > 100) {
    
    
            break;
        }
        echo $num3, '&nbsp;';
        $num1 = $num2;
        $num2 = $num3;
    }
?> 

效果:
在这里插入图片描述

二、作用域

2.1 全局变量

在函数外面。
例如:

<?php
    $num=10;
    function fun() {
    
    
        echo $num;
    }
    echo $num;
    fun();
?>  

效果:
在这里插入图片描述
报错了,函数内部不会去全局去找。如果我就要在函数里面去找全局变量,可以使用超全局变量

2.2 局部变量

在函数里面,默认情况下,函数内部是不会去访问函数外部的变量,不像js,js局部找不到就会去全局变量去找。

2.3 超全局变量

可以在函数内部和函数外部访问。超全局变量有如下:
在这里插入图片描述
利用超全局变量修改:

<?php
    $_POST['num']=10;
    function fun() {
    
    
        echo $_POST['num'];
    }
    fun();
?>  

效果:
在这里插入图片描述
可以利用$GLOBALS输出全局变量:

<?php
    $num=10;
    function fun() {
    
    
        echo $GLOBALS['num'];
    }
    fun();
?>  

效果:
在这里插入图片描述
还可以如下关键字写法:

<?php
    $num=10;
    function fun() {
    
    
        global $num; // 将全局变量的$num的地址保存到引入到函数内部。
        echo $num;
    }
    fun();
?>  

效果:
在这里插入图片描述

2.4 常量没有作用域

例:

<?php
    define('PI', 3.14);
    function fun () {
    
    
        echo PI;
    }
    fun();
    echo '<hr/>';
    function fun1 () {
    
    
        define('NUM', 6.28);
    }
    fun1();
    echo NUM
?>  

效果:
在这里插入图片描述

2.5 静态变量

静态变量一般指的是静态局部变量,静态变量只初始化一次。
例:

<?php
    function fun() {
    
    
        $num=10;
        $num++;
        echo $num, '<br/>';
    }
    fun();
    fun();
?>  

效果:
在这里插入图片描述
普遍局部变量,函数没调用一次就初始化一次,不会进行叠加。
采用静态局部变量(静态变量只初始化一次):

<?php
    function fun() {
    
    
        static $num=10;
        $num++;
        echo $num, '<br/>';
    }
    fun();
    fun();
?>  

效果:
在这里插入图片描述
常量和静态变量的异同点:

  • 常量和静态变量都只初始化一次;
  • 常量初始化完成后不能改变值,静态变量初始化后可以改变值。
  • 常量没有作用域的区分,静态变量是局部作用域。

2.6 匿名函数的use( )

默认情况下,函数内部访问不到函数外部的变量,但在匿名函数中,可以通过use将外部变量引入匿名函数中。
例:

<?php
    $num=10;
    $fun = function () {
    
    
        echo $num;
    };
    $fun();
?> 

效果:
在这里插入图片描述
这个时候就可以使用ues(),将外部的变量给引入:

<?php
    $num=10;
    $fun = function () use ($num) {
    
    
        echo $num;
    };
    $fun();
?>  

效果:
在这里插入图片描述

2.7 总结在局部作用域中访问全局变量。

  1. 使用超全局变量;
  2. 使用$GLOBALS;
  3. 使用global;
  4. 匿名函数使用use( );

三、递归

函数自己调用自己。
例:

<?php
    function fun($num) {
    
    
        echo $num,'&nbsp;';
        if ($num == 1) {
    
    
            return;
        }
        fun($num-1);
    }
    fun(10);
?>  

效果:
在这里插入图片描述
例从1加到100:

<?php
    function fun($num) {
    
            
        if ($num == 0) {
    
    
            return;
        }
        return $num + fun($num-1);
    }
    echo fun(100);
?>  

效果:
在这里插入图片描述
利用递归思想打印前10个斐波那契数:

<?php
    function fun($num) {
    
    
        if ($num == 1 || $num == 2) {
    
    
            return 1;
        }
        else {
    
    
            return fun($num-1) + fun($num-2);
        }
    }
    for($i=1; $i<=10; $i++) {
    
    
        echo fun($i),'&nbsp;';
    }
?>  

效果:
在这里插入图片描述

四、包含文件

4.1 包含文件的方式

  1. require
  2. include

require和include的异同点:
require和include都可以包含多次,require一旦包含路径输错,底下就不会执行了。include即使路径发生错误,底下如果还有代码还会执行。
例:
header.php代码如下:

<h1>我是头部</h1>
<?php
    require './header.php';
    require './header.php';
    include './header.php';
    include './header.php';

    echo 'aa';
?>  

效果:
在这里插入图片描述
然后我们故意输错require的路径:

<?php
    require './header1.php';

    echo 'aa';
?>  

效果:
在这里插入图片描述
报错了,并且底下代码不执行了,接着我们改成include:

<?php
    include './header1.php';
    echo 'aa';
?>  

效果:
在这里插入图片描述
给了一个警告,并且aa也打印出来了。

4.2 包含文件的路径

./ 当前目录
../ 上一级目录

如果不写./,那么受include_path影响,可以看下phpinfo中的信息:
在这里插入图片描述
可以使用set_include_path()去设置路径。使用场景:如果包含文件的目录结构比较多,可以用set_include_path()去设置。set_include_path()用分号分隔。

五、错误处理

5.1 错误的级别

  1. notice:提示
    例:
<?php
    echo $num;
?>  

效果:
在这里插入图片描述
2. warning:警告
例:

<?php
    include('./bb.html');
?>  

效果:
在这里插入图片描述
3. fatal error:致命错误
例:

<?php
    require('./bb.html');
?>  

效果:
在这里插入图片描述
notice和warning报错后会继续执行下面代码,error报错后会停止执行。

5.2 错误的提示方法

  1. 显示在浏览器上
  2. 记录在日志中

记录在日志中(在php.ini中配置也可以在函数中修改):

  1. error_reporting = E_ALL ( 报告所有的错误)
    E_ALL
  2. display_errors = On (将错误显示在浏览器上)
    在这里插入图片描述
  3. log_errors = On(将错误记录在日志中)
    在这里插入图片描述
  4. error_log=‘地址’(错误日志保存的地址)
    在这里插入图片描述
    在项目开发过程中有两个模式,开发模式,将错误显示在浏览器中就可以了。生产模式的话需要将错误保存在日志中,不能显示在浏览器中。
    例:
<?php
    $debug = true; // 假设为开发模式
    ini_set('error_reporting',E_ALL); // 设置php配置 所有的错误有报告
    if ($debug) {
    
     // 开发模式
        ini_set('display_errors','On'); // 错误显示在浏览器中
        ini_set('log_errors', 'Off');  // 不记录日志
    }
    else {
    
     // 生产模式
        ini_set('display_errors','Off'); // 错误不显示在浏览器中
        ini_set('log_errors', 'On');  // 记录日志
        ini_set('error_log', './err.log'); // 记录在当前目录下
    }
    // 测试
    echo $num;
?>   

开发模式效果,显示在浏览器中:
在这里插入图片描述
接下来我们修改为生产模式:

<?php
    $debug = false; // 假设为开发模式
    ini_set('error_reporting',E_ALL); // 设置php配置 所有的错误有报告
    if ($debug) {
    
     // 开发模式
        ini_set('display_errors','On'); // 错误显示在浏览器中
        ini_set('log_errors', 'Off');  // 不记录日志
    }
    else {
    
     // 生产模式
        ini_set('display_errors','Off'); // 错误不显示在浏览器中
        ini_set('log_errors', 'On');  // 记录日志
        ini_set('error_log', './err.log'); // 记录在当前目录下
    }
    // 测试
    echo $num;
?>  

开发模式下,浏览器效果看不到报错:
在这里插入图片描述
那么我们打开demo.php所在的目录可以发现多了一个err.log,我们打开查看:
在这里插入图片描述

5.3 自定义错误处理方式

通过trigger_error产生一个用户级别的error/warning/notice 信息。
例:

<?php
    $age=-10;
    if ($age<0) {
    
    
        trigger_error('年龄不能小于0');
    }
?>  

效果:
在这里插入图片描述
默认触发了notice级别的错误。
改为warning级别的错误:

<?php
    $age=-10;
    if ($age<0) {
    
    
        trigger_error('年龄不能小于0', E_USER_WARNING);
    }
?>  

效果:
在这里插入图片描述
类似的:E_USER_NOTICE,E_USER_WARNING,E_USER_ERROR

5.4 自定义错误处理函数

例:

<?php
    function err() {
    
    
        echo '我是自定义错误处理函数';
    }
    set_error_handler('err'); // 注册错误处理函数
    echo $num; // 只要有错就会触发这个函数
?>  

效果:
在这里插入图片描述
自定义错误处理函数参数,规定四个参数,并且参数名规定了,$errno,$errstr,$errfile,$errline
例:

<?php
/**
 * err 自定义错误处理函数
 * @param $errno int 错误类型
 * @param $errstr string 错误信息
 * @param $errfile string 文件地址
 * @param $errline int 错误行号
 */
    function err($errno, $errstr, $errfile, $errline) {
    
    
        switch($errno) {
    
    
            case E_NOTICE:
            case E_USER_NOTICE:
                echo 'notice 错误<br/>';
                break;
            case E_WARNING:
            case E_USER_WARNING:
                echo 'warning 错误<br/>';
                break;
            case E_ERROR:
            case E_USER_ERROR:
                echo 'ERROR 错误<br/>';
                break;
        }
        echo "错误信息:{
      
      $errstr}<br/>";
        echo "错误文件:{
      
      $errfile}<br/>";
        echo "错误行号:{
      
      $errline}<br/>";
    }
    set_error_handler('err'); // 注册自定义错误处理函数
    // 测试错误
    echo $num;
?>  

效果:
在这里插入图片描述

六、文件夹操作

6.1 创建文件夹(mkdir(路径,权限,是否递归创建 ))

<?php
    mkdir('./dir');

效果:
在这里插入图片描述

<?php
    mkdir('./dir/aa');

在dir文件下创建aa文件夹。dir文件夹必须存在,如果不存在就报错了。
那如果dir文件夹不存,我希望在./dir/aa这样写的时候连dir文件夹也一起创建了,就需要用到第三个参数递归创建。
例:

<?php
    mkdir('./dir/aa/cc', 0777, true); // 递归创建

效果:
在这里插入图片描述

6.2 删除文件夹(rmdir())

例:

<?php
    rmdir('./dir/aa/cc'); // 删除cc文件夹

效果:
在这里插入图片描述
例:

<?php
    rmdir('./dir'); 

效果:
在这里插入图片描述
删除文件夹的必须为空才能删除,否则会报错。
php没有提供递归删除。

6.3 重命名文件夹(rename(旧名字,新名字))

例:

<?php
    rename('./dir', './dic'); 

效果:
在这里插入图片描述

6.4 是否是文件夹(is_dir())

例:

<?php
    echo is_dir('./dic') ? '是文件夹' : '不是文件夹'; 

效果:
在这里插入图片描述

6.5 打开文件夹、读取文件夹,关闭文件夹

  1. 打开文件夹:
    opendir(),例:
<?php
    var_dump(opendir('./'));

效果:
在这里插入图片描述
2. 读取文件夹:
readdir(),例:

<?php
    $folder = opendir('./');
    while ($f = readdir($folder)) {
    
     // 利用while进行一直读取,如果读完了就为空,循环就结束了。
        echo $f,'<br/>';
    }

效果:
在这里插入图片描述
首先出现一点和两点,这是php的特性,只要有读取文件夹就会出现这两个。
tips:解决乱码的问题,可以使用iconv(进去编码格式,出来编码格式,字符串)。
可以使用如下语法将 ... 去除掉:

<?php
    $folder = opendir('./');
    while ($f = readdir($folder)) {
    
     // 利用while进行一直读取,如果读完了就为空,循环就结束了。
        if ($f=='.' || $f=='..') {
    
    
            continue;
        }
        echo $f,'<br/>';
    }

效果:
在这里插入图片描述
3. 关闭文件夹:
closedir(),例:

<?php
    $folder = opendir('./');
    while ($f = readdir($folder)) {
    
     // 利用while进行一直读取,如果读完了就为空,循环就结束了。
        if ($f=='.' || $f=='..') {
    
    
            continue;
        }
        echo $f,'<br/>';
    }
    closedir($folder);

在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。

猜你喜欢

转载自blog.csdn.net/weixin_44103733/article/details/106579317