关联阅读
十一、逐行阅读Yii2.0.43源码_Yii框架文件Component.php(1)
十二、逐行阅读Yii2.0.43源码_Yii框架文件Component.php(2)
十三、逐行阅读Yii2.0.43源码_Yii框架文件Component.php(3)
十四、逐行阅读Yii2.0.43源码_Yii框架文件Component.php(4)
目录
一、canGetProperty方法,返回一个值,表示组件是否有可读的属性$name
二、 canSetProperty方法,返回一个值,指示是否可以设置属性$name
三、 hasProperty方法,检查属性$name是否定义
一、canGetProperty方法,返回一个值,表示组件是否有可读的属性$name
1.检查是否有getXXX方法
2.如果$checkVars为true,检查类属性
3.遍历行为数组,检查是否有$name属性
/**
* 返回一个值,表示组件是否有可读的属性$name
* 1.检查是否有getXXX方法
* 2.如果$checkVars为true,检查类属性
* 3.遍历行为数组,检查是否有$name属性
*/
public function canGetProperty($name, $checkVars = true, $checkBehaviors = true)
{
if (
//1.检查是否有getXXX方法
method_exists($this, 'get' . $name)
//2.如果$checkVars为true,检查类属性
|| $checkVars && property_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
//3.遍历行为数组,检查是否有$name属性
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canGetProperty($name, $checkVars)) {
return true;
}
}
}
//4.返回false
return false;
}
二、 canSetProperty方法,返回一个值,指示是否可以设置属性$name
1. 检查是否存在setXXX方法
2. 如果$checkVars为true,检查类属性
3. 遍历行为数组,检查是否可以设置属性$name
/**
* 返回一个值,指示是否可以设置属性$name
* 1. 检查是否存在setXXX方法
* 2. 如果$checkVars为true,检查类属性
* 3. 遍历行为数组,检查是否可以设置属性$name
*/
public function canSetProperty($name, $checkVars = true, $checkBehaviors = true)
{
if (
//1. 检查是否存在setXXX方法
method_exists($this, 'set' . $name)
//2. 如果$checkVars为true,检查类属性
|| $checkVars && property_exists($this, $name)) {
return true;
} elseif ($checkBehaviors) {
//3. 遍历行为数组,检查是否可以设置属性$name
$this->ensureBehaviors();
foreach ($this->_behaviors as $behavior) {
if ($behavior->canSetProperty($name, $checkVars)) {
return true;
}
}
}
//4.返回false
return false;
}
三、 hasProperty方法,检查属性$name是否定义
/**
* 检查属性$name是否定义,
* 实质是调用canGetProperty和canSetProperty方法
*/
public function hasProperty($name, $checkVars = true, $checkBehaviors = true)
{
return $this->canGetProperty($name, $checkVars, $checkBehaviors) ||
$this->canSetProperty($name, false, $checkBehaviors);
}
总结:
阅读了3个操作属性相关的方法:
- canGetProperty 返回一个值,表示组件是否有可读的属性$name
- canSetProperty 返回一个值,指示是否可以设置属性$name
- hasProperty 检查属性$name是否定义