PHP中,final關(guān)鍵字可以用來修飾類、方法和屬性。當(dāng)一個(gè)類被final修飾時(shí),該類就不能被繼承;當(dāng)一個(gè)方法被final修飾時(shí),該方法就不能被重寫;當(dāng)一個(gè)屬性被final修飾時(shí),該屬性的值就不能被更改。在本文中,我們將重點(diǎn)討論final屬性的用法和注意事項(xiàng)。
作為一個(gè)常量,final屬性在定義時(shí)必須賦初始值。定義一個(gè)final屬性的語法如下所示:
class Person { final public $name = '張三'; }在上述代碼中,$name屬性被final修飾,其值為'張三'。一旦定義后,該屬性的值就不能被更改。例如:
$obj = new Person(); $obj->name = '李四'; // 報(bào)錯(cuò):Can't modify final property 'Person::$name'上述代碼中,$name屬性的值不能被更改,所以$obj->name = '李四';語句會(huì)報(bào)錯(cuò)。 需要注意的是,final屬性只能在構(gòu)造函數(shù)內(nèi)進(jìn)行初始化,不能在對(duì)象的方法中賦值。例如:
class Person { final public $name; public function __construct($name) { $this->name = $name; } public function setName($newName) { $this->name = $newName; // 報(bào)錯(cuò):Cannot assign to final property (Person::$name) } }在上述代碼中,$name屬性被final修飾,其值不能在setName()方法中重新賦值。如果強(qiáng)制賦值會(huì)導(dǎo)致報(bào)錯(cuò),因?yàn)椴荒苄薷膄inal屬性的值。 需要注意的是,final屬性的值可以是復(fù)雜的表達(dá)式。例如:
class Math { const PI = 3.14159; final public $circleArea = self::PI * $this->radius; public function __construct($radius) { $this->radius = $radius; } }在上述代碼中,$circleArea屬性的值為self::PI * $this->radius,其中self::PI表示類常量,$this->radius表示對(duì)象屬性。這種語法的好處是可以根據(jù)不同的對(duì)象來計(jì)算final屬性的值。 需要注意的是,final屬性只能在類內(nèi)部賦值,并且不能被子類繼承。例如:
final class Person { final public $name = '張三'; } class Man extends Person { public function __construct() { parent::__construct(); $this->name = '李四'; // 報(bào)錯(cuò):Cannot override final property (Person::$name) } }在上述代碼中,$name屬性被final修飾,在子類中不能被繼承,也不能被重寫。如果強(qiáng)制賦值會(huì)導(dǎo)致報(bào)錯(cuò)。 總之,final屬性是一種常量屬性,其值在定義時(shí)必須賦初始值,且不能在對(duì)象的方法中重新賦值。定義final屬性的好處是可以限定屬性的取值范圍,避免屬性值被篡改。需要注意的是,final屬性只能在類內(nèi)部賦值,并且不能被子類繼承。