搜索
首页后端开发php教程一文详解PHP5-8各版本特性【汇总】

本篇文章给大家总结汇总了PHP5-8各版本特性,有需要的看看收藏阅读,希望对大家有所帮助!

一文详解PHP5-8各版本特性【汇总】

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();

PDO

PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。

安装

可以通过 PHP 的 phpinfo() 函数来查看是否安装了PDO扩展。

//Linux
extension=pdo.so
//Windows  
extension=php_pdo.dll

使用

<?php
$dbms=&#39;mysql&#39;;     //数据库类型
$host=&#39;localhost&#39;; //数据库主机名
$dbName=&#39;test&#39;;    //使用的数据库
$user=&#39;root&#39;;      //数据库连接用户名
$pass=&#39;&#39;;          //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";


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

MySQLi

mysqli.dll是PHP对mysql新特性的一个扩展支持,允许访问MySQL 4.1及以上版本提供的功能。

mysql与mysqli的区别:

  • mysqli连接是永久连接,而mysql是非永久连接。

  • 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'];
}

类型约束

通过类型约束可以限制参数的类型,不过这一机制并不完善,目前仅适用于类和 callable(可执行类型) 以及 array(数组), 不适用于 string 和 int.

// 限制第一个参数为 MyClass, 第二个参数为可执行类型,第三个参数为数组
function MyFunction(MyClass $a, callable $b, array $c)
{
    // ...
}

PHP5.2


JSON

PHP5.3


命名空间

避免不同包中的类名或变量名产生冲突
<?php
namespace XXX; // 命名空间的分隔符是反斜杠,该声明语句必须在文件第一行。

匿名函数(闭包)

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

新增魔术方法__callStatic()__invoke()

__callStatic():用静态方式中调用一个不可访问方法时调用

__invoke() :以调用函数的方式调用一个对象时的回应方法

