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

    继续解读Object.php

    /**
         * Calls the named method which is not a class method.
         *
         * 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.
         * @param string $name the method name
         * @param array $params method parameters
         * @throws UnknownMethodException when calling unknown method
         * @return mixed the method return value
         */
        public function __call($name, $params)
        {
            throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
        }
        /**
         * Returns a value indicating whether a property is defined.
         * A property is defined if:
         *
         * - the class has a getter or setter method associated with the specified name
         *   (in this case, property name is case-insensitive);
         * - the class has a member variable with the specified name (when `$checkVars` is true);
         *
         * 检查对象或类是否具有 $name 属性,如果 $checkVars 为 true,则不局限于是否有 getter/setter
         *
         * @param string $name the property name
         * @param boolean $checkVars whether to treat member variables as properties
         * @return boolean whether the property is defined
         * @see canGetProperty()
         * @see canSetProperty()
         */
        public function hasProperty($name, $checkVars = true)
        {
            return $this->canGetProperty($name, $checkVars) || $this->canSetProperty($name, false);
        }
        /**
         * Returns a value indicating whether a property can be read.
         * A property is readable if:
         *
         * - the class has a getter method associated with the specified name
         *   (in this case, property name is case-insensitive);
         * - the class has a member variable with the specified name (when `$checkVars` is true);
         *
         * 检查对象或类是否能够获取 $name 属性,如果 $checkVars 为 true,则不局限于是否有 getter
         *
         * @param string $name the property name
         * @param boolean $checkVars whether to treat member variables as properties
         * @return boolean whether the property can be read
         * @see canSetProperty()
         */
        public function canGetProperty($name, $checkVars = true)
        {
           
            return method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name);
        }
        /**
         * Returns a value indicating whether a property can be set.
         * A property is writable if:
         *
         * - the class has a setter method associated with the specified name
         *   (in this case, property name is case-insensitive);
         * - the class has a member variable with the specified name (when `$checkVars` is true);
         *
    
         *
         * @param string $name the property name
         * @param boolean $checkVars whether to treat member variables as properties
         * @return boolean whether the property can be written
         * @see canGetProperty()
         */
        public function canSetProperty($name, $checkVars = true)
        {
            return method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name);
        }
        /**
         * Returns a value indicating whether a method is defined.
         *
         * The default implementation is a call to php function `method_exists()`.
         * You may override this method when you implemented the php magic method `__call()`.
         *
        
         *
         * @param string $name the method name
         * @return boolean whether the method is defined
         */
        public function hasMethod($name)
        {
            return method_exists($this, $name);
        }
    }(Object.php完结)


    接下来接续了解Component.php

    /**
         * Returns a value indicating whether there is any handler attached to the named event.
         *
         * 判断 _events 中的一个 event 是否具有 handler
         * @param string $name the event name
         * @return boolean whether there is any handler attached to the event.
         */
        public function hasEventHandlers($name)
        {
            $this->ensureBehaviors();
            // _events 中存在 $name 的 event 或者 $name 的 event 是否含有该对象所在的类的 handler
            return !empty($this->_events[$name]) || Event::hasHandlers($this, $name);
        }
    
    /**
         * Detaches an existing event handler from this component.
         * This method is the opposite of [[on()]].
       *拆离此组件现有的事件处理程序。 * @param string $name event name * @param callable $handler the event handler to be removed. * If it is null, all handlers attached to the named event will be removed. * @return boolean if a handler is found and detached * @see on()
    */ public function off($name, $handler = null) { // 保证 behaviors 都加载进来了 $this->ensureBehaviors(); // 相应的事件不存在,就返回false if (empty($this->_events[$name])) { return false; } // 没有handler,就意味着要全部去掉 if ($handler === null) { unset($this->_events[$name]); return true; } else { $removed = false; foreach ($this->_events[$name] as $i => $event) { // $event[0]是handler,$event[1]是数据 if ($event[0] === $handler) { unset($this->_events[$name][$i]); $removed = true; } } if ($removed) { // 如果有移出事件的handler,就需要重新构建以下索引,否则会出现index为1,3,4的情况 $this->_events[$name] = array_values($this->_events[$name]); } return $removed; } } /** * Triggers an event.
       *触发事件 * This method represents the happening of an event. It invokes * all attached handlers for the event including class-level handlers.
       *这种方法代表事件的发生,他会触发所有连接的处理程序,包括类级别处理该事件。 * @param string $name the event name * @param Event $event the event parameter. If not set, a default [[Event]] object will be created.
    */ public function trigger($name, Event $event = null) { // 保证 behaviors 都加载进来了 $this->ensureBehaviors(); if (!empty($this->_events[$name])) { // 构建Event对象,为传入到handler函数中做准备 if ($event === null) { $event = new Event; } if ($event->sender === null) { $event->sender = $this; } $event->handled = false; $event->name = $name; foreach ($this->_events[$name] as $handler) { // 给event的data属性赋值 $event->data = $handler[1]; // handler的函数中传入了一个Event对象 call_user_func($handler[0], $event); // stop further handling if the event is handled // 事件是否被handle,当handled被设置为true时,执行到这个event的时候,会停止,并忽略剩下的event if ($event->handled) { return; } } } // invoke class-level attached handlers // 触发class级别的handler Event::trigger($this, $name, $event); }
  • 相关阅读:
    多线程--ThreadLocal类
    常用开发类库支持--UUID及空值处理Optional
    国际化的程序实现及其原理
    浅析java设计模式(一)----异构容器,可以存储任何对象类型为其他类提供该对象
    使用批处理命令注册运行mysql数据库,无需注册mysql服务,可以在任意电脑登录使用
    计算机中位、字长、字的区别
    SQL Server用户自定义数据类型
    简单的回合制小游戏
    单链表创建、删除、查找、插入之C语言实现
    LeetCode-905 Sort Array By Parity Solution (with Java)
  • 原文地址:https://www.cnblogs.com/taokai/p/5401260.html
Copyright © 2011-2022 走看看