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

首頁 > 編程 > PHP > 正文

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

2020-03-22 20:05:31
字體:
來源:轉載
供稿:網友
  • 之前我們說過Yii2 中大多數類都繼承自 yiiaseObject,今天就讓我們來看一下這個類。

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

    <?phpnamespace yiiase;use Yii;/** * Object 是一個基礎類,實現了屬性的功能 * Yii最基礎的類,大多數類都繼承了該類 */html' target='_blank'>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 yiiaseObject{    private $_name;    public function getName()    {        return $this->_name;    }    public function setName($name)    {        $this->_name = trim($name);    }}

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

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

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

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

      PHP編程

      鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    亚洲国产欧美一区二区三区久久| 亚洲人成在线观看| 国产成人在线播放| 成人高清视频观看www| 国产精品吹潮在线观看| 日韩专区在线观看| 欧美成人四级hd版| 亚洲成人av中文字幕| 亚洲图片欧美日产| 久久久久国产精品免费网站| 欧美丝袜一区二区| 欧美日韩国产丝袜美女| 国产视频在线一区二区| 国产裸体写真av一区二区| 81精品国产乱码久久久久久| 欧美中在线观看| 国产精品va在线播放| 欧美电影免费观看网站| 日韩国产在线播放| 欧洲亚洲在线视频| 日韩免费在线免费观看| 欧美xxxx14xxxxx性爽| 欧美性xxxx| 91免费精品国偷自产在线| 国产成人精品视频| 欧美日韩在线视频一区| 日韩电影免费观看在线| 国产精品色婷婷视频| 91av国产在线| 高清在线视频日韩欧美| 亚洲精品电影在线| 欧美日本亚洲视频| 亚洲国产精品久久久久久| 中文一区二区视频| 韩国欧美亚洲国产| 亚洲精品国产精品国自产观看浪潮| 丝袜亚洲另类欧美重口| 亚洲а∨天堂久久精品9966| 中文字幕久热精品视频在线| 亚洲国产一区自拍| 亚洲国产高清自拍| 一区二区中文字幕| 国产精品入口日韩视频大尺度| 中文字幕欧美日韩在线| 精品视频偷偷看在线观看| 伊人精品在线观看| 日韩国产一区三区| 久久这里只有精品视频首页| 精品国内产的精品视频在线观看| 久久久久久九九九| 欧美激情国产精品| 91高清在线免费观看| 色综合久久天天综线观看| 精品视频在线播放免| 亚洲精品美女在线观看| 亚洲国产精品大全| 久久久久久久久久国产精品| 亚洲欧洲一区二区三区久久| 97国产真实伦对白精彩视频8| 91sao在线观看国产| 日韩精品中文在线观看| 色综合久久中文字幕综合网小说| 尤物tv国产一区| 亚洲护士老师的毛茸茸最新章节| 国产精品一区二区三| 国产欧美在线观看| 国产日韩欧美视频| 日韩中文字幕免费视频| 2019最新中文字幕| 伊人亚洲福利一区二区三区| 精品国产一区二区三区久久久狼| 亚洲精品免费在线视频| 97视频网站入口| 中文日韩在线观看| 午夜精品福利视频| 国产中文欧美精品| 国产亚洲精品久久久优势| 亚洲国产一区二区三区在线观看| 主播福利视频一区| 欧美猛交ⅹxxx乱大交视频| 久久久久久成人精品| 欧美又大又粗又长| 欧美成人免费网| 亚洲剧情一区二区| 午夜精品久久久久久99热软件| 成人国内精品久久久久一区| 中文字幕免费精品一区| 在线成人激情黄色| 亚洲mm色国产网站| 亚洲精品欧美日韩专区| 国精产品一区一区三区有限在线| 亚洲人成电影网| 91九色单男在线观看| 亚洲精品国产精品国产自| 韩曰欧美视频免费观看| 亚洲人成自拍网站| 久久噜噜噜精品国产亚洲综合| 国产精品美女免费看| 欧美午夜精品久久久久久人妖| 国产成人综合久久| 欧美激情网站在线观看| 亚洲黄色av女优在线观看| 曰本色欧美视频在线| 在线视频免费一区二区| 欧美性猛交xxxx黑人猛交| 欧美电影在线观看高清| 97在线观看免费高清| 亚洲香蕉伊综合在人在线视看| 午夜精品久久久久久久99黑人| 欧美亚洲成人xxx| 精品国产福利在线| 亚洲色图偷窥自拍| 亚洲国产成人在线播放| 国产精自产拍久久久久久蜜| 国产视频亚洲视频| 久久影视电视剧免费网站清宫辞电视| 亚洲自拍另类欧美丝袜| 国产视频精品自拍| 日韩激情片免费| 精品亚洲一区二区| 国产精品444| 日韩在线精品视频| 欧美亚洲第一区| 日韩激情视频在线| 亚洲国产婷婷香蕉久久久久久| 久久人人爽人人| 国产精品久久999| 美女久久久久久久| 午夜欧美大片免费观看| xxxx性欧美| 国产午夜精品理论片a级探花| 久久国产精品网站| 国产91在线高潮白浆在线观看| 久久夜精品va视频免费观看| 色综合老司机第九色激情| 亚洲人成在线观看网站高清| 欧美激情第99页| 国产视频精品va久久久久久| 国产精品白嫩初高中害羞小美女| 亚洲欧洲在线播放| 久久成年人免费电影| 亚洲成人久久一区| 日韩不卡中文字幕| 国产精品入口尤物| 欧美精品福利视频| 一区二区三区黄色| 久久精品视频亚洲| 久久天堂电影网| 色妞色视频一区二区三区四区| 欧美色播在线播放| 亚洲高清av在线| 中文日韩在线观看| 久久在线视频在线| 91免费看国产| 久久国产精品99国产精| 成人黄色在线播放| 欧美极品少妇xxxxⅹ喷水| 欧美性猛xxx| 中文国产亚洲喷潮| 亚洲无av在线中文字幕| 97在线视频国产| 色久欧美在线视频观看| 成人在线视频网站| 久久天天躁狠狠躁老女人|