1 版本
// yii\BaseYii\getVersion
public static function getVersion()
{
return '2.0.10';
}
2 继承与实现
Object实现了Configurable接口。
Configureable要求在构造函数的参数末尾加上$config
public function __constructor($param1, $param2, ..., $config = [])
3 构造函数 __construct
// 按照Configureable要求, 需要在参数末尾添加 $config = []
public function __construct($config = [])
{
if (!empty($config)) {
Yii::configure($this, $config);
}
// 调用了初始化函数
$this->init();
}
4 __get, __set
// 重写了php5中预定义的__get
// php5中的代码:
public function __get($name)
{
return $this->$name;
}
// yii中的代码
public function __get($name)
{
// 由原来的直接调用属性改为通过调用get函数来间接调用
$getter = 'get' . $name;
if (method_exists($this, $getter))
{
return $this->$getter();
}
elseif (method_exists($this, 'set' . $name))
{
throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
}
else
{
throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}
}
同理于__set
在代码中可以看见,如果找不到$getter, 却找到了setter, 就会报出异常,这个属性不可读。
5 method_exists
用于检测类中指定的函数是否存在
6 __isset, __unset
__isset 用于判断某个属性是否定义了
__unset 用于将某个属性设置为null,但是对只读的属性,会报异常
最好不要直接使用__isset和__unset,而是使用isset和unset
public function __isset($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter))
{
return $this->$getter() !== null;
}
else
{
return false;
}
}
public function __unset($name)
{
$setter = 'set' . $name;
if (method_exists($this, $setter))
{
$this->$setter(null);
}
elseif (method_exists($this, 'get' . $name))
{
throw new InvalidCallException('Unsetting read-only property: ' . get_class($this) . '::' . $name);
}
}
7 其余判断函数
以下函数基本上借助于method_exists和property_exists
hasProperty
canGetProperty
canSetProperty
hasMethod