php-類和對象-創(chuàng)新互聯(lián)

類和對象

類是面向?qū)ο蟪绦蛟O計的基本概念,通俗的理解類就是對現(xiàn)實中某一個種類的東西的抽象, 比如汽車可以抽象為一個類,汽車擁有名字、輪胎、速度、重量等屬性,可以有換擋、前進、后退等操作方法。

網(wǎng)站的建設成都創(chuàng)新互聯(lián)公司專注網(wǎng)站定制,經(jīng)驗豐富,不做模板,主營網(wǎng)站定制開發(fā).小程序定制開發(fā),H5頁面制作!給你煥然一新的設計體驗!已為成都玻璃貼膜等企業(yè)提供專業(yè)服務。

通常定義一個汽車類的方法為:

class Car {
    $name = '汽車';
    function getName() {
        return $this->name;
    }}

類是一類東西的結構描述,而對象則是一類東西的一個具體實例,例如汽車這個名詞可以理解為汽車的總類,但這輛汽車則是一個具體的汽車對象。

對象通過new關鍵字進行實例化:

$car = new Car();
echo $car->getName();

類與對象看起來比較相似,但實際上有本質(zhì)的區(qū)別,類是抽象的概念,對象是具體的實例。類可以使程序具有可重用性


創(chuàng)建一個對象

類通過關鍵字class開頭,然后是類名與花括號,在花括號中定義類的屬性與方法。

類名必須是字母或下劃線開頭,后面緊跟若干個字母、數(shù)字或下劃線,類名最好能夠表意,可以采用名詞或者英文單詞。

//定義一個類
class Car {
    //定義屬性
    public $name = '汽車';

    //定義方法
    public function getName() {
        //方法內(nèi)部可以使用$this偽變量調(diào)用對象的屬性或者方法
        return $this->name;
    }
}

要創(chuàng)建一個類的實例,可以使用new關鍵字創(chuàng)建一個對象。

$car = new Car();
//也可以采用變量來創(chuàng)建
$className = 'Car';
$car = new $className();


類的屬性

在類中定義的變量稱之為屬性,通常屬性跟數(shù)據(jù)庫中的字段有一定的關聯(lián),因此也可以稱作“字段”。

屬性聲明是由關鍵字 public,protected 或者 private 開頭,后面跟一個普通的變量聲明來組成。

屬性的變量可以設置初始化的默認值,默認值必須是常量。

訪問控制的關鍵字代表的意義為:

public:公開的
protected:受保護的
private:私有的

class Car {
    //定義公共屬性
    public $name = '汽車';

    //定義受保護的屬性
    protected $corlor = '白色';

    //定義私有屬性
    private $price = '100000';
}

默認都為public,外部可以訪問。

一般通過 '->' 對象操作符來訪問對象的屬性或者方法,對于靜態(tài)屬性則使用 ': :' 雙冒號進行訪問。

當在類成員方法內(nèi)部調(diào)用的時候,可以使用$this偽變量調(diào)用當前對象的屬性。

$car = new Car();
echo $car->name;   //調(diào)用對象的屬性
echo $car->color;  //錯誤 受保護的屬性不允許外部調(diào)用echo $car->price;  //錯誤 私有屬性不允許外部調(diào)用

受保護的屬性與私有屬性不允許外部調(diào)用,在類的成員方法內(nèi)部是可以調(diào)用的。

