亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Yii2的深入學習--yii/base/Object類

2019-11-14 14:40:58
字體:
來源:轉載
供稿:網友

之前我們說過 Yii2 中大多數類都繼承自 yii/base/Object,今天就讓我們來看一下這個類。

Object 是一個基礎類,實現了屬性的功能,其基本內容如下:

<?phpnamespace yii/base;use Yii;/** * Object 是一個基礎類,實現了屬性的功能 * Yii最基礎的類,大多數類都繼承了該類 */class Object implements Configurable{    /**     * 獲取靜態方法調用的類名。返回類的名稱,如果不是在類中調用則返回 FALSE。     */    public static function className()    {        ...    }    /**     * Constructor.     */    public function __construct($config = [])    {        ...    }    /**     * 初始化對象     */    public function init()    {    }    /**     * 魔術方法,實現 getter     */    public function __get($name)    {        ...    }    /**     * 魔術方法,實現 setter     */    public function __set($name, $value)    {        ...    }    /**     * 魔術方法,實現 isset,基于 getter 實現,有 getter 方法的屬性才算存在     */    public function __isset($name)    {        ...    }    /**     * 魔術方法,實現 unset,基于 setter 實現,有 setter 方法的屬性才能 unset 掉     */    public function __unset($name)    {        ...    }    /**     * Calls the named method which is not a class method.     */    public function __call($name, $params)    {        ...    }    /**     * 檢查對象或類是否具有 $name 屬性,如果 $checkVars 為 true,則不局限于是否有 getter/setter     */    public function hasproperty($name, $checkVars = true)    {        ...    }    /**     * 檢查對象或類是否能夠獲取 $name 屬性,如果 $checkVars 為 true,則不局限于是否有 getter     */    public function canGetPRoperty($name, $checkVars = true)    {        ...    }    /**     * 檢查對象或類是否能夠設置 $name 屬性,如果 $checkVars 為 true,則不局限于是否有 setter     */    public function canSetProperty($name, $checkVars = true)    {        ...    }    /**     * 檢查對象或類是否具有 $name 方法     */    public function hasMethod($name)    {        ...    }}

如果想看詳細的注釋的話,可以訪問 https://github.com/ReadCode/yii2-2.0.3-annotated/blob/master/framework/base/Object.php

