目錄Table Of Contents
- 類
- 對象
- 屬性
- 聲明屬性
- 調用屬性
- 屬性範圍
- 屬性重載
- 方法
- abstract範圍
- 常量
- 建構函式與解構函式
- 建構函式
- 調用父類建構函式
- 調用無關的建構函式
- 解構函式
- 靜態類成員
類
類表示要在應用程式中處理的實際事物。例如要建立一個管理圖書的應用程式,類就是用來表示書,員工,顧客等,每個實體都包含一組性質和行為,在oop中分別稱為屬性property和方法method
< ?phpclass Employee{ private $name; //屬性 private $title; protected $wage; protected function clockIn() { //方法 echo "Member $this->$name clocked in at ".date("h:i:s"); } protected function clockOut() { echo "Member $this->$name clocked out at ".date("h:i:s"); }}?>
對象
類提供了一個基礎,可以在此基礎上建立實體的特定執行個體,稱為對象object,例如一個employee類可以建立員工a和b
< ?php$employee = new Employee();?>
屬性
聲明屬性
< ?phpclass Employee{ private $name; //聲明屬性的有private,public,protected private $title; protected $wage;}?>
調用屬性
調用屬性使用->操作符
< ?phpclass aa{ public $name = 'a'; function test() { $this->name = $name; //this表示引用當前類 }}?>
屬性範圍
屬性範圍有五種,public,private,protected,final,static
* public是預設的,聲明公用範圍中的屬性,公用屬性可以由相應的對象直接存取和操作,但在oop不鼓勵使用公用屬性,避免被其他人訪問和修改屬性。
* private只能在定義屬性中的類中被訪問,並且不能由其子類使用,因為oop主要原則:封裝,私人屬性必須通過公用介面或者方法來訪問
< ?phpclass aa{ private $name; public function setName($name) { //通過了公用方法來設定私人屬性 $this->name = $name; }}$b = new aa;$b->setName("Mary");?>
將屬性的操作封裝在一個方法中,可以讓開發人員可以嚴密地控制如何設定屬性。
- protected只能在定義屬性中的類中被訪問,並且可以由其子類使用
- final可以阻止子類覆蓋這個屬性,主要涉及到繼承的時候的屬性覆蓋。
- static就是static,靜態域,靜態變數,靜態屬性。
屬性重載
屬性重載是通過重載__set和__get方法來實現訪問和修改屬性的時候自動觸發修改。
__set
< ?phpclass Employee{ var $name; function __set($propName,$propValue){//__set方法有參數屬性名稱和值,所以這裡有2個變數 echo $propName."\n"; }}$employee = new Employee();$employee->name = "Mario"; //當觸發修改屬性的時候,就會觸發__set方法,因為這裡屬性只有name而沒有title,所以$employee->title = "hello";?>-----title //__set執行成功的話會返回true,失敗就返回false,並且會執行函數內的代碼,所以這裡因為沒有title屬性,所以失敗了,並且輸出了失敗的title屬性。
__get
類似__set
因為__set__get的關係,只能處理簡單的屬性,對於複雜的oop應用程式來說還是不足夠的,所以需要實現自己的方法,考慮為每個私人屬性建立兩個方法:
< ?php class Employee{ private $name; public function getName(){ return $this->name; } public function setName($name){ $this->name = $name; } }?>
方法
方法與函數非常相似,只不過方法用來定義類的行為。
php支援6種方法範圍:public,protected,private,abstract,final,static
public,protected,private,final,static跟變數的範圍很相似
abstract範圍
抽象方法,只在父類聲明,但在子類實現,如果想定義一個應用編程介面API,以後將它作為實現的一個模型,就可以聲明一個抽象方法
< ?phpabstract class Employee{ abstract function hire(); abstract function fire();}?>
常量
常量constant,用來表示不會改變的值,在對象的整個生命週期中都保持不變。
< ?phpclass mathFunctions{ const PI = '3.1415926';}echo mathFuctions::PI; ?>
建構函式與解構函式
建構函式
建構函式是在執行個體初始化的時候自動執行的函數,可以接受參數,可以調用類和方法,可以調用其他建構函式。
< ?php class Book{ private $title; private $isbn; private $copies; function __construct($isbn) { //這個就是建構函式 $this->setIsbn($isbn); //這裡自動讀取參數,設定書編碼 $this->getTitle(); //自動擷取書title $this->getNumberCopies(); //自動擷取有多少本相同的書 } public function setIsbn($isbn) { $this->isbn = $isbn; //將參數賦值到類的屬性isbn } public function getTitle() { $this->title = "hello,im a title!"; print ("Title: {$this->title}"."\n"); } public function getNumberCopies() { $this->copies = "5"; print ("Number copies available: {$this->copies}"."\n"); } } $book = new Book("061452424");?>----Title: hello,im a title! //直接執行個體就能夠有輸出,自動的。Number copies available: 5
每當執行個體化新對象時都會調用的方法,最好都通過建構函式完成,此外要確保這些方法只能在建構函式中被調用,需要設定private
調用父類建構函式
需要使用parent顯式調用
< ?php class Employee{ protected $name; protected $title; function __construct() { echo "Employee constructor called!"."\n"; } } class Manager extends Employee{ function __construct() { parent::__construct(); //執行個體Manager對象就能夠執行了Employee對象的建構函式 echo "Manager constructor call!"."\n"; } } $employee = new Manager();?>----Employee constructor called!Manager constructor call!
調用無關的建構函式
例如:classname::__constructor();
解構函式
析構就是構造的反義,撤銷對象的在記憶體的資料
< ?php class Employee{ protected $name; protected $title; function __construct() { echo "Employee constructor called!"."\n"; } function __destruct() { echo "Its destroyed!"."\n"; } } $employee = new Employee();?>----Employee constructor called!Its destroyed! //指令碼執行結束就會撤銷記憶體中的對象。
靜態類成員
當需要建立供所有類執行個體共用的屬性和方法的時候,這些屬性和方法與所有類執行個體有關,但不能由任何特定對象調用,例如編寫一個類來跟蹤網頁訪問者的數量,正常來的說,每次執行個體化類的時候都會將計數清零,所以需要設定static,靜態類。
< ?phpclass Visitor{ private static $visitor = 0; //設定了靜態屬性 function __construct() { self::$visitor++; //靜態屬性和方法需要使用self來引用 } static function getVistors() { //設定了靜態方法,其實這裡不用static也可以,靜態方法是可以不用執行個體化而直接調用的,這裡因為建構函式執行個體化了,所以用不用static function都可以 return self::$visitor; }}$visits = new Visitor();echo $visits::getVistors()."\n"; //靜態方法需要使用::來調用$visits2 = new Visitor();echo $visits2::getVistors()."\n";?>----1 //計數沒有終止,而是繼續累計。2
本文由 PeterYuan 創作,採用 署名-非商業性使用 2.5 中國大陸 進行許可。 轉載、引用前需聯絡作者,並署名作者且註明文章出處。神一樣的少年 » 第二章(物件導向oop)《php和mysql web開發》《php與mysql程式設計》齊讀