zoukankan      html  css  js  c++  java
  • yii2源码学习笔记(二)

     yiiaseObject代码详解

      1 <?php
      2 /**
      3  * @link http://www.yiiframework.com/
      4  * @copyright Copyright (c) 2008 Yii Software LLC
      5  * @license http://www.yiiframework.com/license/
      6  */
      7 
      8 namespace yiiase;
      9 
     10 use Yii;
     11 
     12 /**
     13  * Object is the base class that implements the *property* feature.
     14  * Object 是一个实现属性功能的基类
     15  * A property is defined by a getter method (e.g. `getLabel`), and/or a setter method (e.g. `setLabel`). For example,
     16  * 定义了getter和setter方法。例如:
     17  * the following getter and setter methods define a property named `label`:
     18  * 
     19  * ~~~
     20  * private $_label;
     21  *
     22  * public function getLabel()
     23  * {
     24  *     return $this->_label;
     25  * }
     26  *
     27  * public function setLabel($value)
     28  * {
     29  *     $this->_label = $value;
     30  * }
     31  * ~~~
     32  *
     33  * Property names are *case-insensitive*.
     34  * 属性名大小写敏感
     35  * A property can be accessed like a member variable of an object. Reading or writing a property will cause the invocation
     36  * of the corresponding getter or setter method. For example,
     37  * 可以访问对象的属性,如对象的成员变量。读或写一个属性将导致调用相应的getter或setter方法
     38  * ~~~
     39  * // equivalent to $label = $object->getLabel();
     40  * $label = $object->label;
     41  * // equivalent to $object->setLabel('abc');
     42  * $object->label = 'abc';
     43  * ~~~
     44  *
     45  * If a property has only a getter method and has no setter method, it is considered as *read-only*. In this case, trying
     46  * to modify the property value will cause an exception.
     47  * 如果一个属性只有getter方法,就只能读,如果写会出现异常。
     48  * One can call [[hasProperty()]], [[canGetProperty()]] and/or [[canSetProperty()]] to check the existence of a property.
     49  * 通过hasProperty canGetProperty或canSetProperty 检查属性是否存在
     50  * Besides the property feature, Object also introduces an important object initialization life cycle. In particular,
     51  * creating an new instance of Object or its derived class will involve the following life cycles sequentially:
     52  * 除了属性特征,对象还引入了一个重要的对象初始化生命周期,
     53  * 创建一个新的对象或其派生类的实例,将涉及下列生命周期
     54  * 1. the class constructor is invoked;
     55  * 2. object properties are initialized according to the given configuration;
     56  * 3. the `init()` method is invoked.
     57  *  调用构造函数;
     58  *  根据给定的对象属性初始化配置;
     59  *  init()调用的方法.
     60  * In the above, both Step 2 and 3 occur at the end of the class constructor. It is recommended that
     61  * you perform object initialization in the `init()` method because at that stage, the object configuration
     62  * is already applied.
     63  * 2和3发生在类构造函数的末端。建议
     64  * 你完成对象的初始化在` init()`方法因为在那个阶段,对象配置已经应用。
     65  * In order to ensure the above life cycles, if a child class of Object needs to override the constructor,
     66  * it should be done like the following:
     67  * 为了保证的生命周期,如果一个子类的对象需要重写构造函数,
     68  * ~~~
     69  * public function __construct($param1, $param2, ..., $config = [])
     70  * {
     71  *     ...
     72  *     parent::__construct($config);
     73  * }
     74  * ~~~
     75  *
     76  * That is, a `$config` parameter (defaults to `[]`) should be declared as the last parameter
     77  * of the constructor, and the parent implementation should be called at the end of the constructor.
     78  * 一个配置的参数应该声明为最后一个参数,构造函数和父类的实现应该在结尾调用
     79  * @author Qiang Xue <qiang.xue@gmail.com>
     80  * @since 2.0
     81  */
     82 class Object
     83 {
     84     /**
     85      * Returns the fully qualified name of this class. 获取静态方法调用的类名,返回类的名称
     86      * @return string the fully qualified name of this class.
     87      */
     88     public static function className()
     89     {   //哪个类调用,就返回哪个类,
     90         return get_called_class();
     91     }
     92 
     93     /**
     94      * Constructor.
     95      * The default implementation does two things:
     96      *
     97      * - Initializes the object with the given configuration `$config`.
     98      * - Call [[init()]].
     99      *
    100      * If this method is overridden in a child class, it is recommended that
    101      *
    102      * - the last parameter of the constructor is a configuration array, like `$config` here.
    103      * - call the parent implementation at the end of the constructor.
    104      *
    105      * @param array $config name-value pairs that will be used to initialize the object properties
    106      */
    107     public function __construct($config = [])
    108     {
    109         //根据$config初始化对象
    110         if (!empty($config)) {
    111             Yii::configure($this, $config);
    112         }
    113         //调用 init()方法,用于初始化,可以被重写。
    114         $this->init();
    115     }
    116 
    117     /**
    118      * Initializes the object.
    119      * This method is invoked at the end of the constructor after the object is initialized with the
    120      * given configuration.
    121      * 初始化结束时调用,与给定的配置初始化。
    122      */
    123     public function init()
    124     {
    125     }
    126 
    127     /**
    128      * Returns the value of an object property.
    129      *
    130      * Do not call this method directly as it is a PHP magic method that
    131      * will be implicitly called when executing `$value = $object->property;`.
    132      * 不要直接调用这个方法,因为它是一个PHP魔术方法,要隐式调用
    133      * @param string $name the property name 属性名称
    134      * @return mixed the property value      属性值
    135      * @throws UnknownPropertyException if the property is not defined 属性未定义
    136      * @throws InvalidCallException if the property is write-only   该属性写
    137      * @see __set()
    138      */
    139     public function __get($name)
    140     {
    141         $getter = 'get' . $name;//定义$getter
    142         if (method_exists($this, $getter)) {
    143             return $this->$getter();//存在方法,直接调用
    144         } elseif (method_exists($this, 'set' . $name)) {
    145             // 如果存在 'set' . $name 方法,就认为属性是只写
    146             throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
    147         } else {
    148             // 否则认为该属性不存在 未定义
    149             throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
    150         }
    151     }
    152 
    153     /**
    154      * Sets value of an object property.
    155      *
    156      * Do not call this method directly as it is a PHP magic method that
    157      * will be implicitly called when executing `$object->property = $value;`.
    158      * @param string $name the property name or the event name 属性或事件名称
    159      * @param mixed $value the property value   属性值
    160      * @throws UnknownPropertyException if the property is not defined 未定义属性
    161      * @throws InvalidCallException if the property is read-only    属性只写
    162      * @see __get()
    163      */
    164     public function __set($name, $value)
    165     {
    166         $setter = 'set' . $name;
    167         if (method_exists($this, $setter)) {
    168             $this->$setter($value);//对象存在$setter方法,直接调用
    169         } elseif (method_exists($this, 'get' . $name)) {
    170              // 存在 'get' . $name 方法,就认为该属性是只读
    171             throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
    172         } else {  // 否则认为该属性不存在 未定义
    173             throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
    174         }
    175     }
    176 
    177     /**
    178      * Checks if the named property is set (not null).
    179      * 检查属性是否设置
    180      * Do not call this method directly as it is a PHP magic method that
    181      * will be implicitly called when executing `isset($object->property)`.
    182      *
    183      * Note that if the property is not defined, false will be returned. 未定义返回false
    184      * @param string $name the property name or the event name  属性名
    185      * @return boolean whether the named property is set (not null).    
    186      */
    187     public function __isset($name)
    188     {
    189         $getter = 'get' . $name;
    190         if (method_exists($this, $getter)) {
    191             //由$getter获取的值不为null,该属性存在,返回true
    192             return $this->$getter() !== null;
    193         } else {
    194             return false;//该属性存在,返回false
    195         }
    196     }
    197 
    198     /**
    199      * Sets an object property to null.
    200      * 设置一个属性为空
    201      * Do not call this method directly as it is a PHP magic method that
    202      * will be implicitly called when executing `unset($object->property)`.
    203      *
    204      * Note that if the property is not defined, this method will do nothing.
    205      * If the property is read-only, it will throw an exception.
    206      * @param string $name the property name    属性名
    207      * @throws InvalidCallException if the property is read only. 属性只读
    208      */
    209     public function __unset($name)
    210     {
    211         $setter = 'set' . $name;
    212         if (method_exists($this, $setter)) {
    213             //如果存在,由$setter设置为null
    214             $this->$setter(null);
    215         } elseif (method_exists($this, 'get' . $name)) {
    216             //如果是只读的,抛出异常
    217             throw new InvalidCallException('Unsetting read-only property: ' . get_class($this) . '::' . $name);
    218         }
    219     }
    220 
    221     /**
    222      * Calls the named method which is not a class method.
    223      * 调用指定的方法而不是一个类方法.
    224      * Do not call this method directly as it is a PHP magic method that
    225      * will be implicitly called when an unknown method is being invoked.
    226      * @param string $name the method name  方法名
    227      * @param array $params method parameters 方法参数
    228      * @throws UnknownMethodException when calling unknown method 调用未知方法
    229      * @return mixed the method return value    
    230      */
    231     public function __call($name, $params)
    232     {
    233         //调用指定方法
    234         throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
    235     }
    236 
    237     /**
    238      * Returns a value indicating whether a property is defined.
    239      * A property is defined if:
    240      *
    241      * - the class has a getter or setter method associated with the specified name
    242      *   (in this case, property name is case-insensitive);
    243      * - the class has a member variable with the specified name (when `$checkVars` is true);
    244      * 检查查对象或类是否具有 $name 属性,如果 $checkVars 为 true,则不局限于是否有 getter或setter
    245      * @param string $name the property name    属性名
    246      * @param boolean $checkVars whether to treat member variables as properties 是否将成员变量作为属性对待 true/false
    247      * @return boolean whether the property is defined  属性是否定义
    248      * @see canGetProperty()
    249      * @see canSetProperty()
    250      */
    251     public function hasProperty($name, $checkVars = true)
    252     {
    253         return $this->canGetProperty($name, $checkVars) || $this->canSetProperty($name, false);
    254     }
    255 
    256     /**
    257      * Returns a value indicating whether a property can be read.
    258      * 返回一个值指示是否可以读取属性.
    259      * A property is readable if:
    260      *
    261      * - the class has a getter method associated with the specified name
    262      *   (in this case, property name is case-insensitive);
    263      * - the class has a member variable with the specified name (when `$checkVars` is true);
    264      * 检查对象或类是否能够获取 $name 属性,如果 $checkVars 为 true,则不局限于是否有 getter
    265      * @param string $name the property name
    266      * @param boolean $checkVars whether to treat member variables as properties
    267      * @return boolean whether the property can be read
    268      * @see canSetProperty()
    269      */
    270     public function canGetProperty($name, $checkVars = true)
    271     {
    272         //是否存在该属性
    273         return method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name);
    274     }
    275 
    276     /**
    277      * Returns a value indicating whether a property can be set.
    278      * 属性是否可设置
    279      * A property is writable if:
    280      *
    281      * - the class has a setter method associated with the specified name
    282      *   (in this case, property name is case-insensitive);
    283      * - the class has a member variable with the specified name (when `$checkVars` is true);
    284      * 检查对象或类是否能够设置 $name 属性,如果 $checkVars 为 true,则不局限于是否有 setter
    285      *
    286      * @param string $name the property name
    287      * @param boolean $checkVars whether to treat member variables as properties    是否将成员变量作为属性来对待
    288      * @return boolean whether the property can be written  是否可写
    289      * @see canGetProperty()
    290      */
    291     public function canSetProperty($name, $checkVars = true)
    292     {
    293         return method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name);
    294     }
    295 
    296     /**
    297      * Returns a value indicating whether a method is defined.
    298      * 方法是否定义
    299      * The default implementation is a call to php function `method_exists()`.
    300      * You may override this method when you implemented the php magic method `__call()`.
    301      * @param string $name the method name
    302      * @return boolean whether the method is defined    是否具有 $name 方法
    303      */
    304     public function hasMethod($name)
    305     {
    306         return method_exists($this, $name);
    307     }
    308 }
  • 相关阅读:
    Java如何编写自动售票机程序
    install windows service
    redis SERVER INSTALL WINDOWS SERVICE
    上传文件
    This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.
    解决Uploadify上传控件加载导致的GET 404 Not Found问题
    OracleServiceORCL服务不见了怎么办
    Access to the temp directory is denied. Identity 'NT AUTHORITYNETWORK SERVICE' under which XmlSerializer is running does not have sufficient permiss
    MSSQL Server 2008 数据库安装失败
    数据库数据导出成XML文件
  • 原文地址:https://www.cnblogs.com/dragon16/p/5513544.html
Copyright © 2011-2022 走看看