在用php7進行開發的時候,遇到了:
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; index has a deprecated constructor
這個提示本來很正常,看起來也很容易理解,而且很多介紹php7的文章中都有提到過,那就是php7中與類別同名的函數作為建構函數的時候會拋出這個提示,推薦使用contruct作為建構函數,像ecshop之類的程式碼就有很多用與類別同名的函數作建構函數的情況。
但我發現thinkphp的控制器中仍然有index控制器中存在index方法的情況,使用的時候並沒有發現會拋出這個提示來。
於是去翻程式碼,但資料,測試,發現有這麼多情況:
1.一個類別中如果同時存在construct(非父類別的)和與類別名稱同名函數,則construct是建構函數,而同名函數則當作普通函數;
2.如果一個子類別的父類別中有construct(即使是public)但子類別中沒有,而子類別中有同名函數,而同名函數是建構函數。如果你用get_class_methods($this);取得類別的方法會發現其實是有construct方法的;
3.php官方手冊中有這麼一句話:
自PHP 5.3.3起,在命名空間中,與類別名稱同名的方法不再作為建構子。這個改變不影響不在命名空間中的類別
測試一些猜想的時候一般不會去使用命名空間,看thinkphp的源碼也沒有哪裡有作什麼特殊處理,一直停留在前兩種情況,很是不解。
還好在php官方手冊中找到了第三種情況,也終於理解了為什麼在thinkphp中沒有那個提示,因為thinkphp使用了命名空間。
以上是php7中的建構函數詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!