主頁(yè) > 知識(shí)庫(kù) > PHP中類(lèi)與對(duì)象功能、用法實(shí)例解讀

PHP中類(lèi)與對(duì)象功能、用法實(shí)例解讀

熱門(mén)標(biāo)簽:邢臺(tái)400電話(huà)辦理 南寧電話(huà)外呼系統(tǒng)線(xiàn)路 濟(jì)源百應(yīng)電銷(xiāo)機(jī)器人聯(lián)系方式 辦理400電話(huà)哪家好點(diǎn) 重慶外呼電銷(xiāo)系統(tǒng)多少錢(qián) 嘟嘟云外呼系統(tǒng) 咸陽(yáng)電銷(xiāo) 南京3D地圖標(biāo)注 正規(guī)電銷(xiāo)機(jī)器人系統(tǒng)

本文實(shí)例講述了PHP中類(lèi)與對(duì)象功能、用法。分享給大家供大家參考,具體如下:

1. 類(lèi)與對(duì)象

類(lèi)是面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念,是一類(lèi)東西的結(jié)構(gòu)描述 , 是一種抽象的概念 . 對(duì)象是一類(lèi)東西的一個(gè)具體的實(shí)例 , 是具體事物 .

對(duì)象通過(guò)new關(guān)鍵字進(jìn)行實(shí)例化:
比如汽車(chē)可以抽象為一個(gè)類(lèi),汽車(chē)擁有名字、輪胎、速度、重量等屬性,可以有換擋、前進(jìn)、后退等操作方法。

// 定義一個(gè)汽車(chē)類(lèi)
class Car {
  $name = '汽車(chē)';
  function getName() {
    return $this->name;
  }
}
//對(duì)象通過(guò)new關(guān)鍵字進(jìn)行實(shí)例化 
$car = new Car();
echo $car->getName();
2. 屬性與對(duì)象

在類(lèi)中定義的變量稱(chēng)之為屬性。屬性聲明是由關(guān)鍵字 public,protected 或者 private 開(kāi)頭,后面跟一個(gè)普通的變量聲明來(lái)組成。屬性的變量可以設(shè)置初始化的默認(rèn)值,默認(rèn)值必須是常量。

方法就是在類(lèi)中的function,很多時(shí)候我們分不清方法與函數(shù)有什么差別,在面向過(guò)程的程序設(shè)計(jì)中function叫做函數(shù),在面向?qū)ο笾衒unction則被稱(chēng)之為方法。

訪問(wèn)控制的關(guān)鍵字代表的意義為:

  • public:公開(kāi)的 , 任何地方都可以訪問(wèn)
  • protected:受保護(hù)的 , 類(lèi)內(nèi)自身 , 其子類(lèi)和父類(lèi)可以訪問(wèn)
  • private:私有的 , 類(lèi)內(nèi)自身可訪問(wèn)

類(lèi)屬性的訪問(wèn)控制必須定義 , 即必須寫(xiě)出關(guān)鍵字 , 定義為三個(gè)中的一個(gè)
類(lèi)方法不寫(xiě)關(guān)鍵字 , 則默認(rèn)為公有的

class Car {
  public $speed = 0;
  //增加speedUp方法,使speed加10
  public function speedUp(){
    $this->speed += 10;
  }
}
// 創(chuàng)建對(duì)象
$car = new Car();
// 通過(guò)對(duì)象獲取類(lèi)屬性與類(lèi)方法
$car->speedUp();
echo $car->speed;
3. 構(gòu)造函數(shù)與析構(gòu)函數(shù)

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

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

同樣,PHP5支持析構(gòu)函數(shù),使用__destruct()進(jìn)行定義,析構(gòu)函數(shù)指的是當(dāng)某個(gè)對(duì)象的所有引用被刪除,或者對(duì)象被顯式的銷(xiāo)毀時(shí)會(huì)執(zhí)行的函數(shù)。

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

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

4. 靜態(tài)屬性與靜態(tài)方法
  • 靜態(tài)屬性:
public / protected / private static $變量名

不用實(shí)例化類(lèi) , 直接調(diào)用 類(lèi)名 :: $變量名
但實(shí)例化后 , 不允許使用 對(duì)象 -> $變量名

  • 靜態(tài)方法
public / protected / private static function 方法名()

