目录
一、className静态方法,返回类的完全限定名称。
二、构造函数
三、属性相关的操作
四、hasMethod方法,检查方法是否存在
????????BaseObject类实现了属性特性,提供了一些属性操作的方法。BaseObject类实现了Configurable接口。
一、className静态方法,返回类的完全限定名称。
/**
* 返回类的完全限定名称
*/
public static function className()
{
return get_called_class();
}
二、构造函数
- BaseObject类实现了Configurable接口
- 构造方法的最后一个参数,推荐是一个配置数组
- 子类覆写BaseObject时,推荐在构造函数最后调用parent::__construct($config)
/**
* BaseObject构造函数
* BaseObject类实现了Configurable接口,构造函数
* 的最后一个参数推荐是一个配置数组
*/
public function __construct($config = [])
{
if (!empty($config)) {
//用$config数组的值,初始化对象
Yii::configure($this, $config);
}
//进一步初始化对象
$this->init();
}
/**
* 对象初始化工作,可以在
* 这个方法里进行
*/
public function init()
{
}
三、属性相关的操作
- 提供了__get,__set,__isset,__unset,__call 5个魔术方法
- 提供了hasProperty,canGetProperty,canSetProperty 3个属性相关操作方法
/**
* 获取属性
*/
public function __get($name)
{
$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);
}
throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}
/**
* 设置属性值
*/
public function __set($name, $value)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter($value);
} elseif (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
} else {
throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}
}
/**
* 检查属性是否定义
*/
public function __isset($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter() !== null;
}
return false;
}
/**
* 设置属性值为null
*/
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);
}
}
/**
* 调用不存在的方法,抛出异常
*/
public function __call($name, $params)
{
throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}
/**
* 属性是否存在
*/
public function hasProperty($name, $checkVars = true)
{
return $this->canGetProperty($name, $checkVars) ||
$this->canSetProperty($name, false);
}
/**
* 属性是否可读
*/
public function canGetProperty($name, $checkVars = true)
{
return method_exists($this, 'get' . $name) ||
$checkVars && property_exists($this, $name);
}
/**
* 属性是否可以被设置
*/
public function canSetProperty($name, $checkVars = true)
{
return method_exists($this, 'set' . $name) ||
$checkVars && property_exists($this, $name);
}
四、hasMethod方法,检查方法是否存在
/**
* 检查方法是否存在
*/
public function hasMethod($name)
{
return method_exists($this, $name);
}
|