首页 > 代码库 > php高级进阶系列文章--第二篇(PHP基础知识复习)
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]);
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};
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());
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基础知识复习)