zoukankan      html  css  js  c++  java
  • yii2框架随笔4

    接下来我们继续了解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);
  • 相关阅读:
    线性Softmax分类器实战
    线性SVM分类器实战
    今日心得:读书
    今日心得:正能量
    Excel导出POI
    mysql数据库操作命令
    git常用命令
    list对象 利用Map去除对象中字段的重复
    SpringMVC 利用POI的Excel导出
    利用ajax进行页面加载进行信息展示时,一直不提加载,转圈,不反回问题。
  • 原文地址:https://www.cnblogs.com/taokai/p/5392877.html
Copyright © 2011-2022 走看看