本文實例講述了PHP中類與對象功能、用法。分享給大家供大家參考,具體如下:
1. 類與對象
類是面向對象程序設計的基本概念,是一類東西的結構描述 , 是一種抽象的概念 . 對象是一類東西的一個具體的實例 , 是具體事物 .
對象通過new關鍵字進行實例化:
比如汽車可以抽象為一個類,汽車擁有名字、輪胎、速度、重量等屬性,可以有換擋、前進、后退等操作方法。
// 定義一個汽車類
class Car {
$name = '汽車';
function getName() {
return $this->name;
}
}
//對象通過new關鍵字進行實例化
$car = new Car();
echo $car->getName();
2. 屬性與對象
在類中定義的變量稱之為屬性。屬性聲明是由關鍵字 public,protected 或者 private 開頭,后面跟一個普通的變量聲明來組成。屬性的變量可以設置初始化的默認值,默認值必須是常量。
方法就是在類中的function,很多時候我們分不清方法與函數有什么差別,在面向過程的程序設計中function叫做函數,在面向對象中function則被稱之為方法。
訪問控制的關鍵字代表的意義為:
- public:公開的 , 任何地方都可以訪問
- protected:受保護的 , 類內自身 , 其子類和父類可以訪問
- private:私有的 , 類內自身可訪問
類屬性的訪問控制必須定義 , 即必須寫出關鍵字 , 定義為三個中的一個
類方法不寫關鍵字 , 則默認為公有的
class Car {
public $speed = 0;
//增加speedUp方法,使speed加10
public function speedUp(){
$this->speed += 10;
}
}
// 創建對象
$car = new Car();
// 通過對象獲取類屬性與類方法
$car->speedUp();
echo $car->speed;
3. 構造函數與析構函數
PHP5可以在類中使用__construct()定義一個構造函數,具有構造函數的類,會在每次對象創建的時候調用該函數,因此常用來在對象創建的時候進行一些初始化工作。
在子類中如果定義了__construct則不會調用父類的__construct,如果需要同時調用父類的構造函數,需要使用parent::__construct()顯式的調用。
同樣,PHP5支持析構函數,使用__destruct()進行定義,析構函數指的是當某個對象的所有引用被刪除,或者對象被顯式的銷毀時會執行的函數。
class Car {
function __construct() {
print "構造函數被調用 \n";
}
function __destruct() {
print "析構函數被調用 \n";
}
}
$car = new Car(); //實例化時會調用構造函數
echo '使用后,準備銷毀car對象 \n';
unset($car); //銷毀時會調用析構函數
當PHP代碼執行完畢以后,會自動回收與銷毀對象,因此一般情況下不需要顯式的去銷毀對象。
4. 靜態屬性與靜態方法
public / protected / private static $變量名
不用實例化類 , 直接調用 類名 :: $變量名
但實例化后 , 不允許使用 對象 -> $變量名
public / protected / private static function 方法名()
不用實例化類 , 直接調用 類名 :: 方法名()
實例化后 , 對象 -> 方法名()
靜態方法中,$this偽變量不允許使用。可以使用self,parent,static在內部調用靜態方法與屬性。
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();
如果構造函數定義成了私有方法,則不允許直接實例化對象了,這時候一般通過靜態方法進行實例化,在設計模式中會經常使用這樣的方法來控制對象的創建,比如單例模式只允許有一個全局唯一的對象。
class Car {
private function __construct() {
echo 'object create';
}
private static $_object = null;
public static function getInstance() {
if (empty(self::$_object)) {
self::$_object = new Car(); //內部方法可以調用私有方法,因此這里可以創建對象
}
return self::$_object;
}
}
$car = new Car(); //這里不允許直接實例化對象
$car = Car::getInstance(); //通過靜態方法來獲得一個實例
5. 繼承
繼承是面向對象程序設計中常用的一個特性,汽車是一個比較大的類,我們也可以稱之為基類,除此之外,汽車還分為卡車、轎車、東風、寶馬等,因為這些子類具有很多相同的屬性和方法,可以采用繼承汽車類來共享這些屬性與方法,實現代碼的復用。
class Car {
public $speed = 0; //汽車的起始速度是0
public function speedUp() {
$this->speed += 10;
return $this->speed;
}
}
//建立一個Truck類,擴展Car類,并覆蓋speedUp方法,使速度累加50
class Truck extends Car{
public function speedUp(){
parent::speedUp();
$this->speed += 50;
return $this->speed;
}
}
$car = new Truck();
$car->speedUp();
echo $car->speed;
5. 重載
PHP中的重載指的是動態的創建屬性與方法,是通過魔術方法來實現的。
- 屬性的重載通過__set,__get,__isset,__unset來分別實現對不存在屬性的賦值、讀取、判斷屬性是否設置、銷毀屬性。
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屬性動態創建并賦值
echo $car->name;
if ($car->age){
echo '有';
}else{
echo '無';
}
unset($car->name);
var_dump($car->name);
- 方法的重載通過__call來實現,當調用不存在的方法的時候,將會轉為參數調用__call方法,當調用不存在的靜態方法時會使用__callStatic重載。
class Car {
public $speed = 0;
public function __call($name, $args) {
if ($name == 'speedUp') {
$this->speed += 10;
}
}
}
$car = new Car();
$car->speedUp(); //調用不存在的方法會使用重載
echo $car->speed;
6. 高級特性
對象比較,當同一個類的兩個實例的所有屬性都相等時,可以使用比較運算符 == 進行判斷,當需要判斷兩個變量是否為同一個對象的引用時,可以使用全等運算符 === 進行判斷。
class Car {
}
$a = new Car();
$b = new Car();
if ($a == $b) echo '=='; //true
if ($a === $b) echo '==='; //false
對象復制,在一些特殊情況下,可以通過關鍵字clone來復制一個對象,這時__clone方法會被調用,通過這個魔術方法來設置屬性的值。
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方法將對象序列化為字符串,用于存儲或者傳遞數據,然后在需要的時候通過unserialize將字符串反序列化成對象進行使用。
class Car {
public $name = 'car';
}
$a = new Car();
$str = serialize($a); //對象序列化成字符串
echo $str.'br>';
$b = unserialize($str); //反序列化為對象
var_dump($b);
更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》
希望本文所述對大家PHP程序設計有所幫助。
您可能感興趣的文章:- PHP類與對象后期靜態綁定操作實例詳解
- 詳解php中的類與對象(繼承)
- PHP類與對象中的private訪問控制的疑問
- php基礎知識:類與對象(5) static
- php基礎知識:類與對象(4) 范圍解析操作符(::)
- php基礎知識:類與對象(3) 構造函數和析構函數
- php基礎知識:類與對象(2) 自動加載對象
- php基礎知識:類與對象(1)
- PHP學習記錄之面向對象(Object-oriented programming,OOP)基礎【接口、抽象類、靜態方法等】
- PHP學習記錄之面向對象(Object-oriented programming,OOP)基礎【類、對象、繼承等】
- PHP面向對象程序設計子類擴展父類(子類重新載入父類)操作詳解