![]() ![]() ![]() ![]() |
|||||
|
|||||
樓主 pon ![]()
![]() |
在下方程式碼中,若是在 MyException 類別建構子中,若是沒有把$mes參數的值傳到父類別建構子中(下方斜線註解處), 則在 printMessage()的方法中的第一列 $this -> getMessage() 印出來是空白的,必須要傳回父類別建構子才會印出自訂的訊息, 繼承不是會擁有父類別的成員變數和方法,為什麼還需要傳回到父類別中才可顯示呢? 而 printMessage()中的第二和第三列卻可以直接印出呢? 若是排版不好造成閱讀不易真的非常抱歉。 小弟觀念上不通或是有誤之處,還請不吝指導,非常感謝。 |
別忘捐VP感謝幫助你的人 | 新手會員瞧一瞧 |
1樓 |
繼承之後, 自己另外寫 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樓 |
建構子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樓 |
當你繼承了父類別時,如果沒有自己撰寫 __construct,而父類別本身有__construct時,
就是直接繼承其__construct 當你繼承後,自己又寫了 __construct (覆寫父類別的__construct) , 那你就得自行去撰寫配套程式碼(也就是所謂的 父類別的建解構子都不會被執行,你得自己去執行它)
本篇文章回覆於2018-07-11 15:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
5樓
最有價值解答
小羊窒息 ![]() ![]() |
針對你一開始的問題:
Exception這個類別提供了: $message (自訂訊息:由程式設計師提供) $code (自訂的錯誤代碼:由程式設計師提供,通常是系統分析文件會有所謂的錯誤代碼對照表,讓程式設計師照著寫...) $file (錯誤的程式碼檔名:由系統產生) $line (錯誤的程式碼行數:由系統產生) 當你throw new MyException 時,$file與$line是系統自動產生(用來除錯用的) 而$message與$code是你自己得寫的... 所以才會出現:【為什麼printMessage()中的第二和第三列卻可以直接印出呢】,因為那是系統自動產生的 而【printMessage()的方法中的第一列】,你沒有給他,自然就是空白...(因為message與code都是要讓程式設計師自己決定其內容的)
本篇文章回覆於2018-07-11 15:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
6樓 |
我覺得你應該先去了解類別繼承之間的關係
把這個想的簡單一點,假如類別是這樣 因為你 new Son 而且 Son 類別有寫建構子,他就會用那個建構子去執行,否則就會直接執行 Father 的建構子 可是這邊 Father 類別有待入 message 的動作,可是你沒有做 所以你在 getMessage() 拿到的東西才會是空的 getCode() getFile() 取得的東西跟建構子無關,所以才可以拿到東西
本篇文章回覆於2018-07-11 16:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
7樓 |
#19 #24 應該是 return 不是 echo
打錯了...
本篇文章回覆於2018-07-11 17:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
8樓
作者回應
pon ![]() |
非常謝謝 小羊窒息 和 clouding 前輩的不吝指導與講解,讓小弟對於這問題的觀念上
有比較深入的了解,再次感謝兩位。 但尚有一個問題想請教的是,子類別沒自己寫建構子,就會繼承(引用)父類別的建構子 在 new 的後面 通常就是呼叫建構子, 如 $son = new Son(); 程式設計師沒寫子類別建構子時就會用父類別的建構子,是因為在new的時候系統會自動產生一個子類別(建立的該類別)的無參數建構子,然後此系統建立的無參數建構子裡面會自動呼叫父類別的建構子嗎? 還是這樣的理解是錯誤的呢? 還請前輩們指導,萬分感謝。
本篇文章回覆於2018-07-17 12:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
9樓 |
繼承是繼承
覆寫是繼承後覆蓋掉 ====== 子類別繼承父類別的一切之後, 只要你沒有覆寫行為, 在 new 的時候, 就是直接呼叫繼承下來的 ("自動建立無參數的建構子, 然後自動呼叫父類別的建構子" 這種事不存在)
本篇文章回覆於2018-07-18 15:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔-- |
回覆 |
如要回應,請先登入. |