1. 程式人生 > 程式設計 >PHP中類與物件功能、用法例項解讀

PHP中類與物件功能、用法例項解讀

本文例項講述了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程式設計有所幫助。