首頁  >  文章  >  後端開發  >  php中命名空間與性狀以及生成器新特性的詳解

php中命名空間與性狀以及生成器新特性的詳解

黄舟
黄舟原創
2017-07-18 15:37:141382瀏覽

這篇文章主要為大家介紹了關於PHP新特性之命名空間、性狀與生成器的相關資料,主要涉及到php中trait(性狀)與generator(生成器) 方面的內容,對於php中trait (性狀)與generator(生成器) 有興趣的同學可以參考一下。

本文主要跟大家介紹了關於PHP新特性之命名空間、性狀與生成器的相關內容,分享出來供大家參考學習,下面來一起看看詳細的介紹:

1.命名空間

#命名空間是什麼?

     1).命名空間在PHP 5.3中被引入,類似資料夾的功能。例如Symfony框架中的Request和Response,則位於Symfony的命名空間下。

     2).命名空間總是應該在

     3).PHP檔案的命名空間和作業系統的實體檔案系統不同,這是一個虛擬的概念,沒有必要和檔案系統的目錄結構完全對應。雖然如此,絕大多數PHP元件為了相容於廣泛使用的PSR4自動載入標準,會把子命名空間放到檔案系統的子目錄中去。

     4).命名空間只是PHP語言的一種記號,PHP解譯器會將這個記號作為前綴加到類別、介面、函數和常數的名稱前面。

為什麼需要命名空間?

     1).命名空間讓程式可以像沙盒一樣運作,可以和其他開發者寫的程式碼一起使用。確保了自己的程式碼和專案可以與專案的第三方依賴一起使用。

宣告命名空間

     1).頂層命名空間常用來設定頂層廠商名。 2).廠商的命名空間必須具有全域唯一性,子命名空間就沒有那麼重要,但有助於組織專案的程式碼。

匯入和別名

     1).從PHP5.3開始可以匯入PHP類別、介面和其他命名空間,並為其建立別名。從PHP5.6開始可以匯入PHP函數和常數,並為其建立別名。

     2).使用use關鍵字匯入程式碼時無須在開頭加上符號,因為PHP假定導入的是完全限定命名空間。 use關鍵字必須出現在全域作用域中即不能出現在類別或函數中,因為這個關鍵字是在編譯的時候使用的,不過,use關鍵字可以在命名空間聲明語句後使用,導入其他命名空間的代碼。

從PHP5.6開始我們可以導入函數和常數。


<?php
use func Namespace\functionName;

functionName();

也可以匯入常數,


#
use constant Namespace\CONS_NAME;
echo CONS_NAME;

函數和常數的別名與類別名稱的建立方式一樣。

最佳實務

      1).PHP允許在一個PHP檔案定義多個命名空間。但是這麼做容易讓人困惑,違背了一個文件一個類別的良好實踐。 2).在一個命名空間中引用全域的命名空間的代碼時,需要加上前綴,告訴PHP需要在全域中尋找該類,例如PHP原生的異常類。

自動載入

      1).命名空間為PHP-FIG制定的PSR4自動載入器奠定了堅實的基礎。

2.使用介面

      1).就像我可以選擇開不一樣的車。因為他們都有方向盤、油門和煞車,燃料都是汽油。

3.性狀

      1).形狀是類別的部分實作(常數、屬性與方法),可以混入一個或多個在現有的PHP類別中,性狀有兩個作用,顯示類別可以做什麼(類似介面),提供模組化實踐(類似類別)。

      2).性狀讓兩個無關的類別可以使用相同屬性和方法。

      3).PHP解譯器會將性狀複製貼上到類別的定義體中。

4.建立生成器

1)在普通函數中一次或多次使用yield關鍵字,不傳回值,只生成值,這個函數就是一個生成器。例如:


<?php
function myGenerator() {
 yield &#39;value1&#39;;
 yield &#39;value2&#39;;
}

呼叫生成器函數的時候,PHP會傳回一個屬於Generator類別的對象,這個物件可以使用foreach()函數迭代,每次迭代,PHP會要求這個物件的實例計算並提供下一個要迭代的值,生成器的優雅之處就是在每產出一個值之後,生成器內部狀態會一直停頓和恢復之間切換,直到抵達定義體的末尾或是遇到空的return;語句為止,例如:


<?php
foreach (myGenerator() as $yieldedValue) {
 echo $yieldedValue, PHP_EOL;
}

以上範例會輸出


value1
value2

2) .生成器是如何節約記憶體的?產生一個範圍內的數值(錯誤方式)


#
function makeRange($length) {
 $dataset = [];
 for ($i=0; $i < $length; $i++) {
 $dataset[] = $i;
 }
 return $dataset;
}

$customRange = makeRange(1000000);
foreach ($customeRange as $i) {
 echo $i, PHP_EOL;
}

预先创建了一个包含很大整数组成的数组,再看使用生成器的例子。


function makeRange($length) {
 for ($i = 0; $i < $length; $i++) {
 yield $i;
 }
}

foreach(makeRange(1000000) as $i) {
 echo $i, PHP_EOL;
}

在实际的例如迭代一个4GB大小的文件中功能中,迭代器大展身手。


function getRows($file) {
 $handle = fopen($file, &#39;rb&#39;);
 if ($handle === false) {
 throw new Exception();
 }
 //feof()函数检测是否到达文件末尾
 while (feof($handle) === false) {
 //fgetcsv()一次读取csv文件的一行
 yield fgetcsv($handle);
 }
 fclose($handle)
}

foreach (getRows(&#39;data.csv&#39;) as $row) {
 print_r($row);
}

3).生成器没有为PHP添加新功能,需要实现在数据集中执行快进、快退和查找,最好自己编写类实现Iterator接口,或者使用PHP标准库中的某个原生迭代器。

原生迭代器链接

总结

以上是php中命名空間與性狀以及生成器新特性的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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