小弟是物件新手,有一個繼承的問題請教各位前輩
以下程式碼,可以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;
因為已經覆寫了 __construct
也就是不會去跑原本的__construct
如果希望也跑原本的__construct
可以用呼叫parent::__construct
如下
class y1 extends x1{
function __construct(){
parent::__construct();
}
}
題外話, 為什麼t都躲起來了呢?
原來是這樣,感謝你詳細的解說,受教了....
謝謝您的建議,可是有一個新手的疑惑,如果這個$http_post會在很多頁面和class中使用到,那該怎麼設比較好?還是直接在每個class中都很「厚工」的設一個$http_post='yahoo.com.tw'的屬性?
可以獨立一個class放常數
抱歉今天比較忙。
我的作法通常是建立一個專門儲存變數的檔案(例如 env.php 或是 config.php),然後在 new 這些物件時老老實實把環境變數當作參數丟給建構函式。
如果許多不同的物件都相依於某些資訊或是某個物件,每次都去 new 相依物件再一一注入,的確是很麻煩。
因此有了像是控制反轉這些東西。這會搞一個服務容器出來,然後使用時會預先註冊會用到的物件(登記如何產生實體及相依性),真的會用到某物件則由服務容器給予實體,而不是自己去 new 出來。
(做到這一步已經有點像是是框架了...)
抱歉,一段時間沒上線,感謝淺水員與小魚的建議,物件是條漫漫長路,有你們熱心的建議,學起來才不致茫然失措,再次感謝。