easywechat原始碼學習

2021-09-29 12:21:52 字數 3475 閱讀 9504

通過閱讀好的**,學習其中的設計思想和對設計模式的運用,來提公升自我**水平。

**版本:

├── factory.php // 庫入口,需要初始化哪個元件就生成哪個元件,例如 factory::officialaccount($config)

├── basicservice // 基礎服務

│ ├── contentsecurity

│ ├── jssdk

│ ├── media

│ ├── qrcode

│ └── url

├── kernel // 核心,包含模組的基礎類,以及執行模組所需要的支援

│ ├── accesstoken.php

│ ├── baseclient.php

│ ├── clauses

│ ├── config.php

│ ├── contracts

│ ├── ...

│ ├── auth // auth服務,每個服務下都有乙個serviceprovider.php,用於將自己的類繫結到容器。

│ ├── autoreply

│ ├── base

│ ├── broadcasting

│ ├── card

│ ├── comment

│ ├── ...

│ ├── auth

│ ├── authorizer

│ ├── ...

├── ...

使用示例:

$config=[

=>

'***'

,'secret'

=>

'*********x'

,'response_type'

=>

'array'

,//...];

= factory:

:officialaccount

($config);

$current=-

>

menu

->

current()

;

class

factory

;return

new(

$config);

}public

static

function

__callstatic

($name

,$arguments

)}

class

extends

servicecontainer

class

serviceprovider

implements

serviceproviderinte***ce

. */

public

function

register);

}}

在容器類的構造方法中,會通過registerproviders()方法,最終呼叫pimple\container容器的register方法,將定義的服務註冊到服務容器中。

可見是呼叫了服務提供者的register方法,並將容器本身傳遞給服務提供者,和上面的**片段相呼應。

public

function

register

(serviceproviderinte***ce $provider

,array

$values

=array()

)return

$this

;}

比如這段**:

->

menu

->

current()

;

/**

* magic get access.

** @param string $id

** @return mixed

*/public

function

__get

($id

)return

$this

->

offsetget

($id);

}

arrayaccess是一組php內建介面,實現該介面的類需要實現offsetexists、offsetget、offsetset、offsetunset四個方法。

當以陣列方式呼叫類時,php就會引導到以上實現的方法中,這樣就實現了以陣列的方式操作類。

例如:在servicecontainer中use了withaggregator這個trait類,其中有一段**:

/**

* aggregate.

*/protected

function

aggregate()

}/**

* @return bool

*/public

function

shoulddelegate

($id

)

servicecontainer的繼承關係:servicecontainer extends pimple\container extends \arrayaccess

所以這個trait類的this指的就是container這個類的例項,因為container類實現了arrayaccess介面,所以這個例項支援陣列方式呼叫。

symfony的元件被廣泛使用,這裡easywechat使用了其中的三個元件,分別是:

symfony/cache

快取元件,提供了多種快取方式的實現,遵循了php-fig組織制定的psr-6快取標準。

symfony/event-dispatcher

mediator模式的實現

在php中,所述請求是由一些全域性變數表示($_get, $_post,$_files,$_cookie,$_session,...)並且通過一些功能生成的響應(echo,header(),setcookie(),...)。

httpfoundation元件通過物件導向層替換了這些預設的php全域性變數和函式。

然後還使用了其他的一些元件,如下:

封裝了curl請求

monolog\logger

寫log的元件,遵循了psr-3日誌標準。

pimple/pimple

ioc服務容器

todo

todo

原始碼學習 ArrayList的擴容原始碼分析

原始碼如下 下面是arraylist的擴容機制 arraylist的擴容機制提高了效能,如果每次只擴充乙個,那麼頻繁的插入會導致頻繁的拷貝,降低效能,而arraylist的擴容機制避免了這種情況。如有必要,增加此arraylist例項的容量,以確保它至少能容納元素的數量 param mincapac...

PicoContainer原始碼學習

介紹下自己,我叫stef wu,是個菜鳥,現在在easyjf團隊學習,得到了大峽等人的熱情幫助。本序列文章是以前在學習研究picocontainer時所記錄下來的,希望借本文,能和正在學習pico新手或者研究pico的高手一起交流學習。由於我水平不好,而且是真實的從頭到尾的記錄,所以其中,特別是前面...

PicoContainer原始碼學習

介紹下自己,我叫stef wu,是個菜鳥,現在在easyjf團隊學習,得到了大峽等人的熱情幫助。本序列文章是以前在學習研究picocontainer時所記錄下來的,希望借本文,能和正在學習pico新手或者研究pico的高手一起交流學習。由於我水平不好,而且是真實的從頭到尾的記錄,所以其中,特別是前面...