您好,登錄后才能下訂單哦!
今天小編給大家分享一下PHP5-8各版本的特性是什么的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
PHP5.1:
autoload
PDO
類型約束
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)造器屬性提升
這是一個自動加載函數(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ù)方法詳解
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.dll是PHP對mysql新特性的一個擴(kuò)展支持,允許訪問MySQL 4.1及以上版本提供的功能。
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) { // ... }
json_encode — 對變量進(jìn)行 JSON 編碼
json_decode — 對 JSON 格式的字符串進(jìn)行解碼
避免不同包中的類名或變量名產(chǎn)生沖突
<?php namespace XXX; // 命名空間的分隔符是反斜杠,該聲明語句必須在文件第一行。
用來臨時性地創(chuàng)建一個無名函數(shù),用于回調(diào)函數(shù)等用途。
$func = function($arg) { print $arg; }; $func("Hello World! hovertree.top");
__callStatic()
和__invoke()
__callStatic()
:用靜態(tài)方式中調(diào)用一個不可訪問方法時調(diào)用
__invoke()
:以調(diào)用函數(shù)的方式調(diào)用一個對象時的回應(yīng)方法
$person = new Person('小明'); // 初始賦值 $person(); //觸發(fā)__invoke()
__DIR__
獲取當(dāng)前執(zhí)行的PHP腳本所在的目錄
如當(dāng)前執(zhí)行的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關(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()
常量是一個簡單的標(biāo)識符。在腳本執(zhí)行期間該值不能改變(除了所謂的魔術(shù)常量,他們其實(shí)不是常量)。常量默認(rèn)大小寫敏感。通常常量標(biāo)識符總是大寫的。
可以用define()函數(shù)來定義常量。在php5.3.0以后,可以使用const關(guān)鍵字在類定義的外部定義常量,先前版本const關(guān)鍵字只能在類(class)中使用。一個常量一旦被定義,就不能再改變或取消定義。
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ū)別
從PHP 5.3開始,通過排除中間表達(dá)式,甚至可以進(jìn)一步簡化三元語句。 如果測試表達(dá)式在布爾上下文中評估為true,則返回其值。 否則,將返回替代方法。
<?php $favoriteColor = $_GET["color"] ?: "pink";
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 起總是可用。
//可以把 <?php echo $xxoo;?> //簡寫成: <?= $xxoo;?>
// 原來的數(shù)組寫法 $arr = array("key" => "value", "key2" => "value2"); // 簡寫形式 $arr = ["key" => "value", "key2" => "value2"];
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();
基類中的成員函數(shù)將被Traits中的函數(shù)覆蓋,當(dāng)前類中的成員函數(shù)將覆蓋Traits中的函數(shù)。
PHP從5.4開始內(nèi)置一個輕量級的Web服務(wù)器,不支持并發(fā),定位是用于開發(fā)和調(diào)試環(huán)境。
在開發(fā)環(huán)境使用它的確非常方便。
php -S localhost:8000
$func = "funcXXOO"; A::{$func}();
(new MyClass)->xxoo();
yield關(guān)鍵字用于當(dāng)函數(shù)需要返回一個迭代器的時候,逐個返回值。
function number10() { for($i = 1; $i <= 10; $i += 1) yield $i; }
$array = [ [1, 2, 3], [4, 5, 6], ]; foreach ($array as list($a, $b, $c)) echo "{$a} {$b} {$c}\n";
不推薦使用 mysql 函數(shù),推薦使用 PDO 或 MySQLi
不再支持Windows XP.
可用 MyClass::class 取到一個類的完整限定名(包括命名空間)
empty() 支持表達(dá)式作為參數(shù)
try-catch 結(jié)構(gòu)新增 finally 塊
定義常量時允許使用之前定義的常量進(jìn)行計算
const A = 2; const B = A + 1;
允許常量作為函數(shù)參數(shù)默認(rèn)值
function func($arg = C::STR2)asdf
用于代替 func_get_args()
function add(...$args) { //... }
同時可以在調(diào)用函數(shù)時,把數(shù)組展開為函數(shù)參數(shù):
$arr = [2, 3]; add(1, ...$arr);
命名空間支持常量和函數(shù)
四種標(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('ANIMALS', [ 'dog', 'cat', 'bird' ]); echo ANIMALS[1]; // 輸出 "cat"
匿名類就像一個沒有事先定義的類,而在定義的時候直接就進(jìn)行了實(shí)例化。
// 直接定義 $objA = new class{ public function getName(){ echo "I'm objA"; } }; $objA->getName();
$username = $_GET['user'] ?? 'nobody'; //這兩個是等效的 當(dāng)不存在user 則返回?? 后面的參數(shù) $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
參數(shù)以及返回值的類型現(xiàn)在可以通過在類型前加上一個問號使之允許為空。
當(dāng)啟用這個特性時,傳入的參數(shù)或者函數(shù)返回的結(jié)果要么是給定的類型,要么是 null 。
<?php function testReturn(): ?string{ return 'elePHPant'; }
<?php function swap(&$left, &$right) : void{ //... }
<?php try { // some code } catch (FirstException | SecondException $e) { // ... }
<?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; }
<?php class User { public int $id; public string $name; }
使用隱式按值作用域綁定定義函數(shù)的簡寫語法。
<?php $factor = 10; $nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]); // $nums = array(10, 20, 30, 40);?>
<?php $array['key'] ??= computeDefault(); //if (!isset($array['key'])) {$array['key'] = computeDefault();} ?>
Opcache將獲取您的PHP源文件,將其編譯為“ opcodes”,然后將這些編譯后的文件存儲在磁盤上。opcache會跳過源文件和PHP解釋器在運(yùn)行時實(shí)際需要之間的轉(zhuǎn)換步驟。
掌握PHP 7.x 各個版本的新特性
PHP7.0~PHP7.1~PHP7.2~PHP7.3~PHP7.4新特性
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ù),在調(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)用
在不確定參數(shù)類型的場景下,可以使用
function printSomeThing(string|int $value) { var_dump($value); }
和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
//不實(shí)例 User 類,設(shè)置為null $user = null; echo $user->getName();//php8之前調(diào)用,報錯 echo $user?->getName();//php8調(diào)用,不報錯,返回空
在構(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è)資訊頻道。
免責(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)容。