php高级进阶系列文章--第二篇(PHP基础知识复习)

Posted 码上平天下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 = "[email protected]";
 
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 = "[email protected]";
 
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 = "[email protected]";
 
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\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;

use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;

use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;

// PHP 7+ 之后版本可以使用一个 use 导入同一个 namespace 的类
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{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 基础知识暂时复习到这儿,以后学习中随时补充




以上是关于php高级进阶系列文章--第二篇(PHP基础知识复习)的主要内容,如果未能解决你的问题,请参考以下文章

前端学PHP之面向对象系列第二篇——魔术方法

前端学PHP之面向对象系列第二篇——魔术方法

Linux从青铜到王者第二十二篇:Linux高级IO

深入理解javascript函数进阶系列第二篇——函数柯里化

Python开发第二十二篇:Web框架之Django进阶

C++从入门到入土第二篇:类和对象基础