台灣最大程式設計社群網站
線上人數
1179
 
會員總數:242749
討論主題:187707
歡迎您免費加入會員
討論區列表 >> PHP >> PHP Exception的getMessage()不懂之處
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
PHP Exception的getMessage()不懂之處
價值 : 10 QP  點閱數:161 回應數:7

樓主

pon
門外漢
0 1
22 1
發送站內信

各位版上前輩好,我是自己借書來學習PHP,因照著書中範例來實作,目前是看到PHP除錯的這個章節,
在下方程式碼中,若是在 MyException 類別建構子中,若是沒有把$mes參數的值傳到父類別建構子中(下方斜線註解處),
則在 printMessage()的方法中的第一列 $this -> getMessage() 印出來是空白的,必須要傳回父類別建構子才會印出自訂的訊息,
繼承不是會擁有父類別的成員變數和方法,為什麼還需要傳回到父類別中才可顯示呢?
而 printMessage()中的第二和第三列卻可以直接印出呢?

若是排版不好造成閱讀不易真的非常抱歉。
小弟觀念上不通或是有誤之處,還請不吝指導,非常感謝。





搜尋相關Tags的文章: [ php ] , [ Exception ] , [ try ] , [ catch ] ,
本篇文章發表於2018-06-24 22:39
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

小羊窒息
捐贈 VP 給 小羊窒息 檢舉此回應
繼承之後, 自己另外寫 public function __construct ,
是 override(覆寫) 的行為,


你既然選擇要覆寫 __construct ,
自然就需要另外加上parent::__construct
(原因請自行找書籍研究)


不然就是把你5~9行的程式碼拿掉...
本篇文章回覆於2018-06-25 02:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

pon
檢舉此回應
小羊窒息您好,我有試著找您所說的關於 選擇要覆寫 __construct,就需要另外加上parent::__construct,
但書上沒找到相關的資訊,也或許可能是我不知道哪個才是原因,從網路上看到的是說PHP 的子類別繼承父類別後,父類別的建解構子都不會被執行,
不知是否是這原因?
若是這原因則為什麼一定要指向父類別建構子還是不太懂
能否請您不吝指導,感謝您。
本篇文章回覆於2018-07-11 10:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

小羊窒息
捐贈 VP 給 小羊窒息 檢舉此回應
建構子construct 是你宣告物件時要一併對某些事物做初始化時所加的...
例如:要求程式設計師在建立物件時一併傳入指定的變數...

===========================
舉例說明:


上面是在你自行產生Exception時, 把【密碼不可以是空白】這一串訊息, 丟進Exception物件內,
如果你選擇不傳入任何訊息, 也就是把throw new Exception("密碼至少要六位"); 改成throw new Exception();
則其他程式設計師(或你自己)在 checkPW時, 就只會知道有錯誤, 而不會知道訊息為何(因為throw new Exception();時沒有加上錯誤訊息)


也就是說,想在getMessage()取得錯誤訊息的話,throw new Exception一定得加上訊息文字
(這就是 Exception 的 __construct 在做的事情,.........將你的訊息文字儲存起來,以便在 getMessage() 時輸出)

本篇文章回覆於2018-07-11 15:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

小羊窒息
捐贈 VP 給 小羊窒息 檢舉此回應
當你繼承了父類別時,如果沒有自己撰寫 __construct,而父類別本身有__construct時,
就是直接繼承其__construct





當你繼承後,自己又寫了 __construct (覆寫父類別的__construct) ,
那你就得自行去撰寫配套程式碼(也就是所謂的 父類別的建解構子都不會被執行,你得自己去執行它)


本篇文章回覆於2018-07-11 15:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

小羊窒息
捐贈 VP 給 小羊窒息 檢舉此回應
針對你一開始的問題:

Exception這個類別提供了:
$message (自訂訊息:由程式設計師提供)
$code (自訂的錯誤代碼:由程式設計師提供,通常是系統分析文件會有所謂的錯誤代碼對照表,讓程式設計師照著寫...)

$file (錯誤的程式碼檔名:由系統產生)
$line (錯誤的程式碼行數:由系統產生)

當你throw new MyException 時,$file與$line是系統自動產生(用來除錯用的)
而$message與$code是你自己得寫的...

所以才會出現:【為什麼printMessage()中的第二和第三列卻可以直接印出呢】,因為那是系統自動產生的
而【printMessage()的方法中的第一列】,你沒有給他,自然就是空白...(因為message與code都是要讓程式設計師自己決定其內容的)

本篇文章回覆於2018-07-11 15:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

clouding
捐贈 VP 給 clouding 檢舉此回應
我覺得你應該先去了解類別繼承之間的關係

把這個想的簡單一點,假如類別是這樣



因為你 new Son 而且 Son 類別有寫建構子,他就會用那個建構子去執行,否則就會直接執行 Father 的建構子

可是這邊 Father 類別有待入 message 的動作,可是你沒有做

所以你在 getMessage() 拿到的東西才會是空的

getCode() getFile() 取得的東西跟建構子無關,所以才可以拿到東西
本篇文章回覆於2018-07-11 16:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

clouding
捐贈 VP 給 clouding 檢舉此回應
#19 #24 應該是 return 不是 echo

打錯了...
本篇文章回覆於2018-07-11 17:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.