jwt datetimeimmutable 報錯:
jwt datetimeimmutable 問題 降低版本到3.3.3解決問題: composer require lcobucci/jwt:3.3.3
hyperf使用註解的坑,hyperf使用註解會讓註解的例項變為單例,
問題1:model產生問題 ***
如果我們註解乙個model給變數,當有兩個地方會查詢資料,第乙個查詢會是a+b連線查詢,第二個是a+b+c連線查詢,如果第二個查詢有乙個引數時c的,執行二后在執行第乙個會導致報錯,報c中的引數不存在,單位這個例項是單例的,第二個查詢的引數不會被清除,
問題二:例項化時如果帶引數 ***
如果例項化帶引數,第乙個例項化帶了乙個引數,第二個操作時不會重新例項化,這樣會導致第二次使用還是第一次的引數,導致出錯
問題三:公共屬性
在控制器中乙個屬性被改變,後面再有請求來獲取屬性時獲取到是最新的,不是初始化的,
inject或value註解不生效
使用了建構函式中注入inject
和value
的功能,以下兩種場景,可能會導致注入失效,請注意使用。
原類沒有使用inject
或value
,但父類使用了inject
或value
,且原類寫了建構函式,同時又沒有呼叫父類建構函式的情況。
這樣就會導致原類不會生成**類,而例項化的時候又呼叫了自身的建構函式,故沒辦法執行到父類的建構函式。
所以父類**類中的方法__handlepropertyhandler
就不會執行,那麼inject
或value
註解就不會生效。
原類沒有使用class parentclass
class origin extends parentclass
}
inject
或value
,但trait
中使用了inject
或value
。
這樣就會導致原類不會生成**類,故沒辦法執行建構函式裡的__handlepropertyhandler
,所以trait
的inject
或value
註解就不會生效。
trait origintrait
class origin
基於上述兩種情況,可見原類
是否生成**類至關重要,所以,如果使用了帶有inject
或value
的trait
和父類
時,給原類新增乙個inject
,即可解決上述兩種情況。
一般建議使用make,而不是new,use hyperf\contract\stdoutloggerinte***ce;
trait origintrait
class parentclass
class origin extends parentclass
使用 make() 方法是為了允許 aop 的介入,而直接 new 會導致 aop 無法正常介入流程 2.0以後不會有這個問題,這個可以參考
注意事項
換種方式理解就是容器內管理的物件都是單例,這樣的設計對於長生命週期的應用來說會更加的高效,減少了大量無意義的物件建立和銷毀,這樣的設計也就意味著所有需要交由 di 容器管理的物件均不能包含狀態
值。
狀態
可直接理解為會隨著請求而變化的值,事實上在 協程 程式設計中,這些狀態值也是應該存放於協程上下文
中的,即hyperf\utils\context
。
有些時候我們可能希望去實現一些更動態的需求時,會希望可以直接獲取到容器(container)
物件,在絕大部分情況下,框架的入口類(比如命令類、控制器、rpc 服務提供者等)都是由容器(container)
建立並維護的,也就意味著您所寫的絕大部分業務**都是在容器(container)
的管理作用之下的,也就意味著在絕大部分情況下您都可以通過在建構函式(constructor)
宣告或通過@inject
註解注入psr\container\containerinte***ce
介面類都能夠獲得hyperf\di\container
容器物件,我們通過**來演示一下:
;中介軟體的執行順序
執行順序為:全域性中介軟體 -> 類級別中介軟體 -> 方法級別中介軟體
。
全域性更改請求和響應物件
首先,在協程上下文內是有儲存最原始的 psr-7請求物件
和響應物件
的,且根據 psr-7 對相關物件所要求的不可變性(immutable)
,也就意味著我們在呼叫$response = $response->with***()
所呼叫得到的$response
,並非為改寫原物件,而是乙個clone
出來的新物件,也就意味著我們儲存在協程上下文內的請求物件
和響應物件
是不會改變的,那麼當我們在中介軟體內的某些邏輯改變了請求物件
或響應物件
,而且我們希望對後續的 非傳遞性的 **再獲取改變後的請求物件
或響應物件
,那麼我們便可以在改變物件後,將新的物件設定到上下文中,如**所示:
;// $request 和 $response 為修改後的物件
$request
= \hyperf\utils\context::
set(serverrequestinte***ce:
:class
,$request);
$response
= \hyperf\utils\context::
set(responseinte***ce:
:class
,$response
);
使用strncpy需要注意的地方
功能 c c 複製src中的內容 字元,數字 漢字.到dest,複製多少由num的值決定,返回指向dest的指標。如果遇到null字元 0 且還沒有到num個字元時,就用 num n n是遇到null字元前已經有的非null字元個數 個null字元附加到destination。注意 並不是新增到de...
使用巨集需要注意的地方
ddk提供了大量的巨集。在使用這些巨集的時候,要注意一種錯誤的發生,這就是 側效 side effect 巨集一般由多行組成,如下面的形式,其中的 代表換行 define print msg kdprint n kdprint msg kdprint n 在c語言中規定,for或者if語句塊中的內容...
使用setById時需要注意的地方
在使用listview的時候,通常要對某個item中的乙個控制項進行操作,那麼我們就需要取得這個控制項的引用 這個時候可以使用view.setid int id 來設定乙個id值,然後再通過view.getviewbyid int id 精確得取得該控制項 舉個例子 override public ...