$person = new Person(&#39;小明&#39;); // 初始赋值
$person(); //触发__invoke()

新增魔术变量__DIR__

获取当前执行的PHP脚本所在的目录

如当前执行的PHP文件为 /htdocs/index.php,则__FILE__等于’/htdocs/index.php’,而__DIR__等于’/htdocs’。

动态调用静态方法

public static function test($userName)
{
    //...
}

$className = &#39;cls&#39;;
$className::test(&#39;Tom&#39;); // 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的区别?

  • const是一个语言结构,而define是一个函数。const在编译时要比define快很多。

const用于类成员变量的定义,一经定义,不可修改。Define不可以用于类成员变量的定义,可用于全局常量。

  • Const可在类中使用,define不能

  • Const不能在条件语句中定义常量

  • const采用普通的常量名称,define可以采用表达式作为名称

  • const只能接受静态的标量,而define可以采用任何表达式

  • const定义的常量时大小写敏感,而define可以通过第三个参数(为true表示大小写不敏感)来指定大小写是否敏感。

  • PHP常量两种定义方法:define和const有什么区别

简化三元运算符

从PHP 5.3开始,通过排除中间表达式,甚至可以进一步简化三元语句。 如果测试表达式在布尔上下文中评估为true,则返回其值。 否则,将返回替代方法。

<?php
$favoriteColor = $_GET["color"] ?: "pink";

Phar

PHP5.3之后支持了类似Java的jar包,名为phar。用来将多个PHP文件打包为一个文件。

创建一个phar压缩包

$phar = new Phar(&#39;swoole.phar&#39;);
$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可以很方便的打包你的代码,集成部署到线上机器。

PHP5.4


Short Open Tag 短开放标签

自 PHP5.4 起总是可用。
//可以把
<?php echo $xxoo;?>
//简写成:  
<?= $xxoo;?>

数组简写

// 原来的数组写法
$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中的函数。

内置 Web 服务器

PHP从5.4开始内置一个轻量级的Web服务器,不支持并发,定位是用于开发和调试环境。
在开发环境使用它的确非常方便。

php -S localhost:8000

动态访问静态方法

$func = "funcXXOO";
A::{$func}();

实例化时访问类成员

(new MyClass)->xxoo();

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


常量增强

  • 定义常量时允许使用之前定义的常量进行计算

    const A = 2;
    const B = A + 1;
  • 允许常量作为函数参数默认值

    function func($arg = C::STR2)asdf

可变函数参数

用于代替 func_get_args()

function add(...$args)
{
  //...
}

同时可以在调用函数时,把数组展开为函数参数:

$arr = [2, 3];
add(1, ...$arr);

命名空间增强

命名空间支持常量和函数

PHP7.0


标量类型声明

四种标量类型:boolean (布尔型),integer (整型),float (浮点型, 也称作 double),string (字符串)

function typeString(string $a)
{
    echo $a;
}
typeString(&#39;sad&#39;); //sad

返回值类型声明

function returnErrorArray(): array
{
    return &#39;1456546&#39;;
}
print_r(returnErrorArray());
/*
Array
Fatal error: Uncaught TypeError: Return value of returnArray() must be of the type array, string returned in 
*/

define 定义数组

define(&#39;ANIMALS&#39;, [
    &#39;dog&#39;,
    &#39;cat&#39;,
    &#39;bird&#39;
]);
echo ANIMALS[1]; // 输出 "cat"

匿名类

匿名类就像一个没有事先定义的类,而在定义的时候直接就进行了实例化。

// 直接定义
$objA = new class{
    public function getName(){
        echo "I&#39;m objA";
    }
};
$objA->getName();

null 合并运算符

$username = $_GET['user'] ?? 'nobody';
//这两个是等效的  当不存在user 则返回?? 后面的参数
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

PHP7.1


可为空类型

参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。

当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null 。

<?php
  function testReturn(): ?string{
    return &#39;elePHPant&#39;;
  }

void类型

<?php
  function swap(&$left, &$right) : void{
    //...
  }

多异常捕获

<?php
try {
    // some code
} catch (FirstException | SecondException $e) {
    // ...
}

PHP7.2


新的对象类型object

<?php
 
function test(object $obj) : object
{
    return new SplQueue();
}
 
test(new StdClass());

允许重写抽象方法

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

<?php
 
abstract class A
{
    abstract function test(string $s);
}
abstract class B extends A
{
    // overridden - still maintaining contravariance for parameters and covariance for return
    abstract function test($s) : int;
}

PHP7.4


类属性支持类型声明

<?php
class User {
    public int $id;
    public string $name;
}

箭头函数

使用隐式按值作用域绑定定义函数的简写语法。

<?php
  $factor = 10;
  $nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
  // $nums = array(10, 20, 30, 40);?>

Null 合并运算符支持方法

<?php
  $array[&#39;key&#39;] ??= computeDefault();
  //if (!isset($array[&#39;key&#39;])) {$array[&#39;key&#39;] = computeDefault();}
?>

Opcache 预加载

Opcache将获取您的PHP源文件,将其编译为“ opcodes”,然后将这些编译后的文件存储在磁盘上。opcache会跳过源文件和PHP解释器在运行时实际需要之间的转换步骤。

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差不多,不过是严格===匹配

<?php
$key = &#39;b&#39;;
$str = match($key) {
    &#39;a&#39; => '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调用,不报错,返回空

构造器属性提升

在构造函数中可以声明类属性的修饰词作用域

<?php
    // php8之前
    class User
    {
        protected string $name;
        protected int $age;
        public function __construct(string $name, int $age)
        {
            $this->name = $name;
            $this->age = $age;
        }
    }
    //php8写法,
    class User
    {
        public function __construct(
            protected string $name,
            protected int $age
        ) {}
    }

推荐学习:《PHP视频教程

以上是一文详解PHP5-8各版本特性【汇总】的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:segmentfault。如有侵权,请联系admin@php.cn删除
PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型?PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型?Apr 17, 2025 am 12:25 AM

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。

PHP如何处理对象克隆(克隆关键字)和__clone魔法方法?PHP如何处理对象克隆(克隆关键字)和__clone魔法方法?Apr 17, 2025 am 12:24 AM

PHP中使用clone关键字创建对象副本,并通过\_\_clone魔法方法定制克隆行为。1.使用clone关键字进行浅拷贝,克隆对象的属性但不克隆对象属性内的对象。2.通过\_\_clone方法可以深拷贝嵌套对象,避免浅拷贝问题。3.注意避免克隆中的循环引用和性能问题,优化克隆操作以提高效率。

PHP与Python:用例和应用程序PHP与Python:用例和应用程序Apr 17, 2025 am 12:23 AM

PHP适用于Web开发和内容管理系统,Python适合数据科学、机器学习和自动化脚本。1.PHP在构建快速、可扩展的网站和应用程序方面表现出色,常用于WordPress等CMS。2.Python在数据科学和机器学习领域表现卓越,拥有丰富的库如NumPy和TensorFlow。

描述不同的HTTP缓存标头(例如,Cache-Control,ETAG,最后修饰)。描述不同的HTTP缓存标头(例如,Cache-Control,ETAG,最后修饰)。Apr 17, 2025 am 12:22 AM

HTTP缓存头的关键玩家包括Cache-Control、ETag和Last-Modified。1.Cache-Control用于控制缓存策略,示例:Cache-Control:max-age=3600,public。2.ETag通过唯一标识符验证资源变化,示例:ETag:"686897696a7c876b7e"。3.Last-Modified指示资源最后修改时间,示例:Last-Modified:Wed,21Oct201507:28:00GMT。

说明PHP中的安全密码散列(例如,password_hash,password_verify)。为什么不使用MD5或SHA1?说明PHP中的安全密码散列(例如,password_hash,password_verify)。为什么不使用MD5或SHA1?Apr 17, 2025 am 12:06 AM

在PHP中,应使用password_hash和password_verify函数实现安全的密码哈希处理,不应使用MD5或SHA1。1)password_hash生成包含盐值的哈希,增强安全性。2)password_verify验证密码,通过比较哈希值确保安全。3)MD5和SHA1易受攻击且缺乏盐值,不适合现代密码安全。

PHP:服务器端脚本语言的简介PHP:服务器端脚本语言的简介Apr 16, 2025 am 12:18 AM

PHP是一种服务器端脚本语言,用于动态网页开发和服务器端应用程序。1.PHP是一种解释型语言,无需编译,适合快速开发。2.PHP代码嵌入HTML中,易于网页开发。3.PHP处理服务器端逻辑,生成HTML输出,支持用户交互和数据处理。4.PHP可与数据库交互,处理表单提交,执行服务器端任务。

PHP和网络:探索其长期影响PHP和网络:探索其长期影响Apr 16, 2025 am 12:17 AM

PHP在过去几十年中塑造了网络,并将继续在Web开发中扮演重要角色。1)PHP起源于1994年,因其易用性和与MySQL的无缝集成成为开发者首选。2)其核心功能包括生成动态内容和与数据库的集成,使得网站能够实时更新和个性化展示。3)PHP的广泛应用和生态系统推动了其长期影响,但也面临版本更新和安全性挑战。4)近年来的性能改进,如PHP7的发布,使其能与现代语言竞争。5)未来,PHP需应对容器化、微服务等新挑战,但其灵活性和活跃社区使其具备适应能力。

为什么要使用PHP?解释的优点和好处为什么要使用PHP?解释的优点和好处Apr 16, 2025 am 12:16 AM

PHP的核心优势包括易于学习、强大的web开发支持、丰富的库和框架、高性能和可扩展性、跨平台兼容性以及成本效益高。1)易于学习和使用,适合初学者;2)与web服务器集成好,支持多种数据库;3)拥有如Laravel等强大框架;4)通过优化可实现高性能;5)支持多种操作系统;6)开源,降低开发成本。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具