zoukankan      html  css  js  c++  java
  • php高级进阶系列文章--第二篇(PHP基础知识复习)

    php基础知识复习

    本文中对于简单的知识点只会提及一下(例如什么控制结构什么的),对于较有难度的详细复习下(例如面向对象的反射等等)

    再次申明,本系列文章不是从最基础的开始复习,对于零基础的可能不适用,本文的初衷是我要准备攻读源码,在攻读前将之前的知识牢固下,太过简单的就写在文中了

    1,echo print echo 可以输出一个或者多个字符串 print 只可以输出一个字符串,返回值总为1

    2,PHP7中的组合比较符

    echo 1 <==> 1 // 0
    echo 1 <==> 2 // -1
    echo 2 <==> 1 // 1
    组合比较符实例

    3,运算符的优先级口诀:括(号)、单(操作数)、算(术)、移(位)、关(系);位(运算符)、逻(辑)、条(件)、赋(值)、逗(号)。

    --------------------7大数据类型,8个魔术变量,9大全局变量-----------------------------------------

    5,数据类型 字符串,整形,浮点型,布尔值,对象,数组,空值NuLL

    6,超全局变量 $_GET $_POST $_ENV $_COOKIE $_SESSION $GLOBALS $_SERVER $_REQUEST $_FILES  9大全局变量

    7,魔术变量 

      __LINE__ 文件中的当前行号

      __FILE__ 文件的完整路径和文件名

      __DIR__  文件所在的目录等同于dirname(__FILE__)

      __FUNCTION__ 返回该函数被定义时起的名字,区分大小写

      __CLASS__ 返回该类定义时起的名字  __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。

      __TRAIT__ 实现了代码的复用, 从基类继承的成员被插入的 Trait 中的  方法所覆盖。其行为 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。

      __METHOD__ 返回该方法被定义时的名字

      __NAMESPACE__ 当前命名空间的名称

    8,在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前

    9,htmlspecialchars() 将用户提交来的内容进行转义   htmlspecialchars_decode()将html实体转换为html内容

    10,php 下拉框多选菜单提交时 <select multiple="multiple" name="q[]"> 这样写,可以将option中的内容使用数组q传递过来

    11,使用PHP stripslashes()函数去除用户输入数据中的反斜杠 ()

    12,date() 函数,格式化时间戳,注意熟悉其中的参数,结合strtotime() 灵活使用其中参数,可以很简单处理各个维度的时间戳,在项目中也回遇到

    13,feof() 检测文件是否已经读到末尾 fgets() 用于从文件中逐行读取文件 fgetc() 用于文件中逐字符读取文件

    14,<form action="upload_file.php" method="post" enctype="multipart/form-data"<form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 "multipart/form-data"

    15,自定义错误处理 function custoError($errno, $errstr) 其中可以传递5个参数,但必须能够处理两个参数,错误级别和错误消息

      设置错误程序,当发生错误的时候自动调用 ser_error_handler("custoError", E_USER_WARNING)

      触发错误 tigger_error("xxxxx", E_USER_WARNING)

    16,在默认的情况下,根据在 php.ini 中的 error_log 配置,PHP 向服务器的记录系统或文件发送错误记录。通过使用 error_log() 函数,可以向指定的文件或远程目的地发送错误记录。

    17, exception 错误异常处理

    <?php
    // 创建一个有异常处理的函数
    function checkNum($number)
    {
        if($number>1)
        {
            throw new Exception("变量值必须小于等于 1");
        }
            return true;
    }
        
    // 在 try 块 触发异常
    try
    {
        checkNum(2);
        // 如果抛出异常,以下文本不会输出
        echo '如果输出该内容,说明 $number 变量';
    }
    // 捕获异常
    catch(Exception $e)
    {
        echo 'Message: ' .$e->getMessage();
    }
    ?>
    示例

    18,自定义错误异常类,该类必须继承自Execption类,可以在其中增加自定义的方法

    <?php
    class customException extends Exception
    {
        public function errorMessage()
        {
            // 错误信息
            $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
            .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址';
            return $errorMsg;
        }
    }
     
    $email = "someone@example...com";
     
    try
    {
        // 检测邮箱
        if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
        {
            // 如果是个不合法的邮箱地址,抛出异常
            throw new customException($email);
        }
    }
     
    catch (customException $e)
    {
    //display custom message
    echo $e->errorMessage();
    }
    自定义异常类示例

    19,一个脚本中可以抛出多个异常,捕获多个异常,异常可以使用不同的异常类,返回各自的异常信息

    <?php
    class customException extends Exception
    {
        public function errorMessage()
        {
            // 错误信息
            $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
            .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址';
            return $errorMsg;
        }
    }
     
    $email = "someone@example.com";
     
    try
    {
        // 检测邮箱
        if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
        {
            // 如果是个不合法的邮箱地址,抛出异常
            throw new customException($email);
        }
        // 检测 "example" 是否在邮箱地址中
        if(strpos($email, "example") !== FALSE)
        {
            throw new Exception("$email 是 example 邮箱");
        }
    }
    catch (customException $e)
    {
        echo $e->errorMessage();
    }
    catch(Exception $e)
    {
        echo $e->getMessage();
    }
    多个异常

    20,在实际使用中,有时候需要既对异常进行记录,同时也要给用户一个较好的体验,可是使用重新抛出异常的方式,多次处理

    <?php
    class customException extends Exception
    {
        public function errorMessage()
        {
            // 错误信息
            $errorMsg = $this->getMessage().' 不是一个合法的 E-Mail 地址。';
            return $errorMsg;
        }
    }
     
    $email = "someone@example.com";
     
    try
    {
        try
        {
            // 检测 "example" 是否在邮箱地址中
            if(strpos($email, "example") !== FALSE)
            {
                // 如果是个不合法的邮箱地址,抛出异常
                throw new Exception($email);
            }
        }
        catch(Exception $e)
        {
            // 重新抛出异常
            throw new customException($email);
        }
    }
    catch (customException $e)
    {
        // 显示自定义信息
        echo $e->errorMessage();
    }
    重新抛出异常示例

    21,设置顶层异常处理器,此可以捕获所有未捕获过的异常  set_exception_handler()

    <?php
    function myException($exception)
    {
        echo "<b>Exception:</b> " , $exception->getMessage();
    }
     
    set_exception_handler('myException');
     
    throw new Exception('Uncaught Exception occurred');
    ?>
    设置顶层错误异常处理示例

    22,过滤器,用于对外部用数据的过滤,增加安全性能

    filter_var() 通过一个指定的过滤器来过滤单一的变量

    filter_var_array() 通过相同的或不同的过滤器来过滤多个变量

    filter_input() 获取一个输入变量,并对他进行过滤

    filter_input_array() 获取多个输入变量,并通过相同的或不同的过滤器对他们进行过滤

    <?php
    $int = 123;
     
    if(!filter_var($int, FILTER_VALIDATE_INT))
    {
        echo("不是一个合法的整数");
    }
    else
    {
        echo("是个合法的整数");
    }
    过滤器使用简单示例

    23,有两种过滤器 validating 和Sanitizing

      validating过滤器:

        用于验证用户输入,严格的格式规则(比如URL或者email验证),若成功返回预期的类型,若失败返回False

      Sanitizing过滤器:

        用于允许或禁止字符串中指定的字符,无数据格式规则,始终返回字符串

    24,php7.0 17个新特性

      1>, PHP标量类型与返回值类型声明

        强制模式(默认)

        严格模式

        声明语法格式 declare(strict_types = 1) 可用类型有 int,float,bool,string,interface,array,callable

        

    <?php
    // 强制模式
    function sum(int ...$ints)
    {
       return array_sum($ints);
    }
    
    print(sum(2, '3', 4.1)); 
    强制模式实例
    <?php
    // 严格模式
    declare(strict_types=1);
    
    function sum(int ...$ints)
    {
       return array_sum($ints);
    }
    
    print(sum(2, '3', 4.1)); 
    严格模式实例

        严格模式中会对类型检查,否则报错

        返回类型声明同上,但是语法有区别 eg: function returnIntValue(int $value): int {....}

    <?php
    declare(strict_types=1);
    
    function returnIntValue(int $value): int
    {
       return $value;
    }
    
    print(returnIntValue(5)); 
    返回类型严格声明实例

      2>, NULL合并运算符??,用于执行isset()检测的三元运算的快捷方式

        原先写三元运算符时  $site = isset($_GET['site']) ? $_GET['SITE'] : 'XXXX'

        使用合并运算符后可以改为 $site = $_GET['site'] ?? 'xxx'

      3>, 太空船运算符 <=> 比较两个表达式,返回0,1,-1

      4>,php5.6 中仅可以使用const定义常量数组,在php7中可以使用define() 定义常量数组

    <?php
    // 使用 define 函数来定义数组
    define('sites', [
       'Google',
       'Runoob',
       'Taobao'
    ]);
    
    print(sites[1]);
    define常量数组定义实例

      5>, 通过new class 来实例化一个匿名类,代替一些"用后即焚"的完整类定义

      6>,closure::call()  将一个闭包函数动态绑定到一个新的对象实例并调用执行此函数

      7>,php 过滤unserialize()

      8>, IntChar()

      9>, CSPRNG  伪随机数产生器  通过引入几个CSPRNG函数提供一种简单的机制来生成密码学上强壮的随机数

        random_bytes() 加密生成被保护的伪随机字符串

        random_int()加密生成被保护的伪随机整数

      10>,PHP 7 异常用于向下兼容及增强旧的assert()函数。它能在生产环境中实现零成本的断言,并且提供抛出自定义异常及错误的能力。

      11>, PHP 7 可以使用一个 use 从同一个 namespace 中导入类、函数和常量

    <?
    // PHP 7 之前版本需要使用多次 use
    use some
    amespaceClassA;
    use some
    amespaceClassB;
    use some
    amespaceClassC as C;
    
    use function some
    amespacefn_a;
    use function some
    amespacefn_b;
    use function some
    amespacefn_c;
    
    use const some
    amespaceConstA;
    use const some
    amespaceConstB;
    use const some
    amespaceConstC;
    
    // PHP 7+ 之后版本可以使用一个 use 导入同一个 namespace 的类
    use some
    amespace{ClassA, ClassB, ClassC as C};
    use function some
    amespace{fn_a, fn_b, fn_c};
    use const some
    amespace{ConstA, ConstB, ConstC};
    use 使用实例

      12>,PHP 7 改变了大多数错误的报告方式。不同于 PHP 5 的传统错误报告机制,现在大多数错误被作为 Error 异常抛出。

        Error 异常层次结构: Error: ArithmeticError,  AssertionError,  DivisionByZeroError,  ParseError, TypeError

    <?php
    class MathOperations 
    {
       protected $n = 10;
    
       // 求余数运算,除数为 0,抛出异常
       public function doOperation(): string
       {
          try {
             $value = $this->n % 0;
             return $value;
          } catch (DivisionByZeroError $e) {
             return $e->getMessage();
          }
       }
    }
    
    $mathOperationsObj = new MathOperations();
    print($mathOperationsObj->doOperation()); 
    PHP7错误处理实例

      13>, intdiv() 函数   接收两个参数,返回值为第一个参数除于第二个参数的值并取整。

      14>, PHP 7 session_start()函数可以接收一个数组作为参数,可以覆盖php.ini中session的配置项

      15>,废弃了php4中的类名方法名相同时的做为构造函数使用的方法, 废弃了使用静态的方式调用非静态的方法, password_hash() 其中的盐不需要开发者提供,废弃了 "capture_session_meta" SSL 上下文选项。 在流资源上活动的加密相关的元数据可以通过 stream_get_meta_data() 的返回值访问。

      16>,移除以下扩展 ereg, mssql, mysql, sybase_ct

      17>, 移除一部分sapi

    php 基础知识暂时复习到这儿,以后学习中随时补充

  • 相关阅读:
    实现一个WEBIM
    拼写纠错
    UML系列图用例图
    [bzoj1670][Usaco2006 Oct]Building the Moat
    [bzoj3626][LNOI2014]LCA
    转:用JS写的一个树型结构
    一个购物车中修改商品数量的实列
    网站访问统计在Global.asax中的配置的深入讨论
    转:JavaScript中的三级联动
    转:用Sql Server存储上载图片字体
  • 原文地址:https://www.cnblogs.com/rcltocode/p/7230613.html
Copyright © 2011-2022 走看看