PHP5-8各版本特性详解

汇总 PHP5.1:

  • autoload
  • PDO
  • MySQLi
  • 类型约束
PHP5.2:
  • JSON 支持
PHP5.3:
  • 命名空间
  • 匿名函数
  • 闭包
  • 新增魔术方法__callStatic()__invoke()
  • 新增魔术变量__DIR__
  • 动态调用静态方法
  • 延迟静态绑定
  • Heredoc和 Nowdoc
  • 类外使用const定义常量
  • 三元运算符
  • Phar
PHP5.4:
  • Short Open Tag
  • 数组简写
  • Traits,
  • 内置 Web 服务器
  • 动态访问静态方法
  • 实例化时访问类成员
PHP5.5:
  • yield
  • list用于foreach
  • 细节修改
PHP5.6:
  • 常量增强
  • 命名空间增强
  • 可变函数参数
PHP7.0:
  • 标量类型声明
  • 返回值类型声明
  • defined定义常量数组
  • 匿名类
  • null合并运算符
PHP7.1:
  • 可为空类型
  • void类型
  • 多异常捕获
PHP7.2:
  • 新的对象object
  • 允许重写抽象方法
PHP7.3:语法层面没有很大的改变
PHP7.4:
  • 类型属性
  • 箭头函数
  • Null合并运算符支持方法
  • Opcache 预加载
PHP8.0:
  • JIT即时编译
  • 命名参数
  • 注解
  • 联合类型
  • Match表达式
  • Nullsafe 运算符
  • 构造器属性提升
PHP5.1 __autoload()魔术方法
这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数。可以通过定义这个函数来启用类的自动加载。
function__autoload($className) { $filePath = “project/class/{$className}.php”; if (is_readable($filePath)) { require($filePath); //这里可以只用require,因为一旦包含进来后,php引擎再遇到类A时,将不会调用__autoload,而是直接使用内存中的类A,不会导致多次包含。 } } $a = new A(); $b = new B(); $c = new C();

PHP中__autoload()魔术方法详解
PDO
PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。
安装 可以通过 PHP 的 phpinfo() 函数来查看是否安装了PDO扩展。
//Linux extension=pdo.so //Windows extension=php_pdo.dll

使用
"; /*你还可以进行一次搜索操作 foreach ($dbh->query('SELECT * from FOO') as $row) { print_r($row); //你可以用 echo($GLOBAL); 来看到这些值 } */ $dbh = null; } catch (PDOException $e) { die ("Error!: " . $e->getMessage() . "
"); } //默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样: $db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));

PHP PDO
MySQLi
mysqli.dll是PHP对mysql新特性的一个扩展支持,允许访问MySQL 4.1及以上版本提供的功能。
mysql与mysqli的区别:
  1. mysqli连接是永久连接,而mysql是非永久连接。
  2. mysql连接每当第二次使用的时候,都会重新打开一个新的进程。mysqli连接一直都只使用同一个进程。
使用
$conn = mysqli_connect('localhost', 'root', '123', 'db_test') or ('error'); $sql = "select * from db_table"; $query = mysqli_query($conn,$sql); while($row = mysqli_fetch_array($query)){ echo $row['title']; }

mysqli和mysql的区别是什么
类型约束
通过类型约束可以限制参数的类型,不过这一机制并不完善,目前仅适用于类和 callable(可执行类型) 以及 array(数组), 不适用于 string 和 int.
// 限制第一个参数为 MyClass, 第二个参数为可执行类型,第三个参数为数组 function MyFunction(MyClass $a, callable $b, array $c) { // ... }

PHP5.2 JSON
  • json_encode — 对变量进行 JSON 编码
  • json_decode — 对 JSON 格式的字符串进行解码
PHP5.3 命名空间
避免不同包中的类名或变量名产生冲突

匿名函数(闭包)
用来临时性地创建一个无名函数,用于回调函数等用途。
$func = function($arg) { print $arg; }; $func("Hello World! hovertree.top");

新增魔术方法__callStatic()__invoke()
__callStatic():用静态方式中调用一个不可访问方法时调用
__invoke() :以调用函数的方式调用一个对象时的回应方法
$person = new Person('小明'); // 初始赋值 $person(); //触发__invoke()

新增魔术变量__DIR__
获取当前执行的PHP脚本所在的目录
如当前执行的PHP文件为 /htdocs/index.php,则__FILE__等于’/htdocs/index.php’,而__DIR__等于’/htdocs’。
动态调用静态方法
public static function test($userName) { //... }$className = 'cls'; $className::test('Tom'); // PHP >= 5.3.0

延迟静态绑定
PHP 5.3.0中增加了一个static关键字来引用当前类,即实现了延迟静态绑定。
这是因为 self 的语义本来就是“当前类”,所以 PHP5.3 给 static 关键字赋予了一个新功能:后期静态绑定
class A { static public function callFuncXXOO() { print self::funcXXOO(); } static public function funcXXOO() { return "A::funcXXOO()"; } } class B extends A { static public function funcXXOO() { return "B::funcXXOO"; } } $b = new B; $b->callFuncXXOO(); //A::funcXXOO()

class A { static public function callFuncXXOO() { print static::funcXXOO(); } // ... } B::callFuncXXOO(); //B::funcXXOO()

类外使用const定义常量
常量是一个简单的标识符。在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其实不是常量)。常量默认大小写敏感。通常常量标识符总是大写的。
可以用define()函数来定义常量。在php5.3.0以后,可以使用const关键字在类定义的外部定义常量,先前版本const关键字只能在类(class)中使用。一个常量一旦被定义,就不能再改变或取消定义。
const和define的区别?
  1. const是一个语言结构,而define是一个函数。const在编译时要比define快很多。
const用于类成员变量的定义,一经定义,不可修改。Define不可以用于类成员变量的定义,可用于全局常量。
  1. Const可在类中使用,define不能
  2. Const不能在条件语句中定义常量
  3. const采用普通的常量名称,define可以采用表达式作为名称
  4. const只能接受静态的标量,而define可以采用任何表达式
  5. const定义的常量时大小写敏感,而define可以通过第三个参数(为true表示大小写不敏感)来指定大小写是否敏感。
PHP常量详解:define和const的区别
简化三元运算符
从PHP 5.3开始,通过排除中间表达式,甚至可以进一步简化三元语句。 如果测试表达式在布尔上下文中评估为true,则返回其值。 否则,将返回替代方法。

Phar
PHP5.3之后支持了类似Java的jar包,名为phar。用来将多个PHP文件打包为一个文件。
创建一个phar压缩包
$phar = new Phar('swoole.phar'); $phar->buildFromDirectory(__DIR__.'/../', '/.php$/'); $phar->compressFiles(Phar::GZ); $phar->stopBuffering(); $phar->setStub($phar->createDefaultStub('lib_config.php'));

使用phar压缩包
include 'swoole.phar'; include 'swoole.phar/code/page.php';

使用phar可以很方便的打包你的代码,集成部署到线上机器。
php phar教程,PHP中phar包的使用教程
PHP 5.3中的新特性及被弃用的功能函数总结
【PHP5-8各版本特性详解】PHP5各个版本的新功能和新特性总结
PHP5.4 Short Open Tag 短开放标签
自 PHP5.4 起总是可用。
//可以把 //简写成:

数组简写
// 原来的数组写法 $arr = array("key" => "value", "key2" => "value2"); // 简写形式 $arr = ["key" => "value", "key2" => "value2"];

Traits
Traits是 PHP 多重继承的一种解决方案。PHP中无法进行多重继承,但一个类可以包含多个Traits
// Traits不能被单独实例化,只能被类所包含 trait SayWorld { public function sayHello() { echo 'World!'; } } class MyHelloWorld { // 将SayWorld中的成员包含进来 use SayWorld; }$xxoo = new MyHelloWorld(); // sayHello() 函数是来自 SayWorld 构件的 $xxoo->sayHello();

优先级 基类中的成员函数将被Traits中的函数覆盖,当前类中的成员函数将覆盖Traits中的函数。
php5.4新功能Traits介绍
内置 Web 服务器
PHP从5.4开始内置一个轻量级的Web服务器,不支持并发,定位是用于开发和调试环境。
在开发环境使用它的确非常方便。
php -S localhost:8000

动态访问静态方法
$func = "funcXXOO"; A::{$func}();

实例化时访问类成员
(new MyClass)->xxoo();

php5.4总结
PHP5.5 yield关键字
yield关键字用于当函数需要返回一个迭代器的时候,逐个返回值。
function number10() { for($i = 1; $i <= 10; $i += 1) yield $i; }

list() 用于 foreach
$array = [ [1, 2, 3], [4, 5, 6], ]; foreach ($array as list($a, $b, $c)) echo "{$a} {$b} {$c}\n";

细节修改
  • 不推荐使用 mysql 函数,推荐使用 PDO 或 MySQLi
  • 不再支持Windows XP.
  • 可用 MyClass::class 取到一个类的完整限定名(包括命名空间)
  • empty() 支持表达式作为参数
  • try-catch 结构新增 finally 块
PHP5.6 常量增强
  1. 定义常量时允许使用之前定义的常量进行计算
    const A = 2; const B = A + 1;

  2. 允许常量作为函数参数默认值
    function func($arg = C::STR2)asdf

可变函数参数
用于代替 func_get_args()
function add(...$args) { //... }

同时可以在调用函数时,把数组展开为函数参数:
$arr = [2, 3]; add(1, ...$arr);

命名空间增强
命名空间支持常量和函数
PHP5.6总结
PHP7.0 标量类型声明
四种标量类型:boolean (布尔型),integer (整型),float (浮点型, 也称作 double),string (字符串)
function typeString(string $a) { echo $a; } typeString('sad'); //sad

返回值类型声明
function returnErrorArray(): array { return '1456546'; } print_r(returnErrorArray()); /* Array Fatal error: Uncaught TypeError: Return value of returnArray() must be of the type array, string returned in */

define 定义数组
define('ANIMALS', [ 'dog', 'cat', 'bird' ]); echo ANIMALS[1]; // 输出 "cat"

匿名类
匿名类就像一个没有事先定义的类,而在定义的时候直接就进行了实例化。
// 直接定义 $objA = new class{ public function getName(){ echo "I'm objA"; } }; $objA->getName();

PHP7 匿名类的用法
null 合并运算符
$username = $_GET['user'] ?? 'nobody'; //这两个是等效的当不存在user 则返回?? 后面的参数 $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

PHP7.1 可为空类型
参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。
当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null 。

void类型

多异常捕获

PHP7.2 新的对象类型object

允许重写抽象方法
当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类可以重写被继承的抽象类的抽象方法。

PHP7.4 类属性支持类型声明

箭头函数
使用隐式按值作用域绑定定义函数的简写语法。
$n * $factor, [1, 2, 3, 4]); // $nums = array(10, 20, 30, 40); ?>

Null 合并运算符支持方法

Opcache 预加载
Opcache将获取您的PHP源文件,将其编译为“ opcodes”,然后将这些编译后的文件存储在磁盘上。opcache会跳过源文件和PHP解释器在运行时实际需要之间的转换步骤。
掌握PHP 7.x 各个版本的新特性
PHP7.0~PHP7.1~PHP7.2~PHP7.3~PHP7.4新特性
PHP8.0 JIT即时编译
PHP8的JIT目前是在Opcache之中提供的
JIT在Opcache优化之后的基础上,结合Runtime的信息再次优化,直接生成机器码
JIT不是原来Opcache优化的替代,是增强
目前PHP8只支持x86架构的CPU
命名参数
就是具名参数,在调用函数的时候,可以指定参数名称,指定参数名称后,参数顺序可以不安装原函数参数顺序传
//传统方式调用 balance(100, 20); //php8 使用命名参数调用 balance(amount: 100, payment: 20);

注解
使用注解可以将类定义成一个一个低解耦,高内聚的元数据类。在使用的时候通过注解灵活引入,反射注解类实例的时候达到调用的目的。
注解类只有在被实例化的时候才会调用
联合类型
在不确定参数类型的场景下,可以使用
function printSomeThing(string|int $value) { var_dump($value); }

Match表达式
和switch cash差不多,不过是严格===匹配
'this a', 'c' => 'this c', 0=> 'this 0', 'b' => 'last b', }; echo $str; //输出 last b

Nullsafe 运算符
//不实例 User 类,设置为null $user = null; echo $user->getName(); //php8之前调用,报错 echo $user?->getName(); //php8调用,不报错,返回空

构造器属性提升
在构造函数中可以声明类属性的修饰词作用域
name = $name; $this->age = $age; } } //php8写法, class User { public function __construct( protected string $name, protected int $age ) {} }

结合示例讲解PHP8的新特性

    推荐阅读