class Car{
    private $price = '1000';
    public function getPrice() {
        return $this->price; //內(nèi)部訪問私有屬性    }}


定義類的方法

方法就是在類中的function,很多時候我們分不清方法與函數(shù)有什么差別 :

在面向過程的程序設計中function叫做函數(shù) ;

在面向?qū)ο笾衒unction則被稱之為方法 。

同屬性一樣,類的方法也具有public,protected 以及 private 的訪問控制。

訪問控制的關鍵字代表的意義為:
public:公開的
protected:受保護的
private:私有的

我們可以這樣定義方法:

class Car {
    public function getName() {
        return '汽車';
    }
}
$car = new Car();
echo $car->getName();

使用關鍵字static修飾的,稱之為靜態(tài)方法,靜態(tài)方法不需要實例化對象,可以通過類名直接調(diào)用,操作符為雙冒號 : : 。

class Car {
    public static function getName() {
        return '汽車';
    }
}
echo Car::getName(); //結果為“汽車”


構造函數(shù)和析構函數(shù)

PHP5可以在類中使用__construct()定義一個構造函數(shù),具有構造函數(shù)的類,會在每次對象創(chuàng)建的時候調(diào)用該函數(shù),因此常用來在對象創(chuàng)建的時候進行一些初始化工作。

class Car {
   function __construct() {
       print "構造函數(shù)被調(diào)用\n";
   }
}
$car = new Car(); //實例化的時候 會自動調(diào)用構造函數(shù)__construct,這里會輸出一個字符串

在子類中如果定義了__construct則不會調(diào)用父類的__construct,如果需要同時調(diào)用父類的構造函數(shù),需要使用 parent : : __construct() 顯式的調(diào)用。

class Car {
   function __construct() {
       print "父類構造函數(shù)被調(diào)用\n";
   }
}
class Truck extends Car {
   function __construct() {
       print "子類構造函數(shù)被調(diào)用\n";
       parent::__construct();
   }
}
$car = new Truck();

同樣,PHP5支持析構函數(shù),使用__destruct()進行定義,析構函數(shù)指的是當某個對象的所有引用被刪除,或者對象被顯式的銷毀時會執(zhí)行的函數(shù)。

class Car {
   function __construct() {
       print "構造函數(shù)被調(diào)用 \n";
   }
   function __destruct() {
       print "析構函數(shù)被調(diào)用 \n";
   }
}
$car = new Car(); //實例化時會調(diào)用構造函數(shù)
echo '使用后,準備銷毀car對象 \n';
unset($car); //銷毀時會調(diào)用析構函數(shù)

當PHP代碼執(zhí)行完畢以后,會自動回收與銷毀對象,因此一般情況下不需要顯式的去銷毀對象。


Static靜態(tài)關鍵字

靜態(tài)屬性與方法可以在不實例化類的情況下調(diào)用,直接使用類名::方法名的方式進行調(diào)用。

靜態(tài)屬性不允許對象使用->操作符調(diào)用。

class Car {
    private static $speed = 10;
    
    public static function getSpeed() {
        return self::$speed;
    }
}
echo Car::getSpeed();  //調(diào)用靜態(tài)方法

靜態(tài)方法也可以通過變量來進行動態(tài)調(diào)用

$func = 'getSpeed';
$className = 'Car';
echo $className::$func();  //動態(tài)調(diào)用靜態(tài)方法

靜態(tài)方法中,$this偽變量不允許使用??梢允褂胹elf,parent,static在內(nèi)部調(diào)用靜態(tài)方法與屬性。

class Car {
    private static $speed = 10;
    
    public static function getSpeed() {
        return self::$speed;
    }
    
    public static function speedUp() {
        return self::$speed+=10;
    }
}
class BigCar extends Car {
    public static function start() {
        parent::speedUp();
    }
}BigCar::start();echo BigCar::getSpeed();


訪問控制

訪問控制通過關鍵字public,protected和private來實現(xiàn)。

被定義為公有的類成員可以在任何地方被訪問。

被定義為受保護的類成員則可以被其自身以及其子類和父類訪問。

被定義為私有的類成員則只能被其定義所在的類訪問。

類屬性必須定義為公有、受保護、私有之一。

為兼容PHP5以前的版本,如果采用 var 定義,則被視為公有。

class Car {
    $speed = 10; //錯誤 屬性必須定義訪問控制
    public $name;   //定義共有屬性
}

類中的方法可以被定義為公有、私有受保護。

如果沒有設置這些關鍵字,則該方法默認為公有。

class Car {
    //默認為共有方法
    function turnLeft() {
    }
}

如果構造函數(shù)定義成了私有方法,則不允許直接實例化對象了,這時候一般通過靜態(tài)方法進行實例化,在設計模式中會經(jīng)常使用這樣的方法來控制對象的創(chuàng)建,比如單例模式只允許有一個全局唯一的對象。

class Car {
    private function __construct() {
        echo 'object create';
    }