不用實(shí)例化類(lèi) , 直接調(diào)用 類(lèi)名 :: 方法名()
實(shí)例化后 , 對(duì)象 -> 方法名()
靜態(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();

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

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)建對(duì)象
    }
    return self::$_object;
  }
}
$car = new Car(); //這里不允許直接實(shí)例化對(duì)象
$car = Car::getInstance(); //通過(guò)靜態(tài)方法來(lái)獲得一個(gè)實(shí)例
5. 繼承

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

class Car {
  public $speed = 0; //汽車(chē)的起始速度是0
  
  public function speedUp() {
    $this->speed += 10;
    return $this->speed;
  }
}
//建立一個(gè)Truck類(lèi),擴(kuò)展Car類(lèi),并覆蓋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中的重載指的是動(dòng)態(tài)的創(chuàng)建屬性與方法,是通過(guò)魔術(shù)方法來(lái)實(shí)現(xiàn)的。

  • 屬性的重載通過(guò)__set,__get,__isset,__unset來(lái)分別實(shí)現(xiàn)對(duì)不存在屬性的賦值、讀取、判斷屬性是否設(shè)置、銷(xiāo)毀屬性。
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 = '汽車(chē)'; //name屬性動(dòng)態(tài)創(chuàng)建并賦值
echo $car->name;
if ($car->age){
  echo '有';
}else{
  echo '無(wú)';
}
unset($car->name);
var_dump($car->name);
  • 方法的重載通過(guò)__call來(lái)實(shí)現(xiàn),當(dāng)調(diào)用不存在的方法的時(shí)候,將會(huì)轉(zhuǎn)為參數(shù)調(diào)用__call方法,當(dāng)調(diào)用不存在的靜態(tài)方法時(shí)會(huì)使用__callStatic重載。
class Car {
  public $speed = 0;
  
  public function __call($name, $args) {
    if ($name == 'speedUp') {
      $this->speed += 10;
    }
  }
}
$car = new Car();
$car->speedUp(); //調(diào)用不存在的方法會(huì)使用重載
echo $car->speed;
6. 高級(jí)特性

對(duì)象比較,當(dāng)同一個(gè)類(lèi)的兩個(gè)實(shí)例的所有屬性都相等時(shí),可以使用比較運(yùn)算符 == 進(jìn)行判斷,當(dāng)需要判斷兩個(gè)變量是否為同一個(gè)對(duì)象的引用時(shí),可以使用全等運(yùn)算符 === 進(jìn)行判斷。

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

對(duì)象復(fù)制,在一些特殊情況下,可以通過(guò)關(guān)鍵字clone來(lái)復(fù)制一個(gè)對(duì)象,這時(shí)__clone方法會(huì)被調(diào)用,通過(guò)這個(gè)魔術(shù)方法來(lái)設(shè)置屬性的值。

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);

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

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

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門(mén)教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • PHP類(lèi)與對(duì)象后期靜態(tài)綁定操作實(shí)例詳解
  • 詳解php中的類(lèi)與對(duì)象(繼承)
  • PHP類(lèi)與對(duì)象中的private訪問(wèn)控制的疑問(wèn)
  • php基礎(chǔ)知識(shí):類(lèi)與對(duì)象(5) static
  • php基礎(chǔ)知識(shí):類(lèi)與對(duì)象(4) 范圍解析操作符(::)
  • php基礎(chǔ)知識(shí):類(lèi)與對(duì)象(3) 構(gòu)造函數(shù)和析構(gòu)函數(shù)
  • php基礎(chǔ)知識(shí):類(lèi)與對(duì)象(2) 自動(dòng)加載對(duì)象
  • php基礎(chǔ)知識(shí):類(lèi)與對(duì)象(1)
  • PHP學(xué)習(xí)記錄之面向?qū)ο螅∣bject-oriented programming,OOP)基礎(chǔ)【接口、抽象類(lèi)、靜態(tài)方法等】
  • PHP學(xué)習(xí)記錄之面向?qū)ο螅∣bject-oriented programming,OOP)基礎(chǔ)【類(lèi)、對(duì)象、繼承等】
  • PHP面向?qū)ο蟪绦蛟O(shè)計(jì)子類(lèi)擴(kuò)展父類(lèi)(子類(lèi)重新載入父類(lèi))操作詳解

標(biāo)簽:通遼 南通 黃山 河南 唐山 武漢 平頂山 隴南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP中類(lèi)與對(duì)象功能、用法實(shí)例解讀》,本文關(guān)鍵詞  PHP,中類(lèi),與,對(duì)象,功能,用法,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP中類(lèi)與對(duì)象功能、用法實(shí)例解讀》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于PHP中類(lèi)與對(duì)象功能、用法實(shí)例解讀的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章