Modern PHP(一)特性

一句話兒發表於2020-02-26

作用:類似於目錄結構規範類,有效避免類衝突,是實現自動載入的前提。

//定義名稱空間
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();

詳細可檢視部落格:PHP 物件導向 (九)物件導向三大特徵

性狀 traits

性狀是類的部分實現,常量,屬性和方法(像是介面)

提供模組化的實現(像是類)

主要用於解耦,減少無效程式碼的重複

詳細可檢視部落格:PHP 物件導向 (十)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 協議》,轉載必須註明作者和本文連結
寫的不好,就當是整理下思緒吧。

相關文章