1. 程式人生 > >php中class類中的詳細用法

php中class類中的詳細用法

一,php中類的建構函式和解構函式

1,建構函式用於初始化,用—construct()可以帶引數

2,解構函式不能帶引數,(用於在消去一個類之前執行一些操作或者功能),使用—destruct()

3,php不會自動呼叫父類的建構函式,(不支援建構函式過載),必須使用parent關鍵字顯示的呼叫

class employee{
function __construct()….
}
class Manager extents Employee{
function __construct(){
parent::_construct();
echo ‘這個子類的父類建構函式呼叫了!';
}
}

呼叫與該例項沒有任何關係的其他類的建構函式,只需要在—construct()前面加上類名就可以。

ortherclassname::__construct();

類的主要家庭成員:屬性,方法,常量,靜態成員

二,類的屬性

對類的屬性有兩種方式直接賦值或者取值

1,使用公共工作域或public關鍵字

2,使用__set()__get()分別賦值和取值

注意:__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。

三,類的方法:

1,內部呼叫方式:$this->fanname();或者test::addab();

2,例項化呼叫$e->addb();也可以用test::addab();

四,類的常量

類中的常量定義const

class test{
private $a;
const PI = '3.14′;
…..

類中呼叫上面的常量方法如:"$this::PI",或者“類名::PI”

例項化中,只能通過 類名::PI才可以呼叫常量。

$e= new test();
$e->PI =5; //注意,這裡用 ->只是創造了一個也是名為PI的屬性,而不是改變類中的PI常量的值。
echo $e::PI; //這個才是呼叫類的常量。


注意:常量只能用::來呼叫,不能改變其值。

五,類的靜態成員(靜態屬性或者靜態方法)

什麼時候使用靜態成員呢,需要建立所有類是例項共享的欄位或者方法的時候,需要靜態成員。

靜態成員的特徵如下:

1,靜態成員,他讓指令碼上的所有該類的例項呼叫,但是不能借助類的特定例項呼叫,而是在類的外部,統一使用”類名::$成員“的方式呼叫

類的內部則統一用”self::$成員“來呼叫。

2,當新建立一次例項時,靜態成員會從上次建立的例項最後值開始重新計算,而不是類中初始值開始計算。

3,對於public定義的靜態成員,可以在外部更改他的值,private則不可以改變其值。

class test{
public static $v = 0;
function __construct(){ self::$v++; }
static function getV(){ return self::$v; }
}
$a = new test();
echo test::getV(); // 返回 1
$b = new test();
echo test::getV(); // 返回 2
test::$v=8; //由於public定義的成員,改變靜態成員的值。
$c = new test();
echo test::getV(); // 返回 9

六,關鍵字

1,this關鍵字:用於類的內部指代類的本身。來訪問屬性或方法或常量,如$this->屬性名或方法名。$this::常量名。this還可以用在該類的子類中,來指代本身的屬性或方法。

2,雙冒號”::“用於呼叫常量和靜態成員

3,self關鍵字,在類的內部與雙冒號配合呼叫靜態成員,例如self::$staticvar,內部不能用$this呼叫靜態成員。

4,__clone()克隆物件

5,__call()方法過載

方法過載例項;

class cB{
function __call($method,$n){
if($method=='showVarType'){
if(is_numeric($n[0])){ //不能用$n。要用$n[0];
$this->displayNum();
}else if (is_array($n[0])){
$this->displayArr();
}else{
$this->displayOther();
}
}
}
function displayNum() {
echo ‘<h3>這是數字!</h3>';
}
function displayArr() {
echo ‘<h3>這是陣列!</h3>';
}
function displayOther() {
echo ‘<h3>不是陣列也不是數字!</h3>';
}
}

$x='a';
$y=array(‘a','b');
$b=new cB;
$b->showVarType($x); //不是陣列也不是數字
$b->showVarType($y); //這是陣列

注意:注意,不能在類中定義showVarType()方法,否則程式碼不能用。

6,繼承entend

記憶方法:常量用::訪問,常量例項方法不可以改變值,靜態屬性,外部可以改變值,切按照最後一次改變的值為起始值。但限於public的靜態。

七:方法和屬性的作用域

public 可以省略,private不能由子類使用,protected可以由子類使用,abstract抽象類,final(阻止在子類中覆蓋,也稱為過載,阻止被繼承,用於修飾類名以及方法,例如:final class test{final function fun(){}},但是不能用於屬性),static靜態類。

八:抽象類和抽象方法:abstract

抽象可以理解成父類為子類定義一個模板或者基類,作用域abstrct只能在父類中宣告,但是在子類中實現。

1,抽象類不能被例項化,只能被子類繼承後實現。

2,抽象類必須在其子類中實現該抽象類的所有抽象方法,否則會出錯。

3,在抽象方法中,只是宣告,但不能具體實現:

只能宣告這個方法:abstract function gettow();(連方括號{}都不要出現)

抽象方法和抽象類主要用於複雜的類層次關係中。該層次關係需要確保每一個子類都包含並重載了某些特定的方法。這也可以通過介面實現

4,屬性不能被命名為抽象屬性

5,只有宣告抽象的類才可以宣告抽象方法,但是如果宣告為抽象,就不能具體實現。