最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之構(gòu)造方法和析構(gòu)方法詳解

 更新時(shí)間:2019年06月13日 11:18:14   作者:Yeoman92  
這篇文章主要介紹了PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之構(gòu)造方法和析構(gòu)方法,結(jié)合具體實(shí)例形式詳細(xì)分析了php面向?qū)ο蟪绦蛟O(shè)計(jì)中構(gòu)造方法和析構(gòu)方法的相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之構(gòu)造方法和析構(gòu)方法。分享給大家供大家參考,具體如下:

構(gòu)造方法和析構(gòu)方法是對(duì)象中的兩個(gè)特殊方法,它們都與對(duì)象的生命周期有關(guān)。構(gòu)造方法是對(duì)象創(chuàng)建完成后第一個(gè)被對(duì)象自動(dòng)調(diào)用的方法,這是我們?cè)趯?duì)象中使用構(gòu)造方法的原因。而析構(gòu)方法是對(duì)象在銷(xiāo)毀之前最后一個(gè)被對(duì)象自動(dòng)調(diào)用的方法,這也是我們?cè)趯?duì)象中使用析構(gòu)方法的原因。所以通常使用構(gòu)造方法完成一些對(duì)象的初始化工作,使用析構(gòu)方法完成一些對(duì)象在銷(xiāo)毀之前的清理工作。

1.構(gòu)造方法

在每個(gè)聲明的類(lèi)中都有一個(gè)唄稱為構(gòu)造方法的特殊成員方法,如果沒(méi)有顯式的聲明它,類(lèi)中都會(huì)默認(rèn)存在一個(gè)沒(méi)有參數(shù)列表并且內(nèi)容為空的構(gòu)造方法。如果顯式的聲明它,則類(lèi)中的默認(rèn)構(gòu)造方法將不會(huì)存在。當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),構(gòu)造方法就會(huì)被自動(dòng)調(diào)用一次,即每次使用關(guān)鍵詞new來(lái)實(shí)例化對(duì)象時(shí)都會(huì)自動(dòng)調(diào)用構(gòu)造方法,不能主動(dòng)通過(guò)對(duì)象的引用調(diào)用構(gòu)造方法。所以通常使用構(gòu)造方法來(lái)執(zhí)行一些有用的初始化任務(wù),比如對(duì)成員屬性在創(chuàng)建對(duì)象時(shí)賦初值等。

在PHP5以前的版本中,構(gòu)造方法的方法名稱必須與類(lèi)名相同,這種方式在PHP 5中任然可以使用。但在PHP中很少聲明和類(lèi)名同名的構(gòu)造方法了,這樣做的好處是可以使構(gòu)造函數(shù)獨(dú)立于類(lèi)名,當(dāng)類(lèi)名發(fā)生變化時(shí)不需要更改相應(yīng)的構(gòu)造函數(shù)名稱。為了向下兼容,在創(chuàng)建對(duì)象時(shí),如果一個(gè)類(lèi)中沒(méi)有名為__construct()的構(gòu)造方法,PHP將搜索與類(lèi)名相同名的構(gòu)造方法執(zhí)行。在類(lèi)中聲明構(gòu)造方法的格式如下:

function __construct( [參數(shù)列表] ){ //構(gòu)造方法名稱是以兩個(gè)下劃線開(kāi)始的
  //方法體,通常用來(lái)對(duì)成員屬性進(jìn)行初始化賦值
}

在PHP中,同一個(gè)類(lèi)中只能聲明一個(gè)構(gòu)造方法。原因是構(gòu)造方法名稱是固定的,在PHP中不能聲明同名的兩個(gè)函數(shù),所以也就沒(méi)有構(gòu)造方法重載。但可以在聲明構(gòu)造方法時(shí)使用默認(rèn)參數(shù),實(shí)現(xiàn)其他面向?qū)ο蟮木幊陶Z(yǔ)言中構(gòu)造方法重載的功能。這樣在創(chuàng)建對(duì)象時(shí),如果在構(gòu)造方法中沒(méi)有傳入?yún)?shù),則使用默認(rèn)參數(shù)為成員屬性進(jìn)行初始化。

  • 構(gòu)造函數(shù)可以接受參數(shù),能夠在創(chuàng)建對(duì)象時(shí)賦值給對(duì)象屬性
  • 構(gòu)造函數(shù)可以調(diào)用類(lèi)方法或其他函數(shù)
  • 構(gòu)造函數(shù)可以調(diào)用其他類(lèi)的構(gòu)造函數(shù)

構(gòu)造函數(shù)使用例子:

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

調(diào)用父類(lèi)構(gòu)造函數(shù)、調(diào)用無(wú)關(guān)類(lèi)的構(gòu)造函數(shù):

function __construct(){
  parent::__construct(); // 調(diào)用父類(lèi)的構(gòu)造函數(shù)必須顯示的使用parent調(diào)用父類(lèi)構(gòu)造函數(shù)
  classname::__construct(); // 調(diào)用其他類(lèi)的構(gòu)造函數(shù),classname是類(lèi)名
  //其他操作
}

繼承和構(gòu)造函數(shù)

PHP中的子類(lèi)的構(gòu)造函數(shù)不會(huì)主動(dòng)調(diào)用父類(lèi)的構(gòu)造函數(shù),要顯示的使用parent::__construct()調(diào)用:

<?php
class Animal{
  private $name;
  function __construct($name){
    $this->setName($name)
    echo "動(dòng)物類(lèi)被創(chuàng)建!";
  }
  // ... 其他方法
}
class Birds extends Animal{
  private $name;
  private $leg;
  function __construct($name,$leg){
    parent::__construct($name); // 顯示調(diào)用
    $this->setLeg($leg);
    echo "鳥(niǎo)類(lèi)被創(chuàng)建!";
  }
  // ... 其他方法
}
?>

如果涉及多層繼承,當(dāng)調(diào)用parent::__construct()時(shí),會(huì)沿著父類(lèi)向上搜索,直到找到最合適的構(gòu)造函數(shù),例如:

// 接上例
class Parrot extends Birds{
  private $name;
  private $leg;
  private $wing;
  function __construct($name){
    parent::__construct($name); // 此時(shí)沒(méi)有找到父類(lèi)(Birds類(lèi))合適的構(gòu)造函數(shù),只能向上搜索,搜索到Animal類(lèi)時(shí),才找到合適的構(gòu)造函數(shù)
    echo "鸚鵡類(lèi)被創(chuàng)建!";
    $this->smackTalk();
    /*
    輸出結(jié)果:
    "動(dòng)物類(lèi)被創(chuàng)建!"
    "鸚鵡說(shuō)話!"
    */
  }
  function smackTalk(){
    echo "鸚鵡說(shuō)話!";
  }
}

如果想要依次調(diào)用幾個(gè)父類(lèi)的構(gòu)造函數(shù),可以使用類(lèi)名直接調(diào)用構(gòu)造函數(shù),例如:

function __construct($name,$leg){
    Animal::__construct($name); // 調(diào)用Animal構(gòu)造函數(shù)
    Birds::__construct($name,$leg); // 調(diào)用Birds構(gòu)造函數(shù)
}

2.析構(gòu)函數(shù)

析構(gòu)方法允許在銷(xiāo)毀一個(gè)對(duì)象之前執(zhí)行一些特定的操作,例如關(guān)閉文件,釋放結(jié)果集等。

當(dāng)堆內(nèi)存段中的對(duì)象失去訪問(wèn)它的引用時(shí),它就不能被訪問(wèn)了,也就成為垃圾對(duì)象了。通常對(duì)象的引用被賦予其他的值或者是在頁(yè)面運(yùn)行結(jié)束時(shí),對(duì)象都會(huì)失去引用。

析構(gòu)函數(shù)是在銷(xiāo)毀對(duì)象時(shí),自動(dòng)調(diào)用的,不能顯式的調(diào)用。析構(gòu)函數(shù)不能帶參數(shù)。

析構(gòu)方法的聲明格式如下:

function __deconstruct(){
  //方法體,通常用來(lái)完成一些在對(duì)象銷(xiāo)毀前的清理任務(wù)
}

在以下幾種情況下可能會(huì)調(diào)用析構(gòu)函數(shù)(但不一定):

  • PHP頁(yè)面加載完畢之后;
  • unset()類(lèi);
  • 變量引用指向別的對(duì)象或值時(shí);
  • PHP的內(nèi)存回收機(jī)制和JAVA的很類(lèi)似,對(duì)沒(méi)有任何引用的對(duì)象進(jìn)行銷(xiāo)毀回收,采用引用計(jì)數(shù)器的技術(shù)。

例子:

<?php
class test{
  function __destruct(){
    echo "當(dāng)對(duì)象銷(xiāo)毀時(shí)會(huì)調(diào)用!?。?;
  }
}
$a = $b = $c = new test();
$a = null;
unset($b);
echo "<hr />";
?>

此例子,如下圖,有三個(gè)變量引用$a,$b,$c指向test對(duì)象,test對(duì)象就有3個(gè)引用計(jì)數(shù),當(dāng)$a = null時(shí),$a對(duì)test對(duì)象的引用丟失,計(jì)數(shù)-1,變?yōu)?,當(dāng)$b被unset()時(shí),$b對(duì)test對(duì)象的引用也丟失了,計(jì)數(shù)再-1,變?yōu)?,最后頁(yè)面加載完畢,$c指向test對(duì)象的引用自動(dòng)被釋放,此時(shí)計(jì)數(shù)再-1,變?yōu)?,test對(duì)象已沒(méi)有變量引用,就會(huì)被銷(xiāo)毀,此時(shí)就會(huì)調(diào)用析構(gòu)函數(shù)。

在PHP中析構(gòu)方法并不是很常用,它屬于類(lèi)中可選的一部分,只有需要時(shí)才在類(lèi)中聲明。

<?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 "再見(jiàn)" . $this->name . "<br />";
  }
}
$person1 = new Person("張三三", "男", 23);
$person1 = null;  //第一個(gè)對(duì)象將失去引用
$person2 = new Person("李四四", "女", 17);
$person3 = new Person("王五五", "男", 43);
?>

運(yùn)行結(jié)果:

再見(jiàn)張三三
再見(jiàn)王五五
再見(jiàn)李四四

第一個(gè)對(duì)象在聲明完成以后,它的引用就被賦予了空值,所以第一個(gè)對(duì)象最先失去的引用,不能再被訪問(wèn)了,人后自動(dòng)調(diào)用第一個(gè)對(duì)象中的析構(gòu)方法輸出“再見(jiàn)張三三”。后面聲明的兩個(gè)對(duì)象都是在頁(yè)面執(zhí)行結(jié)束時(shí)失去的引用,也都自動(dòng)調(diào)用了析構(gòu)方法。但因?yàn)閷?duì)象的引用都是放在棧內(nèi)存中的,由于棧的后進(jìn)先出特點(diǎn),最后創(chuàng)建的對(duì)象會(huì)被最先釋放,多以先自動(dòng)調(diào)用第三個(gè)對(duì)象的析構(gòu)方法,最后才調(diào)用第二個(gè)對(duì)象的析構(gòu)方法。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《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ì)有所幫助。

相關(guān)文章

  • php如何調(diào)用webservice應(yīng)用介紹

    php如何調(diào)用webservice應(yīng)用介紹

    Web Service也叫XML Web Service WebService是一種可以接收從Internet或者Intranet上的其它系統(tǒng)中傳遞過(guò)來(lái)的請(qǐng)求,輕量級(jí)通訊技術(shù),接下來(lái)將詳細(xì)介紹php如何調(diào)用webservice,需要的朋友可以了解下
    2012-11-11
  • [PHP]實(shí)用函數(shù)6

    [PHP]實(shí)用函數(shù)6

    [PHP]實(shí)用函數(shù)6...
    2007-11-11
  • PHP實(shí)現(xiàn)多維數(shù)組多字段自定義排序

    PHP實(shí)現(xiàn)多維數(shù)組多字段自定義排序

    這篇文章主要介紹了PHP實(shí)現(xiàn)多維數(shù)組多字段自定義排序,通過(guò)將待排序數(shù)組的各個(gè)數(shù)組的$field保存在一維數(shù)組fieldArr中,在傳入array_multisort中參與排序,相當(dāng)于對(duì)$field一維數(shù)組的排序,而后根據(jù)排序后的key重新構(gòu)建傳入的待排序數(shù)組,需要的朋友可以參考下
    2023-10-10
  • Thinkphp框架中D方法與M方法的區(qū)別

    Thinkphp框架中D方法與M方法的區(qū)別

    本文主要對(duì)ThinkPHP框架中D()和M()方法的區(qū)別進(jìn)行了詳細(xì)的分析介紹。具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧
    2016-12-12
  • PHP在特殊字符前加斜杠的實(shí)現(xiàn)代碼

    PHP在特殊字符前加斜杠的實(shí)現(xiàn)代碼

    PHP在特殊字符前加斜杠的代碼,需要的朋友可以參考下。quotemeta() 函數(shù)在字符串中某些預(yù)定義的字符前添加反斜杠。
    2011-07-07
  • php判斷并刪除空目錄及空子目錄的方法

    php判斷并刪除空目錄及空子目錄的方法

    這篇文章主要介紹了php判斷并刪除空目錄及空子目錄的方法,可實(shí)現(xiàn)遍歷目標(biāo)文件夾判斷是否為空及刪除空目錄的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02
  • php多用戶讀寫(xiě)文件沖突的解決辦法

    php多用戶讀寫(xiě)文件沖突的解決辦法

    解決多調(diào)用同時(shí)寫(xiě)一個(gè)文件時(shí)我們會(huì)使用flock來(lái)解決些問(wèn)題,這樣同一時(shí)間只有一個(gè)用戶可以寫(xiě)文件,同時(shí)其它用戶進(jìn)行等待隊(duì)列了,下面我來(lái)介紹一下flock解決多用戶讀寫(xiě)文件沖空問(wèn)題
    2013-11-11
  • PHP使用gearman進(jìn)行異步的郵件或短信發(fā)送操作詳解

    PHP使用gearman進(jìn)行異步的郵件或短信發(fā)送操作詳解

    這篇文章主要介紹了PHP使用gearman進(jìn)行異步的郵件或短信發(fā)送操作,總結(jié)分析了PHP基于gearman實(shí)現(xiàn)異步的郵件或短信發(fā)送相關(guān)配置、啟動(dòng)與操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • 深入理解用mysql_fetch_row()以數(shù)組的形式返回查詢結(jié)果

    深入理解用mysql_fetch_row()以數(shù)組的形式返回查詢結(jié)果

    本篇文章是對(duì)使用mysql_fetch_row()以數(shù)組的形式返回查詢結(jié)果進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • PHP使用CURL實(shí)現(xiàn)多線程抓取網(wǎng)頁(yè)

    PHP使用CURL實(shí)現(xiàn)多線程抓取網(wǎng)頁(yè)

    PHP 利用 Curl 可以完成各種傳送文件操作,比如模擬瀏覽器發(fā)送GET,POST請(qǐng)求等等,然而因?yàn)閜hp語(yǔ)言本身不支持多線程,所以開(kāi)發(fā)爬蟲(chóng)程序效率并不高,不過(guò)可以用 Curl ,借助Curl 這個(gè)功能實(shí)現(xiàn)并發(fā)多線程的訪問(wèn)多個(gè)url地址以實(shí)現(xiàn)并發(fā)多線程抓取網(wǎng)頁(yè)或者下載文件
    2015-04-04

最新評(píng)論

伊金霍洛旗| 揭西县| 鱼台县| 上虞市| 和田市| 克拉玛依市| 自贡市| 新乡市| 余干县| 开封县| 桂东县| 垣曲县| 绥阳县| 全南县| 闽侯县| 大连市| 红河县| 梁山县| 大理市| 土默特左旗| 资源县| 长治市| 曲靖市| 长宁区| 多伦县| 怀宁县| 昌江| 谷城县| 高碑店市| 信丰县| 会昌县| 屏南县| 宣汉县| 富民县| 平舆县| 盘锦市| 泗阳县| 枝江市| 阿拉善右旗| 桐庐县| 镇坪县|