一:結構和調用(實例化):
class className{} ,調用:$obj = new className();當類有構造函數時,還應傳入參數。如$obj = new className($v,$v2...);
二:構造函數和析構函數:
1、構造函數用於初始化:使用__construct(),可帶參數。
2、但析構函數不能帶參數(用於在銷去一個類之前執行一些操作或功能)。析構函數用__destruct()做名稱。在腳本執行結束時,PHP會銷掉內存中的對象,因此可不用析造函數,但有些比如COOKIE等,就應當要用此函數銷掉。
知識點:在PHP4中也提供了構造函數,但使用的是與類同名的類方法,在PHP5仍能兼容這種做法,當一個類中沒有包含__construct時,會查找與類同名的方法,如果找到,就認為是構造函數,如下:
class test
{ var $b;
function test() { $this->b=5; }
function addab($c) { return $this->b+$c; }
}
$a = new test(); echo $a->addab(4); // 返回 9
3、PHP不會自動調用父類的構造函數(不支持構造函數重載),必須使用parent關鍵字顯式地調用。
class employee{
function __construct()....
}
class Manager extents Employee{
function __construct(){
parent::_construct();
echo 這個子類的父類構造函數調用了!;
}
}
當然也可以調用與該實例沒有任何關系的其它類的構造函數。只需在__construct()前加上類名即可。如:
otherClassName::__construct();
類的主家庭成員:屬性、方法、常量、靜態成員
三、類的屬性:
有兩種方法對類的屬性賦值或取值。
1、使用公共作用域public關鍵詞。
2、使用__set()和__get()來分別賦值和取值,前者稱為設置方法(setter)或修改方法(mutator),後者稱為訪問方法(accessor)或獲取方法(getter)。建議使用這種方法:優點:
A、可在__set()統一進行數據驗證。
B、便於統一管理屬性。
注意:
第一:__set()和__get()只對私有屬性起作用,對於用public定義的屬性,它們兩個都懶理搭理,如下:
class test{
protected $a=9,$b=2,$c;
public $d;
function __set($n,$v) { $this->$n = $v+2; }
function __get($name) { return $this->$name+2; }
}
$a = new test();
$a->b =5; echo "<br />"; echo $a->b;
實例只對$a,$b,$c的設置會經過__set和__get過濾與返回,對於$d,就不會起作用。如$a->d=5,再返回還是5。
第二:__set($n,$v)要帶兩個參數。而__get($n)只能有一個參數。實例:
class test{
private $a=5,$b=6,$c;
function __set($n,$v)
{
if($n==a&&$n>0)
$this->$n = $v;
else
$this->$n = $v+2;
}
function __get($name)
{
return $this->$name; //如果改為return $this->$name + $this->addab(); 如調用a的值,實際返回的是a+a+b的值。默認為5+5+6=16。
}
function addab()
{ return $this->a + $this->b; }
}
$e=new test();
$e->a = 11; //注意寫法:類的內部用$this->$n即變量的寫法,但外部實例要用$e->a的方式。
$e->b = 12; //get 14
$e->k = 22;
類的屬性可自由擴展,如上例的k,不管是否用__set,當一個實例建立起來後,可以用$e->newProperty = xx;直接來創造一個屬性,但不建議這麼做。