亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

directory search
閱讀前篇 簡介 Yii 是什么 從 Yii 1.1 升級 入門 安裝 Yii 運(yùn)行應(yīng)用 第一次問候 使用Forms 數(shù)據(jù)庫應(yīng)用 使用 Gii 生成代碼 進(jìn)階 應(yīng)用結(jié)構(gòu) 概述 入口腳本 應(yīng)用(Applications) 應(yīng)用組件(Application Components) 控制器(Controllers) 模型(Models) 視圖(views) 模塊(Modules) 過濾器(Filters) 小部件(Widgets) 前端資源(Assets) 擴(kuò)展(Extensions) 請求處理 運(yùn)行概述 啟動引導(dǎo)(Bootstrapping) 路由和創(chuàng)建URL 請求(Requests) 響應(yīng)(Responses) Sessions 和 Cookies 錯誤處理(Handling Errors) 日志(Logging) 關(guān)鍵概念 組件(Component) 屬性(Property) 事件(Events) 行為(Behaviors) 配置(Configurations) 別名(Aliases) 類自動加載(Autoloading) 服務(wù)定位器(Service Locator) 依賴注入容器(Dependency Injection Container) 配合數(shù)據(jù)庫工作 數(shù)據(jù)庫訪問 (Data Access Objects) 查詢生成器(Query Builder) 活動記錄(Active Record) 數(shù)據(jù)庫遷移(Migrations) Sphinx Redis MongoDB Elasticsearch 接收用戶數(shù)據(jù) 創(chuàng)建表單(Creating Forms) 輸入驗證(Validating Input) 文件上傳(Uploading Files) 收集列表輸入(Collecting Tabular Input) 多模型的復(fù)合表單(Getting Data for Multiple Models) 顯示數(shù)據(jù) 格式化輸出數(shù)據(jù)(Data Formatting) 分頁(Pagination) 排序(Sorting) 數(shù)據(jù)提供器(Data Providers) 數(shù)據(jù)小部件(Data Widgets) 客戶端腳本使用(Working with Client Scripts) 主題(Theming) 安全 認(rèn)證(Authentication) 授權(quán)(Authorization) 處理密碼(Working with Passwords) 客戶端認(rèn)證(Auth Clients) 最佳安全實踐(Best Practices) 緩存 概述 數(shù)據(jù)緩存 片段緩存 頁面緩存 HTTP 緩存 RESTfull Web服務(wù) 快速入門(Quick Start) 資源(Resources) 控制器(Controllers) 路由(Routing) 格式化響應(yīng)(Response Formatting) 授權(quán)認(rèn)證(Authentication) 速率限制(Rate Limiting) 版本(Versioning) 錯誤處理(Error Handling) 開發(fā)工具 調(diào)試工具欄和調(diào)試器 使用Gii生成代碼 生成API文檔 測試 概述(Overview) 配置測試環(huán)境(Testing environment setup) 單元測試(Unit Tests) 功能測試(Function Tests) 驗收測試(Acceptance Tests) 測試夾具(Fixtures) 高級專題 高級應(yīng)用模板 創(chuàng)建自定義應(yīng)用程序結(jié)構(gòu) 控制臺命令 核心驗證器(Core Validators) 國際化 收發(fā)郵件 性能優(yōu)化 共享主機(jī)環(huán)境 模板引擎 集成第三方代碼 小部件 Bootstrap 小部件 Jquery UI 助手類 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
characters

屬性(Property)

屬性(Property)

在 PHP 中,類的成員變量也被稱為屬性(properties)。它們是類定義的一部分,用來表現(xiàn)一個實例的狀態(tài)(也就是區(qū)分類的不同實例)。在具體實踐中,常常會想用一個稍微特殊些的方法實現(xiàn)屬性的讀寫。例如,如果有需求每次都要對?label?屬性執(zhí)行 trim 操作,就可以用以下代碼實現(xiàn):

$object->label = trim($label);

上述代碼的缺點是只要修改?label?屬性就必須再次調(diào)用?trim()?函數(shù)。若將來需要用其它方式處理?label?屬性,比如首字母大寫,就不得不修改所有給?label?屬性賦值的代碼。這種代碼的重復(fù)會導(dǎo)致 bug,這種實踐顯然需要盡可能避免。

為解決該問題,Yii 引入了一個名為 yii\base\Object 的基類,它支持基于類內(nèi)的?getter?和?setter(讀取器和設(shè)定器)方法來定義屬性。如果某類需要支持這個特性,只需要繼承 yii\base\Object 或其子類即可。

補(bǔ)充:幾乎每個 Yii 框架的核心類都繼承自 yii\base\Object 或其子類。這意味著只要在核心類中見到 getter 或 setter 方法,就可以像調(diào)用屬性一樣調(diào)用它。

getter 方法是名稱以?get?開頭的方法,而 setter 方法名以?set?開頭。方法名中?get?或?set?后面的部分就定義了該屬性的名字。如下面代碼所示,getter 方法?getLabel()?和 setter 方法?setLabel()?操作的是?label?屬性,:

namespace app\components;

use yii\base\Object;

class Foo extend Object{
    private $_label;

    public function getLabel()
    {
        return $this->_label;
    }

    public function setLabel($value)
    {
        $this->_label = trim($value);
    }
}

(詳細(xì)解釋:getter 和 setter 方法創(chuàng)建了一個名為?label?的屬性,在這個例子里,它指向一個私有的內(nèi)部屬性?_label。)

getter/setter 定義的屬性用法與類成員變量一樣。兩者主要的區(qū)別是:當(dāng)這種屬性被讀取時,對應(yīng)的 getter 方法將被調(diào)用;而當(dāng)屬性被賦值時,對應(yīng)的 setter 方法就調(diào)用。如:

// 等效于 $label = $object->getLabel();$label = $object->label;

// 等效于 $object->setLabel('abc');$object->label = 'abc';

只定義了 getter 沒有 setter 的屬性是只讀屬性。嘗試賦值給這樣的屬性將導(dǎo)致 yii\base\InvalidCallException (無效調(diào)用)異常。類似的,只有 setter 方法而沒有 getter 方法定義的屬性是只寫屬性,嘗試讀取這種屬性也會觸發(fā)異常。使用只寫屬性的情況幾乎沒有。

通過 getter 和 setter 定義的屬性也有一些特殊規(guī)則和限制:

  • 這類屬性的名字是不區(qū)分大小寫的。如,$object->label?和?$object->Label?是同一個屬性。因為 PHP 方法名是不區(qū)分大小寫的。
  • 如果此類屬性名和類成員變量相同,以后者為準(zhǔn)。例如,假設(shè)以上?Foo?類有個?label?成員變量,然后給?$object->label = 'abc'?賦值,將賦給成員變量而不是 setter?setLabel()?方法。
  • 這類屬性不支持可見性(訪問限制)。定義屬性的 getter 和 setter 方法是 public、protected 還是 private 對屬性的可見性沒有任何影響。
  • 這類屬性的 getter 和 setter 方法只能定義為非靜態(tài)的,若定義為靜態(tài)方法(static)則不會以相同方式處理。
回到開頭提到的問題,與其處處要調(diào)用?trim()?函數(shù),現(xiàn)在我們只需在 setter?setLabel()?方法內(nèi)調(diào)用一次。如果 label 首字母變成大寫的新要求來了,我們只需要修改setLabel()?方法,而無須接觸任何其它代碼。
Previous article: Next article: