wecenter学习笔记-自动引入机制和Autoload

字数 400阅读 170

该文是wecenter学习笔记的一部分

自动引入机制和Autoload

通过约束model类、system类和config的存放位置和命名规则,实现了不需要事先引入文件就可以直接使用, 这使得在编程过程中变得方便快捷, 也避免了类库重复实例化的问题。

具体的规则如下:

  1. model

    放在 model 目录下, 文件名: name.inc.php,类名采用name_class的格式

    • 在程序中使用方法:
    $this->model(‘name’)->action();
    
    • 可用范围: CONTROLLER, Model
  2. system

    放在 system 目录之下, 类名相对于 system 目录, 将 / 换成 _,例:

    Zend_Mail
    路径: system/Zend/Mail.php
    类名: Zend_Mail
    
    • 在程序中使用方法: new, 静态调用, load_class(‘class_name’);
    • 可用范围: 任意, 不需要带参数实例化建议使用 load_class
  3. config

    放在 system/config 目录之下, 文件内容为一个 $config 数组, 命名为 配置名.php

    • 在程序中使用方法: AWS_APP::config()->get(‘配置名’)->数组下标
    • 可用范围: 任意, 不需要带参数实例化建议使用 load_class

** Autoload **

在初始化脚本 init.php 里加载类

system/init.php

128 load_class('core_autoload');

在 core_autoload的构造过程注册加载处理函数

system/core/autoload.php#__construct

36 spl_autoload_register(array($this, 'loader'));

类加载函数处理

  • 按路径加载
  • 别名类的加载,包括:TPL/FORMAT/HTTP/H/ACTION_LOG
  • models类的加载
  • class类的加载

找到目标类的路径后直接加载,并缓存

require $class_file_location;

self::$loaded_class[$class_name] = $class_file_location;

plugin的model类加载

if (class_exists('AWS_APP', false))
{
    if (AWS_APP::plugins()->model())
    {
        self::$aliases = array_merge(self::$aliases, AWS_APP::plugins()->model());
    }
}

Model读写分离 ←o→ 插件机制

推荐阅读更多精彩内容