實現一個簡單的 dd 庫

Nine發表於2017-09-13

前幾天寫了一個簡單的Laraveldd庫。
為什麼自己要寫一個這樣的庫?
Laravel本身已經實現了自己的輸出dd函式,但是我之所以要寫這樣一個庫,一來是因為Laravel本身對這個庫的封裝沒辦法很好的解剖出來,另一方面,他的實現過於複雜。
如果覺得好用可以star一下嘛~

安裝方式

  1. composer 安裝

    composer require nine/dd 
  2. 直接下載
    clone 下來即可

使用

  1. 如我在exapmle.php中所寫,我們既可以直接使用:
\dd\Dump::dump('hello,nine');

同時也可以自己封裝一個dd函式:

function dd($value)
{
    \dd\Dump::dump($value);
}
dd("hello,nine");

不管是哪種方式,他都會自動的識別我們的型別來予以不同的展示效果。

此外,如果需要自己單獨配置樣式和新增裝飾符號,可以在conf目錄下根據所給的註釋予以新增。

效果

  • string

d84bc944-3427-4ad8-bee4-822f6ce1775a.png

  • array

d5f42a26-f46b-4a5f-9894-a558e8be994b.png

  • function

9f0c4815-d1a6-4d3f-999a-0ceeb6ab49ac.png

  • object

2f1a3c3a-c621-46ee-97d2-ff610d245a9e.png

+代表public-代表private#代表protected,屬性後面灰色的部分代表預設值。

結構

.
├── Dump.php
├── conf
│   ├── css.php
│   └── decorator.php
├── decorator
│   ├── DecoratorComponent.php
│   ├── Div.php
│   ├── P.php
│   └── Span.php
└── render
    ├── AbstractDump.php
    ├── DumpArray.php
    ├── DumpObject.php
    └── DumpString.php

以上是他的主要目錄結構。

  1. 其中Dump.php主要是我們用來中轉型別的地方,他會根據我們提供資料的不同型別,來解析並用反射類來幫我們實現中轉。
    conf層主要是一些配置檔案,css.php是一個樣式配置檔案,decorator.php是一個我們需要定製的裝飾器,比如=>符號之類的。
  2. decorator是裝飾器層,DecoratorComonent.php是一個裝飾器基類,他的主要工作是用來初始化我們的樣式表,同時提供了一些可以讓我們自定義的方法,比如新增span裝飾器,或者給這個裝飾器新增一些樣式等等。Span.php等檔案主要是我們的具體裝飾器,其中主要有兩個方法,wrap方法來完善最終的輸出效果,而display方法則是用來輸出。
  3. render是渲染層,這裡就像是一個效果加工廠,比如前面提到的decorator提供了一些新增樣式的工具,那麼這裡就是用來呼叫這些工具的地方。AbstractRender.php是一個基類,裡面提供了一些初始化我們前面提到的自定義裝飾器符號的工具,還有包裹解析我們的陣列形成陣列的裝飾效果(因為像物件還有函式都會用到它),還有像parseParams會根據我們傳入的函式(方法)的引數所形成的反射陣列,來進行解析,判斷他的預設值等,最終形成一個包裹好的裝飾器;display方法主要就是獲取我們的span之類的裝飾器,然後最終呼叫裝飾器的display方法來予以輸出。
    而裡面的諸如DumpString.php主要是有提供一個render方法來給外面的Dump.php使用,這幾個就是會根據具體的型別來進行解析了。

大概思路

我們最終要實現的一個頁面效果是像Dom節點一樣,一層一層的包裹著我們最終的元素。所以我能第一時間聯絡到的就是裝飾器。裝飾器去生產各種Dom節點,為了防止生產物件的濫用,我這裡也在AbstractDump.php檔案中加入了單例的判斷。當然,裡面可能有許多設計的不夠合理的地方,還望指正。


個人部落格地址:http://www.hellonine.top

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Nine

相關文章