第六章、面向对象的PHP
正文
- 一、類的結構
- 限定符------public、protect、privite、final
- 結構與實例化
- 使用類的屬性----指針this
- 推薦使用的訪問方式------__get()和__set()函數
- 調用類的function
- 二、繼承、重載
- 三、接口
- 四、實例使用
- 類的繼承重載
- 五、面向對象其它高級功能
- 常量的調用-----“::”
- 靜態方法調用----“::”
- 檢查類的類型和類型提示----instanceof()
- 延遲靜態綁定
- 復制對象--------clone/__clone()
- 抽象類
- 方法的重載----- __call()
- 一個單獨的非類方法的函數------- __autoload()
- 類轉換成字符串----- __toString()
- 通過訪問已有類和對象來找到類和對象的結構和內容
- 六、迭代的實現
一、類的結構
限定符------public、protect、privite、final
public :默認選項,公有的屬性或方法可以在類的內部和外部進行訪問。
protect :該屬性或方法只能在類內部進行訪問。它也存在于任何子類。
private :該屬性或方法只能在類內部進行訪問。私有的屬性和方法將不會被子類繼承。
final :當在一個函數聲明前面使用這個關鍵字時,這個函數將不能 在任何子類中被重載。也可以在類前面使用該聲明,則該類無法被繼承
結構與實例化
構造函數 __construct($param) :當創建一個對象時,它將調用構造函 數,通常,這將執行一些初始化任務(例如,設置屬性的初始值)。 注意 構造函數的名稱不可自定義,必須為“__construct”。
在示例中,執行154,155行代碼,將顯示:
析構函數 __destruct() : 與構造函數相對的就是析構函數。析構函數允許在銷毀一個類之前執行一些操作或完成一些功能。 注意 析構函數的名稱不可自定義,必須為“__destruct()”。
使用類的屬性----指針this
當前類的一個屬性為 $attribute ,則可以使用 $this->attribute 來引用在 當前這個類 中的這個屬性。(如:161,162行的引用)。
在本例中,由于限定符為 public ,則也可以在外部訪問該成員屬性和方法(不鼓勵這種訪問方式):
推薦使用的訪問方式------__get()和__set()函數
__get() 函數返回了 $attribute 的值;
__set() 函數設置了 $attribute 的值。
工作原理
例如:設置$a->attribute; 將間接調用__get()函數,將$name參數的值設置為"attribute";
設置 $a->$attribute=5; 該語句將間接調用__set()函數,將$name參數的值設置為"attribute",而$value的值被設置為5。
好處
只有一個訪問入口(__get()和__set()),就可以實現對要保存的數據進行檢查,即當每次調用該數據時不用在外部對這個數據進行反復操作,而直接在這兩個函數中設置對$name和$value的檢查。
調用類的function
假設有一個類:
則使用其中的兩個類操作,語法可以為:$a->operation1(); 和$a->operation2(12,"test");
二、繼承、重載
繼承
語法:class B extends A{}。
B是A的子類,B中類默認包含了A類中的public和protect定義的屬性和方法,同時還可以在B類中自定義屬于B類的屬性和方法。
重載
假設有類A:
,如果需要改變$attribute的默認值,并為operation()操作提供新的功能,可以創 建類B,它重載了$attribute和operation()方法,注意,這種方法不會影響A中的屬性和方法:
三、接口
接口的使用,可以實現類的多重繼承功能。
接口的定義
接口的繼承
四、實例使用
(基于第五章的實例)
新建立一個page.inc 文件:
使用Page類,需要在腳本語言中包含page.inc來調用Display()函數,則再新建立一個home.php:
<?php require("page.inc"); //或者也可以是include("page.inc") $homepage=new Page(); $homepage->content="<p>Welcome to the home of TLA Consulting. Please take some time to get to know us.</p> <p>We specialize in serving your business needs and hope to hear from you soon.</p>"; $homepage->Display(); ?>home.php文件將實現如下功能:
1) 使用require()語句包含page.inc的內容,page.inc中包含了Page類的定義。
2) 創建了Page類的一個實例。該實例稱為$homepage。
**3)**設定內容,包括頁面顯示的文本和HTML標記(這將間接地調用__set()方法)。
4) 在對象$homepage中調用操作Display(),使頁面顯示在訪問者的瀏覽器中。
最終運行結果和第五章呈現相同,但是如果使用Page類,在創建新頁面的時候只要做少量工作。
類的繼承重載
如果希望某一個頁面和其他頁面的大部分風格相同而只有部分效果有些許差異,則只需要重載某些方法或者屬性。
新建立一個services.php:
這種做法的好處是顯而易見的,不用多次書寫同樣長的代碼函數,而只需要書寫要重載的方法即可(該子類重載了Display()操作,改變了輸出結果,即第二次調用DisplayMenu()函數,又新創建了一個菜單條)。
五、面向對象其它高級功能
常量的調用-----“::”
假設一個類中的常量:
則以下的語法可以輸出該常量(輸出3.14159):
靜態方法調用----“::”
可以通過::在 未初始化 該類的情況下調用這個方法,且 注意 不能使用this關鍵字:
檢查類的類型和類型提示----instanceof()
instanceof()-----檢查一個對象是否是特定類的實例
例如,在作為類A的子類而實現的類B例子$b中,如下語句:
{$b instanceof B}將返回true.
{$b instanceof A}將返回true.
{$b instanceof Displayable}將返回false.
以上這些語句都是假設類A、類B和接口Displayable都位于當前的作用域
延遲靜態綁定
允許在一個靜態繼承的上下文中對一個被調用類的引用。父類可以使用子類重載的靜態方法。(注:原來子類重載父類不會影響父類,而此處則是父類可以使用子類的方法了):
注意以下的function一個為public一個為static
復制對象--------clone/__clone()
clone
即:$c=clone $b;將創建與對象$b具有相同類的副本,而且具有相同的屬性值。
** __clone()**
和構造函數和析構函數,定義這個函數時候名字唯一,且使用clone時默認調用 __clone() 。
抽象類
不能被實例化,同樣類方法也沒有實現,只是提供類方法的聲明,沒有具體實現:
abstract class A {abstract function operationX($param1,$param2); }注意:包含抽象方法的任何類自身必須是抽象的
方法的重載----- __call()
class overload{//帶有兩個參數。第一個包含了被調用的方法名稱,而第二個參數包含了傳遞給該方法的參數數組。public function __call($method,$p){if($method=="display"){ if(is_object($p[0])){ $this->displayObject($p[0]); }else if(is_array($p[0])){ $this->displayArray($p[0]); }else{ $this->displayScalar($p[0]); }}} }此時如果一個對象傳遞給display()方法,可以調用displayObject()方法;如果傳遞的是一個數組,可以調 用displayArray();如果傳遞的是其他內容,可以調用displayScalar()方法。
之后要調用以上這段代碼,首先必須實例化包含這個__call()的類, 然后再調用display()方法:
一個單獨的非類方法的函數------- __autoload()
可以在任何類聲明之外聲明這個函數。,可以在任何類聲明 之外 聲明這個函數。如果實現了這個函數,它將在實例化一個還沒有被聲明的類時自動調用。
__autoload()方法的主要用途是嘗試包含或請求任何用來初始化所需類的文件。
以下代碼實現將包括一個具有與該類相同名稱的文件:
類轉換成字符串----- __toString()
當嘗試打印該類時,可以調用 ** __toString()** 函數:
class Printable{public $testone; public $testtwo; public function __toString(){//var_export()函數打印出了類中的所有屬性值。return(var_export($this,TRUE));} } $p=new Printable; echo$p;通過訪問已有類和對象來找到類和對象的結構和內容
即 Reflection(反射)API
顯示關于Page類的信息(即,之前編寫過的 page.inc 文件,執行以下代碼,則會在網頁輸出 page類 的詳細信息:
六、迭代的實現
<?php class ObjectIterator implements Iterator{ private $obj; private $count; private $currentIndex; function __construct($obj){$this->obj=$obj; $this->count=count($this->obj->data); }//將內部數據指針設置回數據開始處function rewind(){$this->currentIndex=0; }//判斷數據指針的當前位置是否還存在更多數據function valid(){return $this->currentIndex<$this->count; }//返回數據指針的值。function key(){return $this->currentIndex; }//返回保存在當前數據指針的值。function current(){return $this->obj->data[$this->currentIndex]; }//在數據中移動數據指針的位置。function next(){$this->currentIndex++; } }class Object implements IteratorAggregate{public $data=array(); function __construct($in){$this->data=$in; }function getIterator(){return new ObjectIterator($this); } }$myObject=new Object(array(2,4,6,8,10)); $myIterator=$myObject->getIterator(); for($myIterator->rewind();$myIterator->valid();$myIterator->next()){$key=$myIterator->key(); $value=$myIterator->current(); echo $key."=>".$value."<br/>"; } ?>總結
以上是生活随笔為你收集整理的第六章、面向对象的PHP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: el-date-picker由中国时间转
- 下一篇: 动态规划算法php,php算法学习之动态