本文章介紹了在php中的物件導向中的自動載入類 對象序列化 多態的應用的應用執行個體,有需要瞭解的同學可以看看。
自動載入類
很多開發人員寫物件導向的應用程式時,對每個類的定義建立一個 PHP 源檔案。一個很大的煩惱是不得不在每個指令碼(每個類一個檔案)開頭寫一個長長的包含檔案的列表。
在軟體開發的系統中,不可能把所有的類都寫在一個PHP檔案中,當在一個PHP檔案中需要調用另一個檔案中聲明的類時,就需要通過include把這個檔案引入。不過有的時候,在檔案眾多的項目中,要一一將所需類的檔案都include進來,是一個很讓人頭疼的事,所以我們能不能在用到什麼類的時候,再把這個類所在的php檔案匯入呢?這就是我們這裡我們要講的自動載入類。
在 PHP 5 中,可以定義一個 __autoload()函數,它會在試圖使用尚未被定義的類時自動調用,通過調用此函數,指令碼引擎在 PHP 出錯失敗前有了最後一個機會載入所需的類, __autoload()函數接收的一個參數,就是你想載入的類的類名,所以你做項目時,在組織定義類的檔案名稱時,需要按照一定的規則,最好以類名為中心,也可以加上統一的首碼或尾碼形成檔案名稱,比如xxx_classname.php、classname_xxx.php以及就是classname.php等等.
本例嘗試分別從 MyClass1.php 和 MyClass2.php 檔案中載入 MyClass1 和 MyClass2 類
| 代碼如下 |
複製代碼 |
function __autoload($classname) { require_once $classname . '.php'; } //MyClass1類不存在自動調用__autoload()函數,傳入參數”MyClass1” $obj = new MyClass1(); //MyClass2類不存在自動調用__autoload()函數,傳入參數”MyClass2” $obj2 = new MyClass2(); |
對象序列化
有時候需要把一個對象在網路上傳輸,為了方便傳輸,可以把整個對象轉化為二進位串,等到達另一端時,再還原為原來的對象,這個過程稱之為序列化, 就像我們現在想把一輛汽車通過輪船運到美國去,因為汽車的體積比較大,我們可以把汽車拆開成小的組件,然後我們把這些組件通過輪般運到美國去,到了美國再把這些組件組裝回汽車。
有兩種情況我們必須把對象序列化,第一種情況就是把一個對象在網路中傳輸的時候要將對象序列化,第二種情況就是把對象寫入檔案或是資料庫的時候用到序列化。
序列化有兩個過程,一個是序列化,就是把對象轉化為二進位的字串,我們使用serialize()函數來序列化一個對象,另一個是反序列化,就是把對象轉化的二進位字串再轉化為對象, 我們使用unserialize()函數來反序列化一個對象.
PHP中serialize()函數的參數為對象名,傳回值為一個字串,Serialize()返回的字串含義模糊,一般我們不會解析這個串來得到對象的資訊,我們只要把返回來的這個字串傳到網路另一端或是儲存到方件中即可。
PHP中unserialize()函數來反序列化對象,這個函數的參數即為serialize()函數的傳回值,輸出當然是重新組織好的對象.
| 代碼如下 |
複製代碼 |
class Person { //下面是人的成員屬性 var $name; //人的名子 var $sex; //人的性別 var $age; //人的年齡 //定義一個構造方法參數為屬性姓名$name、性別$sex和年齡$age進行賦值 function __construct($name="", $sex="", $age="") { $this->name=$name; $this->sex=$sex; $this->age=$age; } //這個人可以說話的方法, 說出自己的屬性 function say() { echo "我的名子叫:".$this->name." 性別:".$this->sex." 我的年齡是:".$this->age.""; } } $p1=new Person("張三", "男", 20); $p1_string=serialize($p1); //把一個對象序列化,返一個字串 echo $p1_string.""; //序列化的字串我們通常不去解析 $p2=unserialize($p1_string); //把一個序列化的字串反序列化形成對象$p2 $p2->say(); |
多態的應用
多態是除封裝和繼承之外的另一個面象對象的三大特性之一,我個人看來PHP中雖然可以實現多態,但和c++還有Java這些物件導向的語言相比,多態性並不是那麼突出,因為PHP本身就是一種弱類型的語言,不存在父類對象轉化為子類對象或者是子類對象轉化為父類對象的問題,所以多態的應用並不是那麼的明顯;所謂多態性是指一段程式能夠處理多種類型對象的能力,比如說在公司上班,每個月財務發放工資,同一個發工資的方法,在公司內不同的員工或是不同職位的員工,都是通過這個方法發放的,但是所發的工資都是不相同的。所以同一個發工資的方法就出現了多種形態。對於物件導向的程式來說,多態就是把子類對象賦值給父類引用,然後調用父類的方法,去執行子類覆蓋父類的那個方法,但在PHP裡是弱類型的,對象引用都是一樣的不分父類引用,還是子類引用。
我們現在來看一個例子,首先還是要使用多態就要有父類對象和子類對象的關係。做一個形狀的介面或是抽象類別做為父類,裡面有兩個抽象方法,一個求周長的方法,另一個是求面積的方法;這介面的子類是多種不同的形狀,每個形狀又都有周長和面積,又因為父類是一個介面,所以子類裡面就必須要實現父類的這兩個周長和面積的抽象方法,這樣做的目的是每種不同形狀的子類都遵守父類介面的規範,都要有求周長和求面積的方法。
| 代碼如下 |
複製代碼 |
//定義了一個形狀的介面,裡面有兩個抽象方法讓子類去實現 interface Shape { function area(); function perimeter(); } //定義了一個矩形子類實現了形狀介面中的周長和面積 class Rect implements Shape { private $width; private $height; function __construct($width, $height) { $this->width=$width; $this->height=$height; } function area() { return "矩形的面積是:".($this->width*$this->height); } function perimeter() { return "矩形的周長是:".(2*($this->width+$this->height)); } } //定義了一個圓形子類實現了形狀介面中的周長和面積 class Circular implements Shape { private $radius; function __construct($radius) { $this->radius=$radius; } function area() { return "圓形的面積是:".(3.14*$this->radius*$this->radius); } function perimeter() { return "圓形的周長是:".(2*3.14*$this->radius); } } //把子類矩形對象賦給形狀的一個引用 $shape=new Rect(5, 10); echo $shape->area()." "; echo $shape->perimeter()." "; //把子類圓形對象賦給形狀的一個引用 $shape=new Circular(10); echo $shape->area()." "; echo $shape->perimeter()." "; 上例執行結果: 矩形的面積是:50 矩形的周長是:30 圓形的面積是:314 圓形的周長是:62.8 |
好了關於它們三個我們有詳細的介紹了,大家不懂還可以百度一下哦。
http://www.bkjia.com/PHPjc/444696.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/444696.htmlTechArticle本文章介紹了在php中的物件導向中的自動載入類 對象序列化 多態的應用的應用執行個體,有需要瞭解的同學可以看看。 自動載入類 很多開發人員...