[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, 都認為是可寫。
- 目錄
- 配置
- 簡介
- 別名
- gii
- 配置項
- 模型
- 簡介
- 增刪改查
- AR和model
- 模型事件
- 場景
- query查詢
- 增刪改
- AR查詢器
- 模型關系定義
- AR模型連表查詢
- fields
- where拼接
- 模塊
- 創建模塊
- 控制器
- 表單
- 跳轉
- 響應
- 驗證器
- Action
- 組件
- url
- 分頁
- 驗證碼
- 緩存
- 文件上傳
- 預啟動組件
- 事件
- 自定義組件
- redis
- 日志
- 行為
- cookie和session
- 基礎知識
- 創建一個類
- 配置一個類
- object基類
- component組件類特性
- phpstorm無法更改php等級
- url地址美化
- 過濾器
- 請求處理
- 請求組件
- 響應組件
- header
- 用戶登錄
- 實現IdentityInterface接口
- 登錄
- 自動檢測登錄
- 獲取用戶信息
- 訪問行為追蹤
- phpstorm+postman斷點調試