PHP 類別的繼承及建解構子的幾個注意點
1. php 的建構子會在類別實體化後執行,寫法有兩種,一個是用 __construct() 保留字,另一個是用和類別同名的函式
class BASE{
function __construct(){
print "BASE constructor";
}
}
或是
class BASE{
function BASE(){
print "constructor function same name with class";
}
}
若同時有兩個建構子,則以 __construct() 為優先,同類別名的函數將不會被執行。
我個人建議使用 __construct(),因為類別可能因為改名或複製,常會忘記把建構子也改名。
class BASE{
function BASE(){
print "constructor function same name with class";
}
function __construct(){
print "BASE constructed";
}
}
執行結果:
BASE constructor
2. php 的解構子會在1程式執行到結尾 2程式exit 3物件被unset 後被執行,寫法用 __desctruct() 保留字
class BASE{
function __construct(){
print "BASE constructedn";
}
function __destruct(){
print "BASE destructedn";
}
}
執行:
$obj =new BASE();
unset($obj); <== 物件被 unset
print "ENDn";
exit;
結果
BASE constructed
BASE destructed
END
3. 建構和解構函數只不過是一個函數,預設是 public,都可以被叫用。
4. 子類別繼承父類別後,父類別的建解構子都不會被執行
曾經我在這被卡了很久,因為別的語言(java, c#)會去叫用父類別的建解樣子後再處理子類別的。
class BASE{
function BASE(){
print "constructor function same name with class";
}
function __destruct(){
print "BASE destructed";
}
}
class CHILD extends BASE{
function __construct(){
print "CHILD constructed";
}
function __destruct(){
print "CHILD destructed";
}
}
執行
$obj =new CHILD();
exit;
結果
CHILD constructed
CHILD destructed
5. 子類別要執行父類別的建解構子,就要特別叫用,使用 parent:: 保留字
class BASE{
function BASE(){
print "constructor function same name with class";
}
function __destruct(){
print "BASE destructed";
}
}
class CHILD extends BASE{
function __construct(){
parent::__construct();
print "CHILD constructed";
}
function __destruct(){
parent::__destruct();
print "CHILD destructed";
}
}
執行
$obj =new CHILD();
exit;
結果
constructor function same name with class
CHILD constructed
BASE destructed
CHILD destructed
資料來源 : http://note.tc.edu.tw/684.html
沒有留言:
張貼留言