從上面的內容中,我們可以看到 Object 類重寫了 __get 和 __set 方法,下面我們來詳細看下這兩個方法:

    /**     * Returns the value of an object property.     *     * Do not call this method directly as it is a PHP magic method that     * will be implicitly called when executing `$value = $object->property;`.     *     * 魔術方法,實現 getter     *     * @param string $name the property name     * @return mixed the property value     * @throws UnknownPropertyException if the property is not defined     * @throws InvalidCallException if the property is write-only     * @see __set()     */    public function __get($name)    {        $getter = 'get' . $name;        if (method_exists($this, $getter)) {            // 對象存在 $getter 方法,就直接調用            return $this->$getter();        } elseif (method_exists($this, 'set' . $name)) {            // 如果存在 'set' . $name 方法,就認為該屬性是只寫的            throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);        } else {            // 否則認為該屬性不存在            throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);        }    }    /**     * Sets value of an object property.     *     * Do not call this method directly as it is a PHP magic method that     * will be implicitly called when executing `$object->property = $value;`.     *     * 魔術方法,實現 setter     *     * @param string $name the property name or the event name     * @param mixed $value the property value     * @throws UnknownPropertyException if the property is not defined     * @throws InvalidCallException if the property is read-only     * @see __get()     */    public function __set($name, $value)    {        $setter = 'set' . $name;        if (method_exists($this, $setter)) {            // 對象存在 $setter 方法,就直接調用            $this->$setter($value);        } elseif (method_exists($this, 'get' . $name)) {            // 如果存在 'get' . $name 方法,就認為該屬性是只讀的            throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);        } else {            // 否則認為該屬性不存在            throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);        }    }

基于上面的代碼,我們可以看到,如果訪問一個 Object 對象的某個屬性, Yii會調用名為 get屬性名() 的函數。如, SomeObject->Foo , 會自動調用 SomeObject->getFoo()。 如果修改某一屬性,會調用相應的setter函數。 如, SomeObject->Foo $someValue ,會自動調用 SomeObject->setFoo($someValue) 。

以 SomeObject 的 Foo 為例,如果只存在 getFoo() 方法,那它就是只讀的,如果只存在 setFoo() 方法,那它就是只寫的,只有兩個方法都存在的時候才是既可讀又可寫的。

需要注意的一點是只有在讀取和寫入對象的一個不存在的成員變量時, __get() __set() 會被自動調用。 如果 Foo 是一個 public 的屬性就不會經過 __get() 和  __set() 方法了。

所以通常屬性是 private 的,舉個例子如下:

class User extends yii/base/Object{    private $_name;    public function getName()    {        return $this->_name;    }    public function setName($name)    {        $this->_name = trim($name);    }}

我們還可以在 get 和 set 方法中做一些特殊的處理。

除了 __get() __set() 之外, yii/base/Object 還提供了以下方法便于使用屬性:

  • __isset() 用于測試屬性值是否不為 null ,在 isset($object->property) 時被自動調用。 注意該屬性要有相應的 getter。
  • __unset() 用于將屬性值設為 null ,在 unset($object->property) 時被自動調用。 注意該屬性要有相應的 setter。
  • hasProperty() 用于測試是否有某個屬性。即,定義了 getter 或 setter。 如果 hasProperty() 的參數 $checkVars true (默認為true), 那么只要具有同名的成員變量也認為具有該屬性,如前面提到的 public $title 。
  • canGetProperty() 測試一個屬性是否可讀,參數 $checkVars 的意義同上。只要定義了 getter,屬性即可讀。 同時,如果 $checkVars 為 true 。那么只要類定義了成員變量,不管是 public, private 還是 protected, 都認為是可讀。
  • canSetProperty() 測試一個屬性是否可寫,參數 $checkVars 的意義同上。只要定義了 setter,屬性即可寫。 同時,在 $checkVars 為 ture 。那么只要類定義了成員變量,不管是 public, private 還是 protected, 都認為是可寫。

 

對 Yii2 源碼有興趣的同學可以關注項目 yii2-2.0.3-annotated,現在在上面已經添加了不少關于 Yii2 源碼的注釋,之后還會繼續添加~

有興趣的同學也可以參與進來,提交 Yii2 源碼的注釋。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产91精品最新在线播放| 国产成人精品一区| 午夜欧美大片免费观看| 欧美巨乳美女视频| 国产精品成人在线| 欧美大码xxxx| 国产69精品久久久久99| 欧美国产极速在线| 欧美日韩国产成人在线观看| 欧美久久精品一级黑人c片| 黄色精品一区二区| 久久久久久国产精品久久| 久久色在线播放| 色综合91久久精品中文字幕| 久久久精品在线| 国产精品aaa| 91老司机精品视频| 久久精品最新地址| 亚洲国产精品免费| 欧美自拍视频在线| 色老头一区二区三区在线观看| 全球成人中文在线| 日韩av中文在线| 日韩电视剧免费观看网站| 97碰碰碰免费色视频| 91tv亚洲精品香蕉国产一区7ujn| 欧美性生交大片免网| 日韩精品免费在线视频| 欧美亚州一区二区三区| 久久免费少妇高潮久久精品99| 国产精品白嫩美女在线观看| 国产+人+亚洲| 日本中文字幕不卡免费| 欧美性xxxx在线播放| 亚洲香蕉av在线一区二区三区| 国产福利精品av综合导导航| 北条麻妃一区二区三区中文字幕| 中文字幕久热精品视频在线| 欧美孕妇孕交黑巨大网站| 亚洲国产精品系列| 欧美在线免费视频| 国产午夜精品全部视频播放| 91禁国产网站| 亚洲国产欧美久久| 久久99久久久久久久噜噜| 久久精品福利视频| 少妇av一区二区三区| 成人激情视频在线| 欧美午夜久久久| 国产日本欧美在线观看| 久久久久国色av免费观看性色| 亚洲第一av网站| 92版电视剧仙鹤神针在线观看| 懂色av影视一区二区三区| 亚洲一级黄色av| 日韩在线观看你懂的| 国产一区二区在线播放| 日韩中文字幕在线精品| 久久亚洲私人国产精品va| 国产色视频一区| 精品丝袜一区二区三区| 亚洲网站在线观看| 欧美精品久久久久久久久| 欧美一级片在线播放| 疯狂做受xxxx欧美肥白少妇| 97在线视频免费观看| 一区二区三区精品99久久| 亚洲999一在线观看www| 色悠久久久久综合先锋影音下载| 欧美影院在线播放| 2019最新中文字幕| 人妖精品videosex性欧美| 欧美视频中文字幕在线| 精品动漫一区二区三区| 国产ts人妖一区二区三区| 国产一区二区丝袜| 亚洲女性裸体视频| 国产+成+人+亚洲欧洲| 欧美国产中文字幕| 欧美日韩爱爱视频| 日韩视频在线免费观看| 国产97人人超碰caoprom| 日韩精品高清在线| 亚洲精品www久久久久久广东| 亚洲精品国产精品国自产观看浪潮| 久久久999国产| 国产精品久久久久免费a∨大胸| 国产精品视频免费在线| 日韩中文综合网| 亚洲视频欧洲视频| 欧美综合国产精品久久丁香| 国产精品久久久久高潮| 欧美成人午夜视频| 日韩精品在线免费观看| 亚洲色图在线观看| 午夜精品蜜臀一区二区三区免费| 国产精品视频公开费视频| 欧美一级淫片aaaaaaa视频| 最近2019中文字幕大全第二页| 亚洲精品一区av在线播放| 精品国产欧美一区二区三区成人| 欧美激情欧美狂野欧美精品| 亚洲аv电影天堂网| 欧美日韩精品在线播放| 动漫精品一区二区| 日韩精品在线播放| 最新国产精品拍自在线播放| 欧美性猛交xxxx乱大交| 日韩在线国产精品| 日韩av不卡在线| 亚洲欧美资源在线| 欧美巨乳在线观看| 久久男人av资源网站| 亚洲第一区中文字幕| 国产精品扒开腿爽爽爽视频| 久久五月天色综合| 久久久久国色av免费观看性色| 91色琪琪电影亚洲精品久久| 俺也去精品视频在线观看| 国产成人精彩在线视频九色| 欧美视频中文在线看| 日韩av在线免费看| 日韩av电影免费观看高清| 亚洲第一色在线| 亚洲成人av片在线观看| 久久综合色影院| 亚洲欧美日韩精品久久亚洲区| 久久久国产精品视频| 欧美中文字幕在线播放| 欧美专区福利在线| 久久精品亚洲国产| 久久6免费高清热精品| 6080yy精品一区二区三区| 国产精品极品美女在线观看免费| 国产一区视频在线| 欧美日韩国产精品一区| 欧美怡春院一区二区三区| 国产精品一二三在线| 久久久久国色av免费观看性色| 日韩美女在线播放| 日本精品久久久久久久| 91久久在线视频| 国产丝袜一区视频在线观看| 国产精品网站视频| 91sao在线观看国产| 91av在线播放视频| 91精品久久久久久久久不口人| 国产精品免费一区豆花| 国产精品久久久久国产a级| 91久久精品日日躁夜夜躁国产| 亚洲综合日韩中文字幕v在线| 日韩黄色高清视频| 久久人人爽国产| 久久久久久噜噜噜久久久精品| 在线观看视频99| 亚洲福利视频专区| 欧美激情小视频| 国产成人中文字幕| 久久激情视频免费观看| 欧美激情亚洲另类| 国产精品自产拍高潮在线观看| 欧美有码在线观看视频| 91精品国产成人www| 国内精品模特av私拍在线观看|