中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中構造方法和析構方法有什么區別

發布時間:2021-06-07 16:43:17 來源:億速云 閱讀:188 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關PHP中構造方法和析構方法有什么區別,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

1.構造方法

在每個聲明的類中都有一個唄稱為構造方法的特殊成員方法,如果沒有顯式的聲明它,類中都會默認存在一個沒有參數列表并且內容為空的構造方法。如果顯式的聲明它,則類中的默認構造方法將不會存在。當創建一個對象時,構造方法就會被自動調用一次,即每次使用關鍵詞new來實例化對象時都會自動調用構造方法,不能主動通過對象的引用調用構造方法。所以通常使用構造方法來執行一些有用的初始化任務,比如對成員屬性在創建對象時賦初值等。

在PHP5以前的版本中,構造方法的方法名稱必須與類名相同,這種方式在PHP 5中任然可以使用。但在PHP中很少聲明和類名同名的構造方法了,這樣做的好處是可以使構造函數獨立于類名,當類名發生變化時不需要更改相應的構造函數名稱。為了向下兼容,在創建對象時,如果一個類中沒有名為__construct()的構造方法,PHP將搜索與類名相同名的構造方法執行。在類中聲明構造方法的格式如下:

function __construct( [參數列表] ){ //構造方法名稱是以兩個下劃線開始的
  //方法體,通常用來對成員屬性進行初始化賦值
}

在PHP中,同一個類中只能聲明一個構造方法。原因是構造方法名稱是固定的,在PHP中不能聲明同名的兩個函數,所以也就沒有構造方法重載。但可以在聲明構造方法時使用默認參數,實現其他面向對象的編程語言中構造方法重載的功能。這樣在創建對象時,如果在構造方法中沒有傳入參數,則使用默認參數為成員屬性進行初始化。

  • 構造函數可以接受參數,能夠在創建對象時賦值給對象屬性

  • 構造函數可以調用類方法或其他函數

  • 構造函數可以調用其他類的構造函數

構造函數使用例子:

<?php
class Person{
  private $name;
  private $age;
  private $gender;
  public function __construct($name,$age,$gender){
    $this->setName($name);  //調用類方法
    $this->age = $age;
    $this->setGender($gender);
  }
  public function setName($name){
    $this->name = $name;
  }
  // ... setter 方法
}
$person = new Person("yeoman",23,'男');
?>

調用父類構造函數、調用無關類的構造函數:

function __construct(){
  parent::__construct(); // 調用父類的構造函數必須顯示的使用parent調用父類構造函數
  classname::__construct(); // 調用其他類的構造函數,classname是類名
  //其他操作
}

繼承和構造函數

PHP中的子類的構造函數不會主動調用父類的構造函數,要顯示的使用parent::__construct()調用:

<?php
class Animal{
  private $name;
  function __construct($name){
    $this->setName($name)
    echo "動物類被創建!";
  }
  // ... 其他方法
}
class Birds extends Animal{
  private $name;
  private $leg;
  function __construct($name,$leg){
    parent::__construct($name); // 顯示調用
    $this->setLeg($leg);
    echo "鳥類被創建!";
  }
  // ... 其他方法
}
?>

如果涉及多層繼承,當調用parent::__construct()時,會沿著父類向上搜索,直到找到最合適的構造函數,例如:

// 接上例
class Parrot extends Birds{
  private $name;
  private $leg;
  private $wing;
  function __construct($name){
    parent::__construct($name); // 此時沒有找到父類(Birds類)合適的構造函數,只能向上搜索,搜索到Animal類時,才找到合適的構造函數
    echo "鸚鵡類被創建!";
    $this->smackTalk();
    /*
    輸出結果:
    "動物類被創建!"
    "鸚鵡說話!"
    */
  }
  function smackTalk(){
    echo "鸚鵡說話!";
  }
}

如果想要依次調用幾個父類的構造函數,可以使用類名直接調用構造函數,例如:

function __construct($name,$leg){
    Animal::__construct($name); // 調用Animal構造函數
    Birds::__construct($name,$leg); // 調用Birds構造函數
}

2.析構函數

析構方法允許在銷毀一個對象之前執行一些特定的操作,例如關閉文件,釋放結果集等。

當堆內存段中的對象失去訪問它的引用時,它就不能被訪問了,也就成為垃圾對象了。通常對象的引用被賦予其他的值或者是在頁面運行結束時,對象都會失去引用。

析構函數是在銷毀對象時,自動調用的,不能顯式的調用。析構函數不能帶參數。

析構方法的聲明格式如下:

function __deconstruct(){
  //方法體,通常用來完成一些在對象銷毀前的清理任務
}

在以下幾種情況下可能會調用析構函數(但不一定):

  • PHP頁面加載完畢之后;

  • unset()類;

  • 變量引用指向別的對象或值時;

  • PHP的內存回收機制和JAVA的很類似,對沒有任何引用的對象進行銷毀回收,采用引用計數器的技術。

例子:

<?php
class test{
  function __destruct(){
    echo "當對象銷毀時會調用!!!";
  }
}
$a = $b = $c = new test();
$a = null;
unset($b);
echo "<hr />";
?>

此例子,如下圖,有三個變量引用$a,$b,$c指向test對象,test對象就有3個引用計數,當$a = null時,$a對test對象的引用丟失,計數-1,變為2,當$b被unset()時,$b對test對象的引用也丟失了,計數再-1,變為1,最后頁面加載完畢,$c指向test對象的引用自動被釋放,此時計數再-1,變為0,test對象已沒有變量引用,就會被銷毀,此時就會調用析構函數。

PHP中構造方法和析構方法有什么區別

在PHP中析構方法并不是很常用,它屬于類中可選的一部分,只有需要時才在類中聲明。

<?php
class Person{
  var $name;
  var $sex;
  var $age;
  function __construct($name, $sex, $age){
    $this->name = $name;
    $this->sex = $sex;
    $this->age = $age;
  }
  function __destruct(){
    echo "再見" . $this->name . "<br />";
  }
}
$person1 = new Person("張三三", "男", 23);
$person1 = null;  //第一個對象將失去引用
$person2 = new Person("李四四", "女", 17);
$person3 = new Person("王五五", "男", 43);
?>

運行結果:

再見張三三
再見王五五
再見李四四

關于PHP中構造方法和析構方法有什么區別就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

江陵县| 城固县| 兴国县| 民丰县| 博罗县| 封开县| 桃源县| 固镇县| 邯郸县| 静宁县| 巴青县| 江陵县| 江达县| 涿州市| 石狮市| 永昌县| 股票| 江山市| 礼泉县| 突泉县| 酒泉市| 平陆县| 东山县| 安化县| 阳江市| 浏阳市| 兰溪市| 通榆县| 禹城市| 吴川市| 潜江市| 巫山县| 五莲县| 宜丰县| 镇赉县| 巴彦县| 隆尧县| 龙门县| 云阳县| 盘山县| 文昌市|