您好,登錄后才能下訂單哦!
這篇“php構(gòu)造函數(shù)怎么使用”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“php構(gòu)造函數(shù)怎么使用”文章吧。
php中有構(gòu)造函數(shù),其語法說明是“__construct(mixed ...$values = ""): void”,具有構(gòu)造函數(shù)的類會在每次創(chuàng)建新對象時先調(diào)用此方法,所以非常適合在使用對象之前做一些初始化工作。
本文操作環(huán)境:Windows7系統(tǒng)、PHP7.1版、DELL G3電腦
php中有沒有構(gòu)造函數(shù)?
php 構(gòu)造函數(shù)
__construct(mixed ...$values = ""): void
PHP 允許開發(fā)者在一個類中定義一個方法作為構(gòu)造函數(shù)。具有構(gòu)造函數(shù)的類會在每次創(chuàng)建新對象時先調(diào)用此方法,所以非常適合在使用對象之前做一些初始化工作。
注意: 如果子類中定義了構(gòu)造函數(shù)則不會隱式調(diào)用其父類的構(gòu)造函數(shù)。要執(zhí)行父類的構(gòu)造函數(shù),需要在子類的構(gòu)造函數(shù)中調(diào)用 parent::__construct()。如果子類沒有定義構(gòu)造函數(shù)則會如同一個普通的類方法一樣從父類繼承(假如沒有被定義為 private 的話)。
示例 #1 繼承中的構(gòu)造函數(shù)
<?php class BaseClass { function __construct() { print "In BaseClass constructor\n"; } } class SubClass extends BaseClass { function __construct() { parent::__construct(); print "In SubClass constructor\n"; } } class OtherSubClass extends BaseClass { // 繼承 BaseClass 的構(gòu)造函數(shù) } // In BaseClass constructor $obj = new BaseClass(); // In BaseClass constructor // In SubClass constructor $obj = new SubClass(); // In BaseClass constructor $obj = new OtherSubClass(); ?>
與其它方法不同, __construct() 在繼承時不受簽名兼容性規(guī)則的約束。
自 PHP 5.3.3 起,在命名空間中,與類名同名的方法不再作為構(gòu)造函數(shù)。不使用命名空間中的類則不受影響。 構(gòu)造函數(shù)是一個普通的方法,在對應(yīng)對象實例化時自動被調(diào)用。 因此可以定義任何數(shù)量的參數(shù),可以是必選、可以有類型、可以有默認(rèn)值。 構(gòu)造器的參數(shù)放在類名后的括號里調(diào)用。
示例 #2 使用構(gòu)造器參數(shù)
<?php class Point { protected int $x; protected int $y; public function __construct(int $x, int $y = 0) { $this->x = $x; $this->y = $y; } } // 兩個參數(shù)都傳入 $p1 = new Point(4, 5); // 僅傳入必填的參數(shù)。 $y 會默認(rèn)取值 0。 $p2 = new Point(4); // 使用命名參數(shù)(PHP 8.0 起): $p3 = new Point(y: 5, x: 4); ?>
如果一個類沒有構(gòu)造函數(shù),以及構(gòu)造函數(shù)的參數(shù)不是必填項時,括號就可以省略。
舊式風(fēng)格的構(gòu)造器
PHP 8.0.0 之前,全局命名空間內(nèi)的類如果有一個同名的方法,則會解析為舊式風(fēng)格的構(gòu)造器。 雖然函數(shù)能被當(dāng)作構(gòu)造器,但該語法已被廢棄,并會導(dǎo)致 E_DEPRECATED 錯誤。 如果 __construct() 和同名方法同時存在時, 會調(diào)用 __construct()。
以下兩種情況時,與類同名的方法不再有特殊意義:命名空間中的類、PHP 8.0.0 起的任何類。
新代碼中要使用 __construct()。
構(gòu)造器屬性提升
PHP 8.0.0 起,構(gòu)造器的參數(shù)也可以相應(yīng)提升為類的屬性。 構(gòu)造器的參數(shù)賦值給類屬性的行為很普遍,否則無法操作。 而構(gòu)造器提升的功能則為這種場景提供了便利。 因此上面的例子可以用以下方式重寫:
示例 #3 使用構(gòu)造器屬性提升
<?php class Point { public function __construct(protected int $x, protected int $y = 0) { } }
當(dāng)構(gòu)造器參數(shù)帶訪問控制(visibility modifier)時,PHP 會同時把它當(dāng)作對象屬性和構(gòu)造器參數(shù), 并賦值到屬性。 構(gòu)造器可以是空的,或者包含其他語句。 參數(shù)值賦值到相應(yīng)屬性后執(zhí)行正文中額外的代碼語句。
并非所有參數(shù)都需要提升??梢曰旌咸嵘虿惶嵘齾?shù)作為屬性,也不需要按順序。 提升后的參數(shù)不影響構(gòu)造器內(nèi)代碼調(diào)用。
注意:
對象屬性的類型不能為 callable 以避免為引擎帶來混淆。 因此提升的參數(shù)也不能是 callable。 其他任意 類型聲明 是允許的。
注意:
放在構(gòu)造器提升參數(shù)里的屬性會同時復(fù)制為屬性和參數(shù)。
Static 創(chuàng)造方法
在 PHP 中每個 class 只能有一個構(gòu)造器。 然而有些情況下,需要用不同的輸入實現(xiàn)不同的方式構(gòu)造對象。 這種情況下推薦使用 static 方法包裝構(gòu)造。
示例 #4 使用 static 創(chuàng)造方法
<?php class Product { private ?int $id; private ?string $name; private function __construct(?int $id = null, ?string $name = null) { $this->id = $id; $this->name = $name; } public static function fromBasicData(int $id, string $name): static { $new = new static($id, $name); return $new; } public static function fromJson(string $json): static { $data = json_decode($json); return new static($data['id'], $data['name']); } public static function fromXml(string $xml): static { // 自定義代碼邏輯。 $data = convert_xml_to_array($xml); $new = new static(); $new->id = $data['id']; $new->name = $data['name']; return $new; } } $p1 = Product::fromBasicData(5, 'Widget'); $p2 = Product::fromJson($some_json_string); $p3 = Product::fromXml($some_xml_string);
可以設(shè)置構(gòu)造器為 private 或 protected,防止自行額外調(diào)用。 這時只有 static 方法可以實例化一個類。 由于它們位于同一個定義的 class 因此可以訪問私有方法,也不需要在同一個對象實例中。 當(dāng)然構(gòu)造器不一定要設(shè)置為 private,是否合理取決于實際情況。
三個 static 方法展示了對象以不同方式的實例化方式。
fromBasicData() 把所需的全部參數(shù)傳入構(gòu)造器,創(chuàng)建對象并返回結(jié)果。
fromJson() 接受 JSON 字符串,,預(yù)處理成構(gòu)造器所需的格式,然后返回新的對象。
fromXml() 接受 XML 字符串并解析,然后創(chuàng)建一個單純的對象。 由于參數(shù)都是可選的,使得可以忽略所有參數(shù)去調(diào)用構(gòu)造器。然后為對象的屬性賦值后返回結(jié)果。
在以上三個例子中,static 關(guān)鍵詞會被翻譯成代碼所在類的類名。 這個例子中是 Product。
以上就是關(guān)于“php構(gòu)造函數(shù)怎么使用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。