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

    今天开始阅读vendor/yiisoft/yii2/base/Action.php

    <?php
    
    
    namespace yiiase;//命名空间
    
    use Yii;//加载Yii文件夹下的Yii.php
    
    /**
     * Action is the base class for all controller action classes.
     *
     * Action provides a way to reuse action method code. An action method in an Action
     * class can be used in multiple controllers or in different projects.
     *
     * Derived classes must implement a method named `run()`. This method
     * will be invoked by the controller when the action is requested.
     * The `run()` method can have parameters which will be filled up
     * with user input values automatically according to their names.
     * For example, if the `run()` method is declared as follows:
     *
     * ```php
     * public function run($id, $type = 'book') { ... }
     * ```
     *
     * And the parameters provided for the action are: `['id' => 1]`.
     * Then the `run()` method will be invoked as `run(1)` automatically.
     *
     * @property string $uniqueId The unique ID of this action among the whole application. This property is
     * read-only.
     *
     * @author Qiang Xue <qiang.xue@gmail.com>
     * @since 2.0
     */
    /*此控制器是所有控制器动作的基类。
    此控制器提供了一种方法可以重复使用操作方法的代码,此操作方法类可以在多个控制器或不同的项目中使用。
     派生类必须实现一个名为run()的方法,这种方法在控制器被请求时调用。
     举个例子:run()调用声明如下所示:public function run($id,$type=’book'){}并且提供了操作的参数 ['id'=>1];
     所以当run(1),参数为1时自动调用run();
     此属性只读。
    */

    //此类继承Component类,下面我们先看一下Component是什么类。(请转下一段代码) class Action extends Component { /** * @var string ID of the action */ public $id; /** * @var Controller|yiiwebController the controller that owns this action */ public $controller; /** * Constructor. * * @param string $id the ID of this action * @param Controller $controller the controller that owns this action * @param array $config name-value pairs that will be used to initialize the object properties */ public function __construct($id, $controller, $config = []) { $this->id = $id; $this->controller = $controller; parent::__construct($config); } /** * Returns the unique ID of this action among the whole application. * * @return string the unique ID of this action among the whole application. */ public function getUniqueId() { return $this->controller->getUniqueId() . '/' . $this->id; } /** * Runs this action with the specified parameters. * This method is mainly invoked by the controller. * * @param array $params the parameters to be bound to the action's run() method. * @return mixed the result of the action * @throws InvalidConfigException if the action class does not have a run() method */ public function runWithParams($params) { if (!method_exists($this, 'run')) { throw new InvalidConfigException(get_class($this) . ' must define a "run()" method.'); } $args = $this->controller->bindActionParams($this, $params); Yii::trace('Running action: ' . get_class($this) . '::run()', __METHOD__); if (Yii::$app->requestedParams === null) { Yii::$app->requestedParams = $args; } if ($this->beforeRun()) { $result = call_user_func_array([$this, 'run'], $args); $this->afterRun(); return $result; } else { return null; } } /** * This method is called right before `run()` is executed. * You may override this method to do preparation work for the action run. * If the method returns false, it will cancel the action. * * @return boolean whether to run the action. */ protected function beforeRun() { return true; } /** * This method is called right after `run()` is executed. * You may override this method to do post-processing work for the action run. */ protected function afterRun() { } }

    我们接下来先重点了解一下Component.php

    目录为:vendor/yiisoft/yii2/base/Component.php

    <?php
    
    
    namespace yiiase; //命名空间
    
    use Yii;  //加载相关的类

    /**
    * Component is the base class that implements the *property*, *event* and *behavior* features.
    *
    * Component provides the *event* and *behavior* features, in addition to the *property* feature which is implemented in
    * its parent class [[Object]].
    *
    * Event is a way to "inject" custom code into existing code at certain places. For example, a comment object can trigger
    * an "add" event when the user adds a comment. We can write custom code and attach it to this event so that when the event
    * is triggered (i.e. comment will be added), our custom code will be executed.
    *
    * An event is identified by a name that should be unique within the class it is defined at. Event names are *case-sensitive*.
    *
    * One or multiple PHP callbacks, called *event handlers*, can be attached to an event. You can call [[trigger()]] to
    * raise an event. When an event is raised, the event handlers will be invoked automatically in the order they were
    * attached.
    *
    * To attach an event handler to an event, call [[on()]]:

    */
    //组件是实现属性,事件和行为特点的基类。
    组件提供事件行为,这是继承他父类Object的特点。

     事件是一种在特定的地方“注入”自定义代码到现有的代码。例如,
     当一个用户添加评论事件时,注释的对象可以触发。我们可以编写自定义代码,并将其附加到此事件,这样当事件被触发(即评论将被添加),

     我们的自定义代码会被执行,

     一个或多个php回调,称为为‘事件处理’。要触发一个事件处理,可以用on();举个例子。

    * ```php
    * $post->on('update', function ($event) {
    * // 发送电子邮件通知。
    * });

    在上述例子中,一个匿名函数被连接到'update'事件后。

    可以用以下类型的程序做处理:

    * - anonymous function: `function ($event) { ... }`    ------匿名函数
    * - object method: `[$object, 'handleAdd']`            ------对象方法

    * - static class method: `['Page', 'handleAdd']`       ------静态类方法
    * - global function: `'handleAdd'`                     ------全局函数  


    class Component extends Object { /** * @var array the attached event handlers (event name => handlers) */
      //事件处理程序,是一个数组。(事件名称=>处理程序)
    private $_events = []; /** * @var Behavior[]|null the attached behaviors (behavior name => behavior). This is `null` when not initialized. */
      //行为为空时的连接形式,(行为名称=>行为),未初始化的时候为null.
    private $_behaviors; /** * Returns the value of a component property. * This method will check in the following order and act accordingly: * * - a property defined by a getter: return the getter result * - a property of a behavior: return the behavior property value * * Do not call this method directly as it is a PHP magic method that * will be implicitly called when executing `$value = $component->property;`. * @param string $name the property name * @return mixed the property value or the value of a behavior's property * @throws UnknownPropertyException if the property is not defined * @throws InvalidCallException if the property is write-only. * @see __set() */
      

    / **
         *返回一个组件的属性值。
         *这个方法将检查以下顺序并采取相应的行动:
         *
         * - 通过一个getter定义的属性:返回getter的结果
         * - 一个行为的属性:返回的行为属性值
         *
         *不要直接调用此方法,因为它是一个PHP魔术方法
         *将执行`

    $value = $component->property;时调用

    `。
         * @参数字符串$name属性名
         * @返回混合属性值或行为的属性的值
         *@throws UnknownPropertyException如果没有定义属性,抛出信息。
         *@throws InvalidCallException如果该属性是只写的。
         *@see__set()


    public function __get($name) { $getter = 'get' . $name; //定义$getter if (method_exists($this, $getter)) { //如果$getter这种方法在这个对象中被调用,则返回TRUE. // read property, e.g. getName() return $this->$getter(); //调用$getter方法。 } else { // behavior property $this->ensureBehaviors(); //否则调用此函数,作用是确保此组件声明这种行为。 foreach ($this->_behaviors as $behavior) { if ($behavior->canGetProperty($name)) { //返回一个boolean类型的指示属性是否可读。 return $behavior->$name;  //如果可读,返回name的值。 } } } if (method_exists($this, 'set' . $name)) {//如果set.$name这种方法在这个对象中被调用,则返回TRUE. throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name); //获取只读属性 } else { throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name); //如果没被调用,抛出异常信息:属性不明。(未完待续.....) } }
  • 相关阅读:
    单链表反转非递归
    Java中boolean类型到底占用多少个字节
    多线程,计算List<Integer>
    es聚合操作
    字符串压缩
    dart effective-风格和文档
    dart effective-用法
    node 安装
    Rabbitmq 报错信息
    rabbitmq 工作模式
  • 原文地址:https://www.cnblogs.com/taokai/p/5389376.html
Copyright © 2011-2022 走看看