国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

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

2019-11-14 14:40:58
字體:
來源:轉載
供稿:網(wǎng)友

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

Object 是一個基礎類,實現(xiàn)了屬性的功能,其基本內(nèi)容如下:

<?phpnamespace yii/base;use Yii;/** * Object 是一個基礎類,實現(xiàn)了屬性的功能 * Yii最基礎的類,大多數(shù)類都繼承了該類 */class Object implements Configurable{    /**     * 獲取靜態(tài)方法調(diào)用的類名。返回類的名稱,如果不是在類中調(diào)用則返回 FALSE。     */    public static function className()    {        ...    }    /**     * Constructor.     */    public function __construct($config = [])    {        ...    }    /**     * 初始化對象     */    public function init()    {    }    /**     * 魔術方法,實現(xiàn) getter     */    public function __get($name)    {        ...    }    /**     * 魔術方法,實現(xiàn) setter     */    public function __set($name, $value)    {        ...    }    /**     * 魔術方法,實現(xiàn) isset,基于 getter 實現(xiàn),有 getter 方法的屬性才算存在     */    public function __isset($name)    {        ...    }    /**     * 魔術方法,實現(xiàn) unset,基于 setter 實現(xiàn),有 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

從上面的內(nèi)容中,我們可以看到 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;`.     *     * 魔術方法,實現(xiàn) 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 方法,就直接調(diào)用            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;`.     *     * 魔術方法,實現(xiàn) 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 方法,就直接調(diào)用            $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會調(diào)用名為 get屬性名() 的函數(shù)。如, SomeObject->Foo , 會自動調(diào)用 SomeObject->getFoo()。 如果修改某一屬性,會調(diào)用相應的setter函數(shù)。 如, SomeObject->Foo $someValue ,會自動調(diào)用 SomeObject->setFoo($someValue) 。

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

需要注意的一點是只有在讀取和寫入對象的一個不存在的成員變量時, __get() __set() 會被自動調(diào)用。 如果 Foo 是一個 public 的屬性就不會經(jīng)過 __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) 時被自動調(diào)用。 注意該屬性要有相應的 getter。
  • __unset() 用于將屬性值設為 null ,在 unset($object->property) 時被自動調(diào)用。 注意該屬性要有相應的 setter。
  • hasProperty() 用于測試是否有某個屬性。即,定義了 getter 或 setter。 如果 hasProperty() 的參數(shù) $checkVars true (默認為true), 那么只要具有同名的成員變量也認為具有該屬性,如前面提到的 public $title 。
  • canGetProperty() 測試一個屬性是否可讀,參數(shù) $checkVars 的意義同上。只要定義了 getter,屬性即可讀。 同時,如果 $checkVars 為 true 。那么只要類定義了成員變量,不管是 public, private 還是 protected, 都認為是可讀。
  • canSetProperty() 測試一個屬性是否可寫,參數(shù) $checkVars 的意義同上。只要定義了 setter,屬性即可寫。 同時,在 $checkVars 為 ture 。那么只要類定義了成員變量,不管是 public, private 還是 protected, 都認為是可寫。

 

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

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

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 闻喜县| 花莲市| 塔城市| 胶南市| 浦东新区| 稻城县| 嘉鱼县| 辛集市| 株洲市| 罗江县| 乾安县| 中卫市| 海伦市| 龙口市| 苍梧县| 黄浦区| 天水市| 陵川县| 鄂托克旗| 新宾| 鄯善县| 宣城市| 永新县| 休宁县| 吴堡县| 阳朔县| 阳高县| 桂东县| 庆元县| 天水市| 北京市| 通渭县| 鄂伦春自治旗| 宁陕县| 渭南市| 渑池县| 新巴尔虎左旗| 察隅县| 东阿县| 庆阳市| 营山县|