程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php面向對象 自動加載類 對象串行化 多態的應用

php面向對象 自動加載類 對象串行化 多態的應用

編輯:關於PHP編程

本文章介紹了在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

好了關於它們三個我們有詳細的介紹了,大家不懂還可以百度一下哦。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved