PHP物件導向-建構方法和析構方法的程式碼案例分享
建構方法和析構方法是物件中的兩個特殊方法,它們都與物件的生命週期有關。建構方法是物件建立完成後第一個被物件自動呼叫的方法,這也是我們在物件中使用建構方法的原因。而析構方法是物件在銷毀之前最後一個被物件自動呼叫的方法,這也是我們在物件中使用析構方法的原因。所以通常使用建構方法完成一些物件的初始化工作,使用析構方法完成一些物件在銷毀之前的清理工作#。
1.建構方法
在每個宣告的類別中都有一個嗆稱為建構方法的特殊成員方法,如果沒有明確的聲明它,類別中都會預設存在一個沒有參數列表並且內容為空的建構方法。如果明確的聲明它,則類別中的預設建構方法將不會存在。當建立物件時,建構方法就會被自動呼叫一次,也就是每次使用關鍵字new來實例化物件時都會自動呼叫建構方法,不能主動透過物件的參考呼叫建構方法。所以通常使用構造方法來執行一些有用的初始化任務,例如對成員屬性在創建物件時賦初值等。
在PHP5先前的版本中,建構方法的方法名稱必須與類別名稱相同,這種方式在PHP 5中任然可以使用。但在PHP中很少宣告和類別名稱同名的建構方法了,這樣做的好處是可以使建構子獨立於類別名,當類別名稱改變時不需要改變對應的建構子名稱。為了向下相容,在建立物件時,如果一個類別中沒有名為construct()的建構方法,PHP將搜尋與類別名稱相同名的建構方法執行。在類別中宣告建構方法的格式如下:
function construct( [参数列表] ){ //构造方法名称是以两个下划线开始的 //方法体,通常用来对成员属性进行初始化赋值}
在PHP中,同一個類別中只能宣告一個建構方法。原因是建構方法名稱是固定的,在PHP中不能宣告同名的兩個函數,所以也就沒有建構方法重載。但可以在宣告建構方法時使用預設參數,實作其他物件導向的程式語言中建構方法重載的功能。這樣在建立物件時,如果在建構方法中沒有傳入參數,則使用預設參數為成員屬性進行初始化。
建構子可以接受參數,能夠在建立物件時賦值給物件屬性
建構子可以呼叫類別方法或其他函數
建構子可以呼叫其他類別的建構子
建構子使用範例:
<?phpclass 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中析构方法并不是很常用,它属于类中可选的一部分,只有需要时才在类中声明。
<?phpclass 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物件導向-建構方法和析構方法的程式碼案例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。
