作用:類似於目錄結構規範類,有效避免類衝突,是實現自動載入的前提。
//定義名稱空間
namespace Symfony\Component\HttpFoundation;
//使用名稱空間和預設的別名
use Symfony\Component\HttpFoundation\Response;
//匯入函式和常量
use func Namespace\functionName;
use const Namespace\CONST_NAME;
全域性名稱空間示例
namespace My\app;
class Foo
{
public function doSomethind()
{
//$exception = new Exception(); //會報錯,My\app\Exception 類不存在
//應該在全域性中引入Exception類
$exception = new \Exception();
}
}
詳細可檢視部落格:PHP 物件導向 (三)名稱空間
//你定義的介面
interface Documentable
{
public function getId();
public function getContent();
}
//你定義的類
class DocumentStore
{
protected $data = [];
//方法引數為 實現Documentable介面 的 類的例項物件
public function addDocument(Documentable $document)
{
$key = $document->getId();
$value = $document->getContent();
$this->data[$key] = $value;
}
public function getDocuments()
{
return $this->data;
}
}
//別人想用你寫的DocumentStore類, 他只需要實現了Documentable介面,而不需要知道DocumentStore類的具體細節,即可使用。這就是面向介面程式設計
class CommandOutputDocument implements Documentable
{
protected $command;
public function __construct($command)
{
$this->command = $command;
}
public function getId()
{
return $this->command;
}
public function getContent()
{
return shell_exec($this->command);
}
}
//使用
$command = new CommandOutputDocument('cat /etc/hosts');
$document = new DocumentStore();
$document->addDocument($command);
$document->getDocuments();
性狀 traits
性狀是類的部分實現,常量,屬性和方法(像是介面)
提供模組化的實現(像是類)
主要用於解耦,減少無效程式碼的重複
//一個簡單的生成器,就是函式,加上斷點
function myGenerator()
{
yield 'value1';
yield 'value2';
yield 'value3';
}
foreach(myGenerator() as $yieldValue){
echo $yieldedValue.PHP_EOL;
}
即輸出
value1
value2
value3
使用生成器處理大csv檔案
//程式只會佔用一行csv字元的記憶體
function getRows($file){
$handle = fopen($file, 'rb');
if($handle === false){
throw new Exception();
}
while (feof($handle) === false){
yield fgetcsv($handle);
}
fclose($handle);
}
foreach (getRows('data.csv') as $orw){
print_r($row);//處理單行資料
}
提示:簡單的excel相關需求,可改用csv格式,csv格式操作更加簡潔,速度會更快。
原理:閉包物件實現了__invoke()魔術方法,只要變數名後面有(), php就會查詢並呼叫該魔術方法
//建立簡單的閉包
$closure = function ($name){
return sprintf('Hello %s', $name);
};
echo $closure("josh");
附加狀態,使用外部變數
function enclosePerson($name){
return function ($doComand) use ($name){
return sprintf('%s, %s', $name, $doComand);
};
}
$clay = enclosePerson('Clay');
echo $clay('get me sweet tea!');
位元組碼快取的作用:基於每次請求php檔案,php解析器會在執行php指令碼時,先解析php指令碼程式碼,把php程式碼編譯成一系列Zend操作碼,然後執行位元組碼。每次都可以執行的話,會消耗很多資源。所以位元組碼的快取在於,快取預先編譯好的位元組碼,減少應用響應時間,降低系統資源的壓力。
本作品採用《CC 協議》,轉載必須註明作者和本文連結