摘要:屬性在里,類的成員變量也被稱之為屬性,這些變量是類定義的一部分,被用來表示類實(shí)例的狀態(tài)區(qū)分不同類實(shí)例。不同之處在于,當(dāng)屬性被讀時,關(guān)聯(lián)的方法被調(diào)用,當(dāng)屬性被修改時,關(guān)聯(lián)的方法被調(diào)用。
屬性
在PHP里,類的成員變量也被稱之為屬性,這些變量是類定義的一部分,被用來表示類實(shí)例的狀態(tài)(區(qū)分不同類實(shí)例)。在具體的實(shí)踐中,你可能要經(jīng)常處理可讀或者可寫屬性的特殊方式,舉個例子, 你可能想要給屬性$label賦值一個字符串,但是這個字符串必須使用trim函數(shù)過濾開頭結(jié)尾的空格,為了完成這個特殊處理你可能需要使用如下代碼
$object->label = trim($label);
上述代碼的缺點(diǎn)是,凡是在給label屬性賦值的時候,你都必須使用trim函數(shù)去處理。假設(shè)在以后label屬性的首字母必須大寫,那么凡是給label屬性賦值的代碼,就必須被修改。你應(yīng)該盡可能的避免這種代碼重復(fù)。
為了解決這個問題,yii引入了一個基礎(chǔ)類[yiiaseObject],此類可以基于類的getter和setter方法來定義類屬性。如果一個類需要以這種方式定義屬性,繼承[yiiaseObject]或者[yiiaseObject]的子類
提示:幾乎所有yii2框架的核心類都繼承了[yiiaseObject]類或者它的子類,這意味著核心類的getter或者setter方法你都可以以屬性的方式使用
getter方法一get為前綴;setter方法以set為前綴,get或者set后面跟隨屬性的名稱。舉個例子,getLabel()和setLabel()定義了label屬性,實(shí)現(xiàn)代碼如下
namespace appcomponents; use yiiaseObject; class Foo extend Object { private $_label; public function getLabel() { return $this->_label; } public function setLabel($value) { $this->_label = trim($value); } }
(需要指出的是,getter和setter方法創(chuàng)建了一個label屬性,在上述代碼中實(shí)際上關(guān)聯(lián)的是私有屬性$_label)
有g(shù)etter和setter方法定義的屬性,可以被當(dāng)作類的屬性(成員變量)直接使用。不同之處在于,當(dāng)屬性被讀時,關(guān)聯(lián)的getter方法被調(diào)用,當(dāng)屬性被修改時,關(guān)聯(lián)的setter方法被調(diào)用。例如:
// 等價于 $label = $object->getLabel(); $label = $object->label; // 等價于 $object->setLabel("abc"); $object->label = "abc";
一個由getter方法定義的屬性,如果沒有setter方法,那么此屬性只讀,嘗試給該屬性賦值的行為都會拋出一個[[yiiaseInvalidCallException|InvalidCallException]]異常。同樣,假設(shè)定義了setter方法的屬性沒有g(shù)etter方法,此屬性只寫,嘗試讀取只寫屬性的值也會拋出一個異常,只寫屬性不常見。
通過getter,setter方法定義的屬性有幾個特殊的規(guī)則和限制
此類屬性大小寫不敏感。比如:$object->label 和 $object->Label 是相同的,
使用getter,setter定義的屬性如果在類中同時擁有同名的成員變量,同名的成員變量將會被優(yōu)先使用。比如: Foo類有一個成員變量label,$foo->label = "test" 將會直接給label賦值,而不會調(diào)用setLabel()方法
此類屬性不支持可見度。即無論屬性的getter或者setter方法定義為public,protected,private,都沒有區(qū)別
此類屬性只能有非靜態(tài)的getter,setter方法來定義,靜態(tài)方法不會以相同的方式來處理
回到開頭的問題,假設(shè)需要給label屬性賦值,且要對值處理,替代在所有賦值代碼處處理,而是在setter方法里處理所要賦予屬性的值,當(dāng)有任何新的需求或者規(guī)則施加在屬性上時,只需要修改getter或者setter方法。修改一處,所以地方都生效。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/20763.html
摘要:可以在方法里實(shí)現(xiàn)例行檢查和屬性正常化檢查對象方法調(diào)用開始的三個階段都在構(gòu)造函數(shù)里實(shí)現(xiàn),這意味著當(dāng)你得到一個對象的實(shí)例時,它已經(jīng)被初始化為適當(dāng)?shù)臓顟B(tài),可以被放心的使用。 組件 組件是YII框架application(應(yīng)用)的主要組成部分,它是 [yiiaseComponent]的實(shí)例或者子類。組件有三個重要特征(功能): 屬性(properties) 事件(events) 行為(...
摘要:運(yùn)行來安裝指定的擴(kuò)展。這更便于用戶辨別是否是的擴(kuò)展。當(dāng)用戶運(yùn)行安裝一個擴(kuò)展時,文件會被自動更新使之包含新擴(kuò)展的信息。上述代碼表明該擴(kuò)展依賴于包。例如,上述的條目聲明將對應(yīng)于別名。為達(dá)到這個目的,你應(yīng)當(dāng)在公開發(fā)布前做測試。 簡述 擴(kuò)展是專門設(shè)計(jì)的在 Yii 應(yīng)用中隨時可拿來使用的, 并可重發(fā)布的軟件包。 基礎(chǔ) 例如, yiisoft/yii2-debug 擴(kuò)展在你的應(yīng)用的每個頁面底部添加...
摘要:上次的訪談,介紹了下可愛的依云醬,回憶傳送門。這里簡單地介紹下龍女仆,全名小林家的龍女仆,為什么介紹這部劇呢因?yàn)樵O(shè)計(jì)獅顏值同學(xué)也安利了這部。劇情簡介在獨(dú)身又勞累的小林劃重點(diǎn)一名程序員身邊突然出現(xiàn)的穿著女仆服裝的美少女托爾。 showImg(https://segmentfault.com/img/bVR6p5?w=900&h=385); 上次的訪談,介紹了下可愛的依云醬,回憶傳送門。不...
摘要:上次的訪談,介紹了下可愛的依云醬,回憶傳送門。這里簡單地介紹下龍女仆,全名小林家的龍女仆,為什么介紹這部劇呢因?yàn)樵O(shè)計(jì)獅顏值同學(xué)也安利了這部。劇情簡介在獨(dú)身又勞累的小林劃重點(diǎn)一名程序員身邊突然出現(xiàn)的穿著女仆服裝的美少女托爾。 showImg(https://segmentfault.com/img/bVR6p5?w=900&h=385); 上次的訪談,介紹了下可愛的依云醬,回憶傳送門。不...
摘要:之速率限制什么是速率限制權(quán)威指南翻譯過來為限流,為防止濫用,你應(yīng)該考慮對您的限流。如果在規(guī)定的時間內(nèi)接收了一個用戶大量的請求,將返回響應(yīng)狀態(tài)代碼這意味著過多的請求。 Yii2.0 RESTful API 之速率限制 什么是速率限制? 權(quán)威指南翻譯過來為限流,為防止濫用,你應(yīng)該考慮對您的 API 限流。 例如,您可以限制每個用戶 10 分鐘內(nèi)最多調(diào)用 API 100 次。 如果在規(guī)定的時...
閱讀 2302·2021-09-30 09:47
閱讀 2219·2021-09-26 09:55
閱讀 2948·2021-09-24 10:27
閱讀 1539·2019-08-27 10:54
閱讀 967·2019-08-26 13:40
閱讀 2495·2019-08-26 13:24
閱讀 2419·2019-08-26 13:22
閱讀 1728·2019-08-23 18:38