1 使用extends實現繼承以及過載、魔術方法的含義
class b extends a
宣告的時候b裡可以沒有a裡的方法
呼叫的時候$b=new b();
$b->a裡的方法();
$b->a裡的屬性=1;
$b->b裡的方法();
$b->b裡的方法();
如果$a=new a();
可以$a->a裡的方法();
$a->a裡的屬性=1;
不可以$a->b裡的方法();
$a->b裡的方法();
過載:b繼承a,b裡實現和a同名的方法屬性。
php中的"過載"與其它絕大多數物件導向語言不同。傳統的"過載"是用於提供多個同名的 類方法,但各方法的引數型別和個數不同。
魔術方法:php把所有以__(兩個下劃線)開頭的類方法當成魔術方法。所以你定義自己的類方法時,不要以 __為字首。
2 繼承用private和protected訪問修飾符可見性
屬性方法private不可以被繼承
屬性方法protected類外部不可見,可以被繼承
屬性方法public 所定義的類成員可以在任何地方被訪問
3php中雙冒號::的應用
php類**中常看到"::"的操作符,這個是作用域限定操作符,是用乙個雙冒號"::"表示,它用來置頂類中不同作用域的級別。左邊是作用域右邊是訪問作用域的成員。
在php中定義的作用域有self和parent兩種(在php6中提供了static作用域)。
範圍解析操作符(也可稱作 paamayim nekudotayim)或者更簡單地說是一對冒號,可以用於訪問靜態成員、方法和常量,還可以用於子類覆蓋父類中的成員和方法。
class
myclass
echo
myclass
::const_value;
class
otherclass
extends
myclass
}otherclass
::doublecolon
();
//子類覆蓋父類
class
myclass
}class
otherclass
extends
myclass
}$class
=new
otherclass
();$class
->
myfunc
();
4 php中this和self以及parent的作用
this:就是指向當前物件例項的指標,不指向任何其他物件或類。
self:表示當前類的作用域,與this不同的是它不表示類的某個特定例項,在類之外的**中不能使用self,而且它不能識別自己在繼承中層次的位置。也就是說,當在擴充套件類中使用self時,它呼叫的不是父類的方法,而是擴充套件類的過載的方法。self是指向類本身,也就是self是不指向任何已經例項化的物件,一般self使用來指向類中的靜態變數。
private static $firstcount = 0;
private $lastcount;
//建構函式
function __construct()
parent:表示當前類父類的作用域,其餘的跟self特性一樣。parent是指向父類的指標,一般我們使用parent來呼叫父類的建構函式。
//繼承類的建構函式
function __construct( $person***, $personage )
5 建構函式與析構函式
具有建構函式的類會在每次建立物件時先呼叫此方法,所以非常適合在使用物件之前做一些初始化工作。
function__construct
(){}
如果子類中定義了建構函式則不會暗中呼叫其父類的建構函式。要執行父類的建構函式,需要在子類的建構函式中呼叫parent::__construct()。
php 5 引入了析構函式的概念,這類似於其它物件導向的語言,如 c++。析構函式會在到某個物件的所有引用都被刪除或者當物件被顯式銷毀時執行。
function__destruct
(){}
6 final 關鍵字
php 5 新增了乙個 final 關鍵字。如果父類中的方法被宣告為final,則子類無法覆蓋該方法; 如果乙個類被宣告為final,則不能被繼承。
7 繼承和建構函式父類
子類結果
有建構函式
無建構函式
父構造有建構函式
有建構函式
子構造8 介面
可以通過inte***ce來定義乙個介面,就像定義乙個標準的類一樣。
注意:
1)但其中定義所有的方法都是空的;
2)介面中定義的所有方法都必須是public,這是介面的特性;
3)實現多個介面時,介面中的方法不能有重名;
4)介面也可以繼承,通過使用extends
操作符;
5)介面中也可以定義常量。介面常量和類常量的使用完全相同。 它們都是定值,不能被子類或子介面修改。
//宣告乙個'itemplate'介面
inte***ce
itemplate
//實現介面
//下面的寫法是正確的
class
template
implements
itemplate
publicfunction
gethtml
($template)'
,$value
,$template);}
return
$template;}
}9 屬性
類的變數成員叫做「屬性」,屬性宣告是由關鍵字public或者protected或者private開頭,然後跟乙個變數來組成。 屬性中的變數可以初始化,但是初始化的值必須是常數,這裡的常數是指php指令碼在編譯階段時就為常數,而不是在編譯階段之後在執行階段運算出的常數。
在php5 中,預定義了兩個函式「__get()」和「__set()」來獲
取和賦值其屬性,以及檢查屬性的「__isset()」和刪除屬性的方法「__unset()」。
簡單的說乙個是取值,乙個是賦值。,「__set()」和「__get()」這兩個方法,這兩個方法不是預設存在的,而是我們手工新增到類裡面去的,像構造方法(__construct())一樣, 類裡面新增了才會存在,可以按下面的方式來新增這兩個方法,當然也可以按個人的風格來新增://__get()方法用來獲取私有屬性
view plain
copy to clipboard
print?
<?php
classpersonelse}}
//__set()方法用來設定私有屬性
private
function__set($property_name,$value)
//__isset()方法
private
function__isset($nm)
//__unset()方法
private
function__unset($nm)
}$p1=newperson();
$p1->name="thisisapersonname";
//在使用isset()函式測定私有成員時,自動呼叫__isset()方法幫我們完成,返回結果為true
echovar_dump(isset($p1->name))."
"; echo
$p1->name."
"; //在使用unset()函式刪除私有成員時,自動呼叫__unset()方法幫我們完成,刪除name私有屬性
unset($p1->name);
//已經被刪除了,所這行不會有輸出
echo
$p1->name;
?>
<?php class personelse } } //__set()方法用來設定私有屬性 private function __set($property_name, $value) //__isset()方法 private function __isset($nm) //__unset()方法 private function __unset($nm) } $p1=new person(); $p1->name="this is a person name"; //在使用isset()函式測定私有成員時,自動呼叫__isset()方法幫我們完成,返回結果為true echo var_dump(isset($p1->name))."
"; echo $p1->name."
"; //在使用unset()函式刪除私有成員時,自動呼叫__unset()方法幫我們完成,刪除name私有屬性 unset($p1->name); //已經被刪除了, 所這行不會有輸出 echo $p1->name; ?>
10 轉殖
物件複製可以通過clone關鍵字來完成(如果物件中存在__clone()方法,會先被呼叫)。物件中的 __clone()方法不能直接呼叫。
當物件被複製後,php5會對物件的所有屬性執行乙個「淺複製」(shallow copy)。所有的屬性中的引用 仍然不變,指向原來的變數。如果定義了__clone()方法,則新建立的物件(複製生成的物件)中的__clone()方法會被呼叫, 可用於修改屬性的值(如果有必要的話)。
PHP物件導向精要
1 使用extends實現繼承以及過載 魔術方法的含義 class b extends a 宣告的時候b裡可以沒有a裡的方法 呼叫的時候 b new b b a裡的方法 b a裡的屬性 1 b b裡的方法 b b裡的方法 如果 a new a 可以 a a裡的方法 a a裡的屬性 1 不可以 a b...
php物件導向精要 3
1,final關鍵字定義的方法,不能被重寫 由於final修飾了show方法,子類中重寫show方法會報錯 class myclass class mytest extends myclass 2,final定義的class不能被繼承 final class myclass class mytest...
php物件導向精要 1
1 靜態屬性與方法 每乙個類的例項擁有自己的屬性和方法,每乙個類也可以包含靜態屬性,靜態屬性不屬於類的任何例項,可以把靜態屬性理解成儲存在類中的全域性變數,可以在任何地方通過類名引用靜態屬性。1 2class myclass 7 89 obj new myclass 10echo obj getva...