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 基础知识暂时复习到这儿,以后学习中随时补充

  • 相关阅读:
    2015.2.27 UltraEdit中显示XML结构
    2015.1.31 DataGridView自动滚动到某行
    2015.1.15 利用函数实现将一行记录拆分成多行记录 (多年想要的效果)
    2015.1.15 利用Oracle函数返回表结果 重大技术进步!
    2015.1.15 利用Oracle函数插入表结构 Bulk collect into 不用循环,简洁高效
    2015.1.8 Left join 左连接
    2015.1.10 解决DataGridView SelectionChanged事件自动触发问题
    delphi 遍历窗口
    delphi 访问 protected 属性 哈哈
    clientdataset 读取excel 如果excel 文件不存在的时候 相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据。 这是一个bug 哈哈
  • 原文地址:https://www.cnblogs.com/rcltocode/p/7230613.html
Copyright © 2011-2022 走看看