    private static $_object = null;
    public static function getInstance() {
        if (empty(self::$_object)) {
            self::$_object = new Car(); //內(nèi)部方法可以調(diào)用私有方法,因此這里可以創(chuàng)建對象
        }
        return self::$_object;
    }
}
//$car = new Car(); //這里不允許直接實例化對象
$car = Car::getInstance(); //通過靜態(tài)方法來獲得一個實例


對象繼承

繼承是面向?qū)ο蟪绦蛟O計中常用的一個特性,汽車是一個比較大的類,我們也可以稱之為基類,除此之外,汽車還分為卡車、轎車、東風、寶馬等,因為這些子類具有很多相同的屬性和方法,可以采用繼承汽車類來共享這些屬性與方法,實現(xiàn)代碼的復用。


重載

PHP中的重載指的是動態(tài)的創(chuàng)建屬性與方法,是通過魔術方法來實現(xiàn)的。

屬性的重載通過__set,__get,__isset,__unset來分別實現(xiàn)對不存在屬性的賦值、讀取、判斷屬性是否設置、銷毀屬性。

class Car {
    private $ary = array();
    
    public function __set($key, $val) {
        $this->ary[$key] = $val;
    }
    
    public function __get($key) {
        if (isset($this->ary[$key])) {
            return $this->ary[$key];
        }
        return null;
    }
    
    public function __isset($key) {
        if (isset($this->ary[$key])) {
            return true;
        }
        return false;
    }
    
    public function __unset($key) {
        unset($this->ary[$key]);
    }
}
$car = new Car();
$car->name = '汽車';  //name屬性動態(tài)創(chuàng)建并賦值
echo $car->name;

方法的重載通過__call來實現(xiàn),當調(diào)用不存在的方法的時候,將會轉(zhuǎn)為參數(shù)調(diào)用__call方法,當調(diào)用不存在的靜態(tài)方法時會使用__callStatic重載。

class Car {
    public $speed = 0;
    
    public function __call($name, $args) {
        if ($name == 'speedUp') {
            $this->speed += 10;
        }
    }
}
$car = new Car();
$car->speedUp(); //調(diào)用不存在的方法會使用重載
echo $car->speed;


對象的高級特性

對象比較,當同一個類的兩個實例的所有屬性都相等時,可以使用比較運算符==進行判斷,當需要判斷兩個變量是否為同一個對象的引用時,可以使用全等運算符===進行判斷。

class Car {
}
$a = new Car();
$b = new Car();
if ($a == $b) echo '==';   //true
if ($a === $b) echo '==='; //false

對象復制,在一些特殊情況下,可以通過關鍵字clone來復制一個對象,這時__clone方法會被調(diào)用,通過這個魔術方法來設置屬性的值。

class Car {
    public $name = 'car';
    
    public function __clone() {
        $obj = new Car();
        $obj->name = $this->name;
    }
}
$a = new Car();
$a->name = 'new car';
$b = clone $a;
var_dump($b);

對象序列化,可以通過serialize方法將對象序列化為字符串,用于存儲或者傳遞數(shù)據(jù),然后在需要的時候通過unserialize將字符串反序列化成對象進行使用。

class Car {
    public $name = 'car';
}
$a = new Car();
$str = serialize($a); //對象序列化成字符串
echo $str.'<br>';
$b = unserialize($str); //反序列化為對象
var_dump($b);

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

本文題目:php-類和對象-創(chuàng)新互聯(lián)
本文地址:http://muchs.cn/article32/eiesc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設、品牌網(wǎng)站制作網(wǎng)站設計、電子商務、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作