接下来我们继续了解Component.php
目录为:vendor/yiisoft/yii2/base/Component.php
(接上次的代码)
/** * Sets the value of a component property.
*设置一个组件属性的值。 * This method will check in the following order and act accordingly: *这种方法将检查以下顺序并采取相应的行动: * - a property defined by a setter: set the property value
由一个setter定义的属性:设置属性值。 * - an event in the format of "on xyz": attach the handler to the event "xyz"
一个"on xyz"格式的事件,处理程序会附加到事件"xyz". * - a behavior in the format of "as xyz": attach the behavior named as "xyz"
一个"as xyz"格式的行为,此行为会附加到名字为"xyz"的行为后面。 * - a property of a behavior: set the behavior property value *一个行为的属性:设置行为的属性值 * Do not call this method directly as it is a PHP magic method that * will be implicitly called when executing `$component->property = $value;`.
不要直接调用此方法,因为它是一个PHP魔术方法,当执行 $component->proerty = $value 时被调用。
* @param string $name the property name or the event name
属性名称或事件名称为字符型 * @param mixed $value the property value
$value为混合型 * @throws UnknownPropertyException if the property is not defined
如果没有定义属性,抛出一个异常信息。 * @throws InvalidCallException if the property is read-only.
如果属性为只读,抛出一个异常信息。 * @see __get() */ public function __set($name, $value) { $setter = 'set' . $name; if (method_exists($this, $setter)) { //如果$setter这个方法在此类中被调用,返回true,没有返回false. // set property $this->$setter($value); //调用$setter方法。 return; } elseif (strncmp($name, 'on ', 3) === 0) {//比较$name和'on '前3个字符,如果前三个字符相等,即当$name 是 'on '格式的时候, // on event: attach event handler $this->on(trim(substr($name, 3)), $value);//执行on 方法,用来添加附加事件。 return; } elseif (strncmp($name, 'as ', 3) === 0) {//比较$name和'as '前3个字符,如果前三个字符相等,即当$name是 'as '格式的时候, // as behavior: attach behavior $name = trim(substr($name, 3)); $this->attachBehavior($name, $value instanceof Behavior ? $value : Yii::createObject($value)); //附加行为。$name 和 $value为参数,后面为三元运算,如果$value这个对象是Behavior类的一个实例,取$value为参数,否则 静态调用Yii方法创造一个新的对象。 return; } else { // behavior property $this->ensureBehaviors(); //附加一个新的事件。 foreach ($this->_behaviors as $behavior) { if ($behavior->canSetProperty($name)) {//如果参数返回为真,$behavior->$name = $value,定义属性。 $behavior->$name = $value; return; } } } if (method_exists($this, 'get' . $name)) { //如果'get'.$name这个方法属于这个类,那么就抛出一个信息"设置只读属性". throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name); } else { //如果不属于这个类,就抛出一个信息"设置未知属性".
throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name); } } /** * Checks if a property is set, i.e. defined and not null.
检查属性设置,即定义,not null。
* This method will check in the following order and act accordingly: * 这种方法将检查以下顺序并采取相应的行动:
* - a property defined by a setter: return whether the property is set
通过一个setter定义的属性:返回属性是否设置
* - a property of a behavior: return whether the property is set
一个行为的属性:返回属性是否设置 * - return `false` for non existing properties * 对于非现有的属性返回false. * Do not call this method directly as it is a PHP magic method that * will be implicitly called when executing `isset($component->property)`.
不要直接调用此方法,因为它是一个PHP魔术方法,当执行isset($component->property)时此魔术方法会被调用。
* @param string $name the property name or the event name * @return boolean whether the named property is set
属性是否被设置返回boolean值。 * @see http://php.net/manual/en/function.isset.php */ public function __isset($name) { $getter = 'get' . $name; if (method_exists($this, $getter)) { //如果$getter方法不存在此类当中,返回这个方法,使他不为null. return $this->$getter() !== null; } else { // behavior property $this->ensureBehaviors(); //否则附加一个时间。 foreach ($this->_behaviors as $behavior) {//遍历行为,如果此方法返回为真,返回这个属性使他不为null. if ($behavior->canGetProperty($name)) { return $behavior->$name !== null; } } } return false; } /** * Sets a component property to be null.
设置一个组件的属性为null。
* This method will check in the following order and act accordingly: *这种方法将检查以下顺序并采取相应的行动: * - a property defined by a setter: set the property value to be null
通过一个setter定义的属性:属性值设置为空
* - a property of a behavior: set the property value to be null *一个行为的属性:属性值设置为空
* Do not call this method directly as it is a PHP magic method that * will be implicitly called when executing `unset($component->property)`.
不要直接调用此方法,因为它是一个PHP魔术方法,当执行'unset($component->property)'时此魔术方法会被调用。
* @param string $name the property name * @throws InvalidCallException if the property is read only.//如果这个属性为只读的话抛出一个信息。 * @see http://php.net/manual/en/function.unset.php */ public function __unset($name) { $setter = 'set' . $name; if (method_exists($this, $setter)) { //如果$setter方法存在这个类里面的话,执行$this->$setter(null)方法。 $this->$setter(null); return; } else { // behavior property $this->ensureBehaviors(); //附加事件 foreach ($this->_behaviors as $behavior) { if ($behavior->canSetProperty($name)) {//遍历行为事件,如果为真的话,使$behavior->$name = null.返回。 $behavior->$name = null; return; } } } throw new InvalidCallException('Unsetting an unknown or read-only property: ' . get_class($this) . '::' . $name);//否则抛出信息"重置一个未知的或只读属性". } /** * Calls the named method which is not a class method. *调用方法名,不是一个类的方法。 * This method will check if any attached behavior has * the named method and will execute it if available.
//此方法将检查是否有附加的行为有
命名方法(如果可用)将执行它。
* Do not call this method directly as it is a PHP magic method that
* will be implicitly called when an unknown method is being invoked.
//不要直接调用此方法,因为他是一个PHP魔术方法,当一个未知方法执行时此魔术方法会被调用。
* @param string $name the method name * @param array $params method parameters * @return mixed the method return value * @throws UnknownMethodException when calling unknown method */ public function __call($name, $params) { $this->ensureBehaviors();//附加事件 foreach ($this->_behaviors as $object) { if ($object->hasMethod($name)) { return call_user_func_array([$object, $name], $params);//用一个数组作为参数调用一个回调函数,返回值为回调函数执行的结果或者为false。 } } throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()"); //抛出一个信息,调用未知方法. } /** * This method is called after the object is created by cloning an existing one. * It removes all behaviors because they are attached to the old object. */
通过克隆现有创建的对象后,此方法会被调用。
他将会消除所有的行为因为它连接到了旧对象。 public function __clone() { $this->_events = []; //事件为空数组。 $this->_behaviors = null;//行为为null. } /** * Returns a value indicating whether a property is defined for this component.
*返回一个指示属性是否为此组件定义的值。 * A property is defined if:
*一个被定义的属性,如果: *
* - the class has a getter or setter method associated with the specified name
*该类具有与指定名称关联的getter或setter方法 * (in this case, property name is case-insensitive);
*(在这种情况下,属性名称不区分大小写); * - the class has a member variable with the specified name (when `$checkVars` is true);
*该类具有指定名称的成员变量(当`$ checkVars`为true) * - an attached behavior has a property of the given name (when `$checkBehaviors` is true). *一个附加行为具有给定的名称的属性(当`$checkBehaviors`为true)。 * @param string $name the property name * @param boolean $checkVars whether to treat member variables as properties * @param boolean $checkBehaviors whether to treat behaviors' properties as properties of this component * @return boolean whether the property is defined * @see canGetProperty() * @see canSetProperty() */ public function hasProperty($name, $checkVars = true, $checkBehaviors = true) { return $this->canGetProperty($name, $checkVars, $checkBehaviors) || $this->canSetProperty($name, false, $checkBehaviors);