目錄
PHP5-8各版本特性彙總
#這是一個自動載入函數,在PHP5中,當我們實例化一個未定義的類時,就會觸發此函數。可以透過定義這個函數來啟用類別的自動載入
PHP中__autoload()魔術方法詳解
MySQLi
新增魔术变量__DIR__
动态调用静态方法
延迟静态绑定
类外使用const定义常量
const和define的区别?
简化三元运算符
Phar
PHP8.0
数组简写
Traits
优先级
内置 Web 服务器
动态访问静态方法
实例化时访问类成员
list() 用于 foreach
细节修改
常量增强
可变函数参数
命名空间增强
标量类型声明
返回值类型声明
define 定义数组
匿名类
null 合并运算符
void类型
多异常捕获
新的对象类型object
允许重写抽象方法
类属性支持类型声明
箭头函数
Null 合并运算符支持方法
Opcache 预加载
命名参数
注解
联合类型
Match表达式
Nullsafe 运算符
构造器属性提升
首頁 後端開發 php教程 一文詳解PHP5-8各版本特性【匯總】

一文詳解PHP5-8各版本特性【匯總】

Jul 27, 2022 am 11:42 AM
php

這篇文章總結了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();
登入後複製

PHP中__autoload()魔術方法詳解

  • ##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));
    登入後複製
  • #PHP PDO

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'];
}
登入後複製

#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###############命名空間#############避免不同套件中的類別名稱或變數名稱產生衝突## #
<?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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱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 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles