溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP5-8各版本的特性是什么

發(fā)布時間:2022-07-27 16:56:45 來源:億速云 閱讀:120 作者:iii 欄目:編程語言

今天小編給大家分享一下PHP5-8各版本的特性是什么的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

PHP5-8各版本的特性是什么

PHP5-8各版本特性匯總

PHP5.1:

  • autoload

  • PDO

  • MySQLi

  • 類型約束

PHP5.2:

  • JSON 支持

PHP5.3:

  • 命名空間

  • 匿名函數(shù)

  • 閉包

  • 新增魔術(shù)方法__callStatic()__invoke()

  • 新增魔術(shù)變量__DIR__

  • 動態(tài)調(diào)用靜態(tài)方法

  • 延遲靜態(tài)綁定

  • Heredoc和 Nowdoc

  • 類外使用const定義常量

  • 三元運(yùn)算符

  • Phar

PHP5.4:

  • Short Open Tag

  • 數(shù)組簡寫

  • Traits,

  • 內(nèi)置 Web 服務(wù)器

  • 動態(tài)訪問靜態(tài)方法

  • 實(shí)例化時訪問類成員

PHP5.5:

  • yield

  • list用于foreach

  • 細(xì)節(jié)修改

PHP5.6:

  • 常量增強(qiáng)

  • 命名空間增強(qiáng)

  • 可變函數(shù)參數(shù)

PHP7.0:

  • 標(biāo)量類型聲明

  • 返回值類型聲明

  • defined定義常量數(shù)組

  • 匿名類

  • null合并運(yùn)算符

PHP7.1:

  • 可為空類型

  • void類型

  • 多異常捕獲

PHP7.2:

  • 新的對象object

  • 允許重寫抽象方法

PHP7.3:語法層面沒有很大的改變

PHP7.4:

  • 類型屬性

  • 箭頭函數(shù)

  • Null合并運(yùn)算符支持方法

  • Opcache 預(yù)加載

PHP8.0:

  • JIT即時編譯

  • 命名參數(shù)

  • 注解

  • 聯(lián)合類型

  • Match表達(dá)式

  • Nullsafe 運(yùn)算符

  • 構(gòu)造器屬性提升

PHP5.1


__autoload()魔術(shù)方法

這是一個自動加載函數(shù),在PHP5中,當(dāng)我們實(shí)例化一個未定義的類時,就會觸發(fā)此函數(shù)??梢酝ㄟ^定義這個函數(shù)來啟用類的自動加載。
function  __autoload($className) {  
    $filePath = “project/class/{$className}.php”;  
    if (is_readable($filePath)) {  
        require($filePath);  //這里可以只用require,因為一旦包含進(jìn)來后,php引擎再遇到類A時,將不會調(diào)用__autoload,而是直接使用內(nèi)存中的類A,不會導(dǎo)致多次包含。
    }  
}  
$a = new A();  
$b = new B();  
$c = new C();

PHP中__autoload()魔術(shù)方法詳解

PDO

PHP 數(shù)據(jù)對象 (PDO) 擴(kuò)展為PHP訪問數(shù)據(jù)庫定義了一個輕量級的一致接口。
安裝

可以通過 PHP 的 phpinfo() 函數(shù)來查看是否安裝了PDO擴(kuò)展。

//Linux
extension=pdo.so
//Windows  
extension=php_pdo.dll
使用
<?php
$dbms='mysql';     //數(shù)據(jù)庫類型
$host='localhost'; //數(shù)據(jù)庫主機(jī)名
$dbName='test';    //使用的數(shù)據(jù)庫
$user='root';      //數(shù)據(jù)庫連接用戶名
$pass='';          //對應(yīng)的密碼
$dsn="$dbms:host=$host;dbname=$dbName";


try {
    $dbh = new PDO($dsn, $user, $pass); //初始化一個PDO對象
    echo "連接成功<br/>";
    /*你還可以進(jìn)行一次搜索操作
    foreach ($dbh->query('SELECT * from FOO') as $row) {
        print_r($row); //你可以用 echo($GLOBAL); 來看到這些值
    }
    */
    $dbh = null;
} catch (PDOException $e) {
    die ("Error!: " . $e->getMessage() . "<br/>");
}
//默認(rèn)這個不是長連接,如果需要數(shù)據(jù)庫長連接,需要最后加一個參數(shù):array(PDO::ATTR_PERSISTENT => true) 變成這樣:
$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));

PHP PDO

MySQLi

mysqli.dll是PHP對mysql新特性的一個擴(kuò)展支持,允許訪問MySQL 4.1及以上版本提供的功能。
mysql與mysqli的區(qū)別:
  • mysqli連接是永久連接,而mysql是非永久連接。

  • mysql連接每當(dāng)?shù)诙问褂玫臅r候,都會重新打開一個新的進(jìn)程。mysqli連接一直都只使用同一個進(jìn)程。

使用
$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的區(qū)別是什么

類型約束

通過類型約束可以限制參數(shù)的類型,不過這一機(jī)制并不完善,目前僅適用于類和 callable(可執(zhí)行類型) 以及 array(數(shù)組), 不適用于 string 和 int.

// 限制第一個參數(shù)為 MyClass, 第二個參數(shù)為可執(zhí)行類型,第三個參數(shù)為數(shù)組
function MyFunction(MyClass $a, callable $b, array $c)
{
    // ...
}

PHP5.2


JSON

  • json_encode — 對變量進(jìn)行 JSON 編碼

  • json_decode — 對 JSON 格式的字符串進(jìn)行解碼

PHP5.3


命名空間

避免不同包中的類名或變量名產(chǎn)生沖突
<?php
namespace XXX; // 命名空間的分隔符是反斜杠,該聲明語句必須在文件第一行。

匿名函數(shù)(閉包)

用來臨時性地創(chuàng)建一個無名函數(shù),用于回調(diào)函數(shù)等用途。
$func = function($arg)
{
    print $arg;
};
$func("Hello World! hovertree.top");

新增魔術(shù)方法__callStatic()__invoke()

__callStatic():用靜態(tài)方式中調(diào)用一個不可訪問方法時調(diào)用

__invoke() :以調(diào)用函數(shù)的方式調(diào)用一個對象時的回應(yīng)方法

$person = new Person('小明'); // 初始賦值
$person(); //觸發(fā)__invoke()

新增魔術(shù)變量__DIR__

獲取當(dāng)前執(zhí)行的PHP腳本所在的目錄

如當(dāng)前執(zhí)行的PHP文件為 /htdocs/index.php,則__FILE__等于’/htdocs/index.php’,而__DIR__等于’/htdocs’。

動態(tài)調(diào)用靜態(tài)方法

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

$className = 'cls';
$className::test('Tom'); // PHP >= 5.3.0

延遲靜態(tài)綁定

PHP 5.3.0中增加了一個static關(guān)鍵字來引用當(dāng)前類,即實(shí)現(xiàn)了延遲靜態(tài)綁定。

這是因為 self 的語義本來就是“當(dāng)前類”,所以 PHP5.3 給 static 關(guān)鍵字賦予了一個新功能:后期靜態(tài)綁定

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定義常量

常量是一個簡單的標(biāo)識符。在腳本執(zhí)行期間該值不能改變(除了所謂的魔術(shù)常量,他們其實(shí)不是常量)。常量默認(rèn)大小寫敏感。通常常量標(biāo)識符總是大寫的。

可以用define()函數(shù)來定義常量。在php5.3.0以后,可以使用const關(guān)鍵字在類定義的外部定義常量,先前版本const關(guān)鍵字只能在類(class)中使用。一個常量一旦被定義,就不能再改變或取消定義。

const和define的區(qū)別?
  • const是一個語言結(jié)構(gòu),而define是一個函數(shù)。const在編譯時要比define快很多。

const用于類成員變量的定義,一經(jīng)定義,不可修改。Define不可以用于類成員變量的定義,可用于全局常量。

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

  • Const不能在條件語句中定義常量

  • const采用普通的常量名稱,define可以采用表達(dá)式作為名稱

  • const只能接受靜態(tài)的標(biāo)量,而define可以采用任何表達(dá)式

  • const定義的常量時大小寫敏感,而define可以通過第三個參數(shù)(為true表示大小寫不敏感)來指定大小寫是否敏感。

PHP常量兩種定義方法:define和const有什么區(qū)別

簡化三元運(yùn)算符

從PHP 5.3開始,通過排除中間表達(dá)式,甚至可以進(jìn)一步簡化三元語句。 如果測試表達(dá)式在布爾上下文中評估為true,則返回其值。 否則,將返回替代方法。

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

Phar

PHP5.3之后支持了類似Java的jar包,名為phar。用來將多個PHP文件打包為一個文件。

創(chuàng)建一個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可以很方便的打包你的代碼,集成部署到線上機(jī)器。

  • php phar教程,PHP中phar包的使用教程

  • PHP 5.3中的新特性及被棄用的功能函數(shù)總結(jié)

  • PHP5各個版本的新功能和新特性總結(jié)

PHP5.4


Short Open Tag 短開放標(biāo)簽

自 PHP5.4 起總是可用。
//可以把
<?php echo $xxoo;?>
//簡寫成:  
<?= $xxoo;?>

數(shù)組簡寫

// 原來的數(shù)組寫法
$arr = array("key" => "value", "key2" => "value2");
// 簡寫形式
$arr = ["key" => "value", "key2" => "value2"];

Traits

Traits是 PHP 多重繼承的一種解決方案。PHP中無法進(jìn)行多重繼承,但一個類可以包含多個Traits
// Traits不能被單獨(dú)實(shí)例化,只能被類所包含
trait SayWorld
{
    public function sayHello()
    {
        echo 'World!';
    }
}
class MyHelloWorld
{
    // 將SayWorld中的成員包含進(jìn)來
    use SayWorld;
}

$xxoo = new MyHelloWorld();
// sayHello() 函數(shù)是來自 SayWorld 構(gòu)件的
$xxoo->sayHello();
優(yōu)先級

基類中的成員函數(shù)將被Traits中的函數(shù)覆蓋,當(dāng)前類中的成員函數(shù)將覆蓋Traits中的函數(shù)。

內(nèi)置 Web 服務(wù)器

PHP從5.4開始內(nèi)置一個輕量級的Web服務(wù)器,不支持并發(fā),定位是用于開發(fā)和調(diào)試環(huán)境。
在開發(fā)環(huán)境使用它的確非常方便。

php -S localhost:8000

動態(tài)訪問靜態(tài)方法

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

實(shí)例化時訪問類成員

(new MyClass)->xxoo();

PHP5.5


yield關(guān)鍵字

yield關(guān)鍵字用于當(dāng)函數(shù)需要返回一個迭代器的時候,逐個返回值。

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";

細(xì)節(jié)修改

  • 不推薦使用 mysql 函數(shù),推薦使用 PDO 或 MySQLi

  • 不再支持Windows XP.

  • 可用 MyClass::class 取到一個類的完整限定名(包括命名空間)

  • empty() 支持表達(dá)式作為參數(shù)

  • try-catch 結(jié)構(gòu)新增 finally 塊

PHP5.6


常量增強(qiáng)

  • 定義常量時允許使用之前定義的常量進(jìn)行計算

    const A = 2;
    const B = A + 1;
  • 允許常量作為函數(shù)參數(shù)默認(rèn)值

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

可變函數(shù)參數(shù)

用于代替 func_get_args()

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

同時可以在調(diào)用函數(shù)時,把數(shù)組展開為函數(shù)參數(shù):

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

命名空間增強(qiáng)

命名空間支持常量和函數(shù)

PHP7.0


標(biāo)量類型聲明

四種標(biāo)量類型:boolean (布爾型),integer (整型),float (浮點(diǎn)型, 也稱作 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 定義數(shù)組

define('ANIMALS', [
    'dog',
    'cat',
    'bird'
]);
echo ANIMALS[1]; // 輸出 "cat"

匿名類

匿名類就像一個沒有事先定義的類,而在定義的時候直接就進(jìn)行了實(shí)例化。

// 直接定義
$objA = new class{
    public function getName(){
        echo "I'm objA";
    }
};
$objA->getName();

null 合并運(yùn)算符

$username = $_GET['user'] ?? 'nobody';
//這兩個是等效的  當(dāng)不存在user 則返回?? 后面的參數(shù)
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

PHP7.1


可為空類型

參數(shù)以及返回值的類型現(xiàn)在可以通過在類型前加上一個問號使之允許為空。

當(dāng)啟用這個特性時,傳入的參數(shù)或者函數(shù)返回的結(jié)果要么是給定的類型,要么是 null 。

<?php
  function testReturn(): ?string{
    return 'elePHPant';
  }

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

允許重寫抽象方法

當(dāng)一個抽象類繼承于另外一個抽象類的時候,繼承后的抽象類可以重寫被繼承的抽象類的抽象方法。

<?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;
}

箭頭函數(shù)

使用隱式按值作用域綁定定義函數(shù)的簡寫語法。

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

Null 合并運(yùn)算符支持方法

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

Opcache 預(yù)加載

Opcache將獲取您的PHP源文件,將其編譯為“ opcodes”,然后將這些編譯后的文件存儲在磁盤上。opcache會跳過源文件和PHP解釋器在運(yùn)行時實(shí)際需要之間的轉(zhuǎn)換步驟。

  • 掌握PHP 7.x 各個版本的新特性

  • PHP7.0~PHP7.1~PHP7.2~PHP7.3~PHP7.4新特性

PHP8.0


JIT即時編譯

PHP8的JIT目前是在Opcache之中提供的

JIT在Opcache優(yōu)化之后的基礎(chǔ)上,結(jié)合Runtime的信息再次優(yōu)化,直接生成機(jī)器碼

JIT不是原來Opcache優(yōu)化的替代,是增強(qiáng)

目前PHP8只支持x86架構(gòu)的CPU

命名參數(shù)

就是具名參數(shù),在調(diào)用函數(shù)的時候,可以指定參數(shù)名稱,指定參數(shù)名稱后,參數(shù)順序可以不安裝原函數(shù)參數(shù)順序傳
//傳統(tǒng)方式調(diào)用
balance(100, 20);
//php8 使用命名參數(shù)調(diào)用
balance(amount: 100, payment: 20);

注解

使用注解可以將類定義成一個一個低解耦,高內(nèi)聚的元數(shù)據(jù)類。在使用的時候通過注解靈活引入,反射注解類實(shí)例的時候達(dá)到調(diào)用的目的。
注解類只有在被實(shí)例化的時候才會調(diào)用

聯(lián)合類型

在不確定參數(shù)類型的場景下,可以使用

function printSomeThing(string|int $value)
{
    var_dump($value);
}

Match表達(dá)式

和switch cash差不多,不過是嚴(yán)格===匹配

<?php
$key = 'b';
$str = match($key) {
    'a' => 'this a',
    'c' => 'this c',
     0  => 'this 0',
    'b' => 'last b',
  };
echo $str;//輸出 last b

Nullsafe 運(yùn)算符

//不實(shí)例 User 類,設(shè)置為null
$user = null;
echo $user->getName();//php8之前調(diào)用,報錯
echo $user?->getName();//php8調(diào)用,不報錯,返回空

構(gòu)造器屬性提升

在構(gòu)造函數(shù)中可以聲明類屬性的修飾詞作用域

<?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
        ) {}
    }

以上就是“PHP5-8各版本的特性是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI