Thinkphp5.0.18最高效的实现自定义类的自动加载方式

32人阅读 评论(0) 收藏 举报
分类:

今天看了下,tp5的源码。发现自定义类库的加载方式 是有顺序的。分别是按映射方式 psr4 psr0,其中最高效的,顺序最前的当然是映射方式。

我贴出源码,大家看下。

private static function findFile($class)
    {
        //echo '<pre>';print_r(self::$map);
        // 类库映射
        if (!empty(self::$map[$class])) {

            return self::$map[$class];
        }

        // 查找 PSR-4
        $logicalPathPsr4 = strtr($class, '\\', DS) . EXT;
        //echo $logicalPathPsr4.'<br>';
        $first           = $class[0];
        //echo '<pre>';print_r(self::$prefixLengthsPsr4);
        if (isset(self::$prefixLengthsPsr4[$first])) {
            //echo $class.'<br>';
            foreach (self::$prefixLengthsPsr4[$first] as $prefix => $length) {
                if (0 === strpos($class, $prefix)) {
                    foreach (self::$prefixDirsPsr4[$prefix] as $dir) {
                        if (is_file($file = $dir . DS . substr($logicalPathPsr4, $length))) {
                            return $file;
                        }
                    }
                }
            }
        }

        // 查找 PSR-4 fallback dirs
        foreach (self::$fallbackDirsPsr4 as $dir) {
            if (is_file($file = $dir . DS . $logicalPathPsr4)) {
                return $file;
            }
        }

        // 查找 PSR-0
        if (false !== $pos = strrpos($class, '\\')) {
            // namespace class name
            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
            . strtr(substr($logicalPathPsr4, $pos + 1), '_', DS);
        } else {
            // PEAR-like class name
            $logicalPathPsr0 = strtr($class, '_', DS) . EXT;
        }

        if (isset(self::$prefixesPsr0[$first])) {
            foreach (self::$prefixesPsr0[$first] as $prefix => $dirs) {
                if (0 === strpos($class, $prefix)) {
                    foreach ($dirs as $dir) {
                        if (is_file($file = $dir . DS . $logicalPathPsr0)) {
                            return $file;
                        }
                    }
                }
            }
        }

        // 查找 PSR-0 fallback dirs
        foreach (self::$fallbackDirsPsr0 as $dir) {
            if (is_file($file = $dir . DS . $logicalPathPsr0)) {
                return $file;
            }
        }

        // 找不到则设置映射为 false 并返回
        return self::$map[$class] = false;
    }

所以我们当然就采用映射方式啊。

第一步 在我们的应用模块新建一个用来存第三方类库的目录 如下图



Mytool.php

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/4/15
 * Time: 22:35
 */
namespace Mytool;

class Mytool{
    public static function sh(){
        return 1000;
    }
}


这个是第三方的自己写的类库。。然后控制器调用

<?php
namespace app\index\controller;

use Mytool\Mytool;
use think\Loader;

class Index
{
    public function index()
    {
        //测试最高效的自动加载类库的方式(添加类库映射)
        $mapper = array('Mytool\\Mytool'=>APP_PATH.'index/Mytool/Mytool.php');
        Loader::addClassMap($mapper);
        return Mytool::sh();
    }
}

打印效果



完成。。。。。





查看评论

[php] Thinkphp 加载更多

要实现的效果是这样的: 点击显示更多按钮,再往下显示2条数据。。 数据表: articleList模板文件 include file="./Application/Common/Vi...
  • u010081689
  • u010081689
  • 2015-06-30 23:13:19
  • 2354

Thinkphp 中利用js,ajax写的无限下拉加载效果

控制器代码: public function index(){ $news = M('System_voice'); $news2=M('System_voice')->where(a...
  • ougexingfuba
  • ougexingfuba
  • 2017-06-26 11:50:43
  • 971

thinkphp滚屏加载--无刷新动态加载数据技术的应用

我们浏览有些网页的时候,当拉动浏览器的滚动条时到页底时,页面会继续自动加载更多内容供用户浏览。这种技术我暂且称它为滚屏加载技术。我们发现很多网站用到这种技术,必应图片搜索、新浪微博、QQ空间等将该技术...
  • vailook
  • vailook
  • 2016-08-03 18:23:12
  • 687

Thinkphp 3.23 页面上拉加载 基于ajax分页

Thinkphp 3.23 页面上拉加载 基于ajax分页
  • lzl18918615216
  • lzl18918615216
  • 2017-03-31 14:40:27
  • 891

ThinkPHP中ajax使用实例教程

一、jquery实现方法:MessageAction.class.php页面代码如下:&amp;lt;?phpclass MessageAction extends Action{   functio...
  • qq_31763129
  • qq_31763129
  • 2018-04-16 11:40:06
  • 10

ThinkPHP5+Apicoud+vue商城APP实战

ThinkPHP5+Apicoud+vue商城APP实战目录章节1:项目概述课时1apicloud平台介绍。04:38课时2知识体系架构介绍。16:10章节2:apicloud50分钟快速入门教程课时...
  • qq_33561908
  • qq_33561908
  • 2018-04-17 19:44:57
  • 43

ThinkPHP+jquery实现“加载更多”

ThinkPHP+jquery实现“加载更多”在很多web端界面中都会用到点击按钮加载最新几条数据的demo,下例为使用thinkphp+jquery实现实例:第一步 模板文件 ...
  • haoaiqian
  • haoaiqian
  • 2017-03-10 18:59:22
  • 1352

thinkphp+ajax 移动端实现滚动到底部加载数据(无刷新动态加载数据技术的应用)

thinkphp+ajax 移动端实现滚动到底部加载数据(无刷新动态加载数据技术的应用)
  • a898712940
  • a898712940
  • 2017-12-05 17:48:37
  • 124

PHP+Ajax点击加载更多内容 -这个效果好,速度快,只能点击更多加载,不能滚动自动加载

PHP+Ajax点击加载更多内容 -这个效果好,速度快,JS代码虽然没看懂但感觉很专业写的,测试通过了,现在是点击显示更多才会加载,稍后改改如何自动加载一、HTML部分 ...
  • zyytaiyame
  • zyytaiyame
  • 2016-12-28 11:54:02
  • 4650

thinkphp5.0+js 手机下拉加载更多

一,模板文件 div class="lists switcher-panel switcher-panel-cur"> ul class="xinhao"> {volist name="apps"...
  • qq_37462176
  • qq_37462176
  • 2017-11-30 18:42:11
  • 442
    个人资料
    持之以恒
    等级:
    访问量: 3158
    积分: 590
    排名: 8万+
    最新评论