您好,登錄后才能下訂單哦!
今天小編給大家分享一下PHP5-8各版本的特性是什么的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
PHP5.1:
autoload
PDO
類型約束
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中,當我們實例化一個未定義的類時,就會觸發此函數。可以通過定義這個函數來啟用類的自動加載。
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()魔術方法詳解
PHP 數據對象 (PDO) 擴展為PHP訪問數據庫定義了一個輕量級的一致接口。
可以通過 PHP 的 phpinfo() 函數來查看是否安裝了PDO擴展。
//Linux extension=pdo.so //Windows extension=php_pdo.dll
<?php $dbms='mysql'; //數據庫類型 $host='localhost'; //數據庫主機名 $dbName='test'; //使用的數據庫 $user='root'; //數據庫連接用戶名 $pass=''; //對應的密碼 $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.dll是PHP對mysql新特性的一個擴展支持,允許訪問MySQL 4.1及以上版本提供的功能。
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) { // ... }
json_encode — 對變量進行 JSON 編碼
json_decode — 對 JSON 格式的字符串進行解碼
避免不同包中的類名或變量名產生沖突
<?php namespace XXX; // 命名空間的分隔符是反斜杠,該聲明語句必須在文件第一行。
用來臨時性地創建一個無名函數,用于回調函數等用途。
$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()
常量是一個簡單的標識符。在腳本執行期間該值不能改變(除了所謂的魔術常量,他們其實不是常量)。常量默認大小寫敏感。通常常量標識符總是大寫的。
可以用define()函數來定義常量。在php5.3.0以后,可以使用const關鍵字在類定義的外部定義常量,先前版本const關鍵字只能在類(class)中使用。一個常量一旦被定義,就不能再改變或取消定義。
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";
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各個版本的新功能和新特性總結
自 PHP5.4 起總是可用。
//可以把 <?php echo $xxoo;?> //簡寫成: <?= $xxoo;?>
// 原來的數組寫法 $arr = array("key" => "value", "key2" => "value2"); // 簡寫形式 $arr = ["key" => "value", "key2" => "value2"];
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中的函數。
PHP從5.4開始內置一個輕量級的Web服務器,不支持并發,定位是用于開發和調試環境。
在開發環境使用它的確非常方便。
php -S localhost:8000
$func = "funcXXOO"; A::{$func}();
(new MyClass)->xxoo();
yield關鍵字用于當函數需要返回一個迭代器的時候,逐個返回值。
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 函數,推薦使用 PDO 或 MySQLi
不再支持Windows XP.
可用 MyClass::class 取到一個類的完整限定名(包括命名空間)
empty() 支持表達式作為參數
try-catch 結構新增 finally 塊
定義常量時允許使用之前定義的常量進行計算
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);
命名空間支持常量和函數
四種標量類型: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('ANIMALS', [ 'dog', 'cat', 'bird' ]); echo ANIMALS[1]; // 輸出 "cat"
匿名類就像一個沒有事先定義的類,而在定義的時候直接就進行了實例化。
// 直接定義 $objA = new class{ public function getName(){ echo "I'm objA"; } }; $objA->getName();
$username = $_GET['user'] ?? 'nobody'; //這兩個是等效的 當不存在user 則返回?? 后面的參數 $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
參數以及返回值的類型現在可以通過在類型前加上一個問號使之允許為空。
當啟用這個特性時,傳入的參數或者函數返回的結果要么是給定的類型,要么是 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());
當一個抽象類繼承于另外一個抽象類的時候,繼承后的抽象類可以重寫被繼承的抽象類的抽象方法。
<?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; }
使用隱式按值作用域綁定定義函數的簡寫語法。
<?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解釋器在運行時實際需要之間的轉換步驟。
掌握PHP 7.x 各個版本的新特性
PHP7.0~PHP7.1~PHP7.2~PHP7.3~PHP7.4新特性
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); }
和switch cash差不多,不過是嚴格===匹配
<?php $key = 'b'; $str = match($key) { 'a' => 'this a', 'c' => 'this c', 0 => 'this 0', 'b' => 'last b', }; echo $str;//輸出 last b
//不實例 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 ) {} }
以上就是“PHP5-8各版本的特性是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。