<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] # 簡介 Yii框架里(我是指@yii目錄下,這才是框架)99%的類的祖先類都是`yii\base\Object`或者`yii\base\Component`,這兩個類都有相同之處,可以說一個是基礎版,一個是加強版 # 特性1: new的時候屬性注入 我們先自己定義一個`app\Test`類來繼承`yii\base\Object`進行測試 ~~~php namespace app; class Test extends \yii\base\Object{ public $name; public $age; } ~~~ 然后在控制器里玩玩看效果: ~~~php $config = [ 'name' => 'Jay', 'age' => 26, ]; $test = new Test($config); print_r([$test->name, $test->age]); ~~~ # 特性2: 提供空的init方法進行初始化 通常如果我們要在Test的構造方法`__construct`做點事,就無法使用屬性注入這個特性了,不信你看看**@yii\\base\\Object.php**的`public function __construct`這里,你怎么能隨便重寫呢? 那要在new的時候自動執行代碼怎么辦? 用`public function init(){}`,在Object基類里這個init是一個空方法,用于給子類重寫的,\_\_construct后會自動調用init,來來試試 ~~~ namespace app; class Test extends \yii\base\Object{ public $name; public $age; public function init(){ $this->name = 'May'; } } ~~~ 測試 ~~~ $test = new Test(); echo $test->name; //May ~~~ * 重要知識點:**沒啥事別重寫\_\_construct,建議重寫init來做初始化操作** 倒是`__descruct`沒這個問題,隨你便 # 特性3:getter支持 當繼承Object的類有一個`public function getXxx()`方法時,可以直接通過`echo $obj->xxx`來輸出`getXxx`方法的返回值,例: ~~~ namespace app; class Test extends \yii\base\Object{ public $sex = '男'; private $_age = 99; public function getAge(){ if($this->sex == '女'){ throw new \Exception('怎么可以向女生問年齡!'); } return $this->_age; } } ~~~ 測試 ~~~ $test = new Test(); echo $test->age; $test->sex = '女'; echo $test->age; ~~~ **總結:關鍵是方法要public,然后是get開頭,get后面的單詞就是訪問的屬性名,方法不能有參數** # 特性4: setter支持 其實這跟特性3是同一個特性,只是我想分開兩小節來說,以免一眼看見離下一個大標題那么遠,感覺學習量很大的樣子,你可以一小點一小點學的~ 與getter一樣的邏輯,這個setter就是當你定義了`public function setAge($value)`的時候,執行`$obj->age = 9`就會觸發`setAge($value)`方法,而這個$value就是賦過來的值 完善一下Test類: ~~~ namespace app; class Test extends \yii\base\Object{ public $sex = '男'; private $_age = 99; public function getAge(){ if($this->sex == '女'){ throw new \Exception('怎么可以向女生問年齡!'); } return $this->_age; } public function setAge($age){ if($age < 0){ throw new \Exception('無效的年齡'); } $this->_age = $age; } } ~~~ 控制器測試代碼: ~~~ $test = new Test(); $test->age = 5; echo $test->age; $test->age = -1; //賦的值有問題,引發異常 ~~~ 總結:方法也要public,命名前綴則是set開頭,接收一個`$value`參數處理等號賦的值 getter和setter的好處是讓使用這個類的人只管知道有什么屬性,細節不關心,要值就訪問屬性名,要賦值就直接=號賦值,不用調方法傳參數 雖然底層通過`__get`和`__set`實現這個特性犧牲了點性能,但我覺得這個犧牲量其實不大,通常帶來的好處性價比還是很值得的 # Object的其他與屬性相關的方法 除了\_\_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, 都認為是可寫。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看