iT邦幫忙

0

php 繼承父類別method的問題

小弟是物件新手,有一個繼承的問題請教各位前輩
以下程式碼,可以echo出http_host的值

$http_host="http://yahoo.com.tw";

	class x1{
		public $http_host;
		function __construct(){
			global $http_host;
			$this->http_host = $http_host;
		}
	}

	class y1 extends x1{
    
	}

	$b = new y1;
	echo $b->http_host;

但若y1 class 新增了建構子,就echo不出http_post的值,為什麼呢?

$http_host="http://yahoo.com.tw";

	class x1{
		public $http_host;
		function __construct(){
			global $http_host;
			$this->http_host = $http_host;
		}
	}

	class y1 extends x1{
		function __construct(){
		}

	}


	$b = new y1;
	echo $b->http_host;
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

3
淺水員
iT邦大師 6 級 ‧ 2019-11-22 21:08:29
最佳解答

因為已經覆寫了 __construct
也就是不會去跑原本的__construct
如果希望也跑原本的__construct
可以用呼叫parent::__construct
如下

class y1 extends x1{
	function __construct(){
		parent::__construct();
	}
}
看更多先前的回應...收起先前的回應...
小魚 iT邦大師 1 級 ‧ 2019-11-22 21:55:44 檢舉

題外話, 為什麼t都躲起來了呢?

zzhsu20 iT邦新手 5 級 ‧ 2019-11-22 22:07:05 檢舉

原來是這樣,感謝你詳細的解說,受教了..../images/emoticon/emoticon41.gif/images/emoticon/emoticon41.gif/images/emoticon/emoticon41.gif

淺水員 iT邦大師 6 級 ‧ 2019-11-22 22:23:21 檢舉

小魚 感謝,大概是編輯時加引號時不小心時刪掉了,剛剛改了。

zzhsu20 稍微補充一下,一般設計 class 時不大會用 global 去抓外部的變數,而是放在參數,以降低耦合性

zzhsu20 iT邦新手 5 級 ‧ 2019-11-23 09:17:48 檢舉

謝謝您的建議,可是有一個新手的疑惑,如果這個$http_post會在很多頁面和class中使用到,那該怎麼設比較好?還是直接在每個class中都很「厚工」的設一個$http_post='yahoo.com.tw'的屬性?

小魚 iT邦大師 1 級 ‧ 2019-11-23 12:54:05 檢舉

可以獨立一個class放常數

淺水員 iT邦大師 6 級 ‧ 2019-11-23 23:13:45 檢舉

抱歉今天比較忙。

我的作法通常是建立一個專門儲存變數的檔案(例如 env.php 或是 config.php),然後在 new 這些物件時老老實實把環境變數當作參數丟給建構函式。

如果許多不同的物件都相依於某些資訊或是某個物件,每次都去 new 相依物件再一一注入,的確是很麻煩。

因此有了像是控制反轉這些東西。這會搞一個服務容器出來,然後使用時會預先註冊會用到的物件(登記如何產生實體及相依性),真的會用到某物件則由服務容器給予實體,而不是自己去 new 出來。
(做到這一步已經有點像是是框架了...)

zzhsu20 iT邦新手 5 級 ‧ 2019-12-04 18:24:26 檢舉

抱歉,一段時間沒上線,感謝淺水員與小魚的建議,物件是條漫漫長路,有你們熱心的建議,學起來才不致茫然失措,再次感謝。

我要發表回答

立即登入回答