命名空間 namespace
其作用是按照一種虛擬的層次結構組織PHP代碼,現(xiàn)代PHP組件和框架都放在各自全局唯一的廠商命名空間中俄占,以避免常見類名沖突。命名空間還是PSR-4 自動加載的基礎
<?php
// 聲明命名空間
namespace Symfony\Component\HttpFoundation
// 導入
use Symfony\Component\HttpFoundation\Response;
$response = new Response('Oops',400);
$respons->send();
接口 interface
使用接口編寫的代碼更靈活食听,能委托別人實現(xiàn)細節(jié)奸披。
<?php
// 定義接口方法
interface Doumentable{
public function getId();
public function getContent();
}
<?php
// 接口方法實現(xiàn)1
class HtmlDocument implements Documentable
{
protected $url;
public function __construct($url)
{
$this->url = $url;
}
public function getId()
{
return $this->url;
}
public function getContent()
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
curl_close($ch);
return $html;
}
}
<?php
// 接口方法實現(xiàn)2
class StreamDocument implements Documentable
{
protected $resource;
protected $buffer;
public function __construct($resource, $buffer = 4096)
{
$this->resource = $resource;
$this->buffer = $buffer;
}
public function getId()
{
return 'resource-' . (int)$this->resource;
}
public function getContent()
{
$steamContent = '';
rewind($this->resource);
while (feof($this->resource) == false) {
$steamContent .= fread($this->resource, $this->buffer);
}
return $steamContent;
}
}
性狀 trait
性狀是類的部分實現(xiàn)(即常量,屬性和方法),可以混入一個或多個現(xiàn)有PHP類中视哑。性狀有兩個作用:表明類可以做什么(像是接口)绣否;提供模塊化實現(xiàn)(像是類)。
性狀能把模塊化的實現(xiàn)方式注入多個物管的類中挡毅,而且還能促進代碼重用蒜撮。
<?php
// 創(chuàng)建形狀
trait MyTrait
{
//這里是性狀
}
<?php
class MyClass
{
use MyTrait;
// 這里是類的實現(xiàn)
// 注意:命名空間use 在定義體外,性狀在定義體內
}
生成器 generators
與標準的PHP迭代器不同慷嗜,PHP生成器不要求實現(xiàn)Iterator接口淀弹,從而減輕了類的負擔。生成器會根據(jù)需求計算并產(chǎn)生要迭代的值庆械,不需要占用寶貴的內存薇溃,有助于優(yōu)化性能。
注意:生成器只產(chǎn)出值缭乘,沒有返回值沐序。無法后退或者快進。而且還是一次性的堕绩,無法多次迭代同一個迭代器策幼。不過,如果需要奴紧,可以重建或者克隆生成器特姐。
<?php
// 生成器生成一個范圍數(shù)值
// 一次只會為一個整數(shù)分配內存
function makeRange($length)
{
for ($i = 0; $i < $length; $i++) {
yield $i;
}
}
foreach (makeRange(1000000) as $i) {
echo $i, PHP_EOL;
}
<?php
// 使用生成器處理csv文件
// 每次只會為csv文件中的一行分配內存,不會把整個文件讀入內存中黍氮,適合讀取超大的文件
function getRow($file)
{
$handle = fopen($file, 'rb');
if ($handle == false) {
throw new \Exception();
}
while (feof($handle) === false) {
yield fgetcsv($handle);
}
fclose($handle);
}
foreach (getRow('data.csv') as $row) {
print_r($row);
}
閉包 closure
閉包是指創(chuàng)建時封裝周圍狀態(tài)的函數(shù)唐含。匿名還是是指沒有名稱的函數(shù)。
理論上閉包和匿名函數(shù)是不同的概念沫浆,但是PHP將其視作相同的概念捷枯。
<?php
// 創(chuàng)建簡單的閉包
$closure = function ($name) {
return sprintf('hello %s', $name);
};
echo $closure("John");
// 輸出 --> "hello John"
<?php
// 使用use附加狀態(tài)
function enclosePerson($name)
{
return function ($doCommond) use ($name) {
return sprintf('%s,%s', $name, $doCommond);
};
}
// 把字符串 clay 封裝到閉包中
$caly = enclosePerson('Clay');
// 傳入?yún)?shù),調用閉包
echo $caly('get me sweet tea');
字節(jié)碼緩存 Zend OPcache
PHP 是解釋型語言专执,PHP解析器執(zhí)行PHP腳本時會解析PHP腳本代碼淮捆,把PHP代碼編譯成一系列Zend操作碼,然后執(zhí)行字節(jié)碼本股。每次HTTP請求都必須不斷解析攀痊,編譯和執(zhí)行PHP腳本,會消耗很多資源拄显。字節(jié)碼緩存能存儲先編譯號的PHP字節(jié)碼蚕苇,請求PHPj腳本時PHP解析器會沖內存中讀取預先編譯好的字節(jié)碼,然后執(zhí)行凿叠。只有能節(jié)省時間涩笤,極大地提高性能嚼吞。