小巧PHP框架cola的运行加载过程分析以及php不用循环能不能创建一个长度为100的1-100数组的尝试

本文主要是介绍小巧PHP框架cola的运行加载过程分析以及php不用循环能不能创建一个长度为100的1-100数组的尝试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、小巧PHP框架cola的运行加载过程分析

        publish:November 30, 2018 -Fridayby 因公司一项老业务交接给了我,最近开始看老业务的代码,代码使用的Cola框架,之前我也没用过。但框架都长那样,之前看过CI,laravel,也啃过一点YII,现在又有好久没有接触框架了,于是就想简单看一下这个框架的运行过程。话不多说,开始吧:

    入口文件在定义基本目录路径之后,加载Cola.php和配置文件,然后做了三件事。分别是getInstance(),boot(),dispatch()代码如下:

require COLA_DIR.'/Cola.php';
Cola::getInstance()->boot($config)->dispatch();

    其中:Cola::getInstance() 完成拿到实例化Cola类,定义好MVC等各种功能基类文件路径,然后就是去实例化Cola_Config类。然后使用registerAutoload注册自动加载的方法为Cola::loadClass。getInstance的功能就完成了。代码如下:

protected function __construct()
{$config['_class'] = array('Cola_Router'      => COLA_DIR . '/Router.php','Cola_Model'       => COLA_DIR . '/Model.php','Cola_View'        => COLA_DIR . '/View.php','Cola_Controller'  => COLA_DIR . '/Controller.php','Cola_Com'         => COLA_DIR . '/Com.php','Cola_Com_Widget'  => COLA_DIR . '/Com/Widget.php','Cola_Exception'   => COLA_DIR . '/Exception.php');self::$config = new Cola_Config($config);self::$_config = &self::$config->reference();Cola::registerAutoload();
}

     boot($config) 完成单独的配置文件加载并判断数组,另外将上面的_class字段与这个合并成一个配置数组。

    dispatch() 这个方法进去后第一步通过Router类拿到PATH_INFO数据并通过Router类的match方法分析路由,主要是和用户的自定义路径进行匹配,然后通过_enableDynamicMatch方法拿到controller和action参数。$this->_dispatchInfo就是一个数组里面包括controller和action,另外里面还有一个$file, 我看业务里面没有用到,通过看代码发现它应该是在_urls中除了可以配置controller和action参数外,另外也可以只配置一个文件名或者路径,然后Cola可以通过这两种方式来加载对应的处理文件。除此之处,这个处理文件不一定是类,也可以是方法,因为下面的逻辑可以看到call_user_func可以执行不只有数组参数,还可以直接传入一个方法来处理。

    到这里框架的基本逻辑也就完成了,剩下的就是调用具体控制器的具体方法来进行处理,在对Cola核心类的loadClass自动加载类方法进行输出时,罗列出了Cola自动加载文件的顺序,顺序如下:

Cola_Router------------
业务控制器------------
Cola_Controller------------
Cola_Request------------
业务模型-----------
Cola_Model------------
Cola_Com------------
Cola_Com_Cache------------
Cola_Com_Cache_Redis------------
Cola_Com_Cache_Abstract------------
Cola_Com_Db------------
Cola_Com_Db_Masterslave------------
Cola_Com_Db_Abstract------------
Cola_Com_Db_Pdo_Mysql------------
Cola_Com_Db_Pdo_Abstract------------

    可以看到最先初始化路由,路由确定之后就加载业务控制器,其都是继承核心控制器基类,基类控制器就会去调用核心的Misc辅助类,Request请求数据类,业务模型再去初始化基类模型,连接数据库,缓存。另外在初次使用时我发现Cola框架中有一个错误,当然也许是我的环境有关,我的PHP版本是php7.1。运行中有报错:Fatal error: Only variables can be passed by reference in ...ColaController.php on line 176,在控制器的核心基类ColaController.php第176行代码如下:

#下面是176行的代码

return array_merge(Cola::reg('_params', null, array()), $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV);

#其调用的reg方法$value不允许使用null,因为直接对null取不到值

public static function reg($name = null, &$value = null, $default = null)

#问题的解决方法,不要直接传null

$t = null;
return array_merge(Cola::reg('_params', $t, array()), $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV);

    可以看到array_merge传入的参数是直接的null值,而调用的reg方法在参数引用上对这个值是地址引用,直接对null引用报错从而导致了这个问题。可以使用参数替代即可解决,解决方法在见上面最后两行代码。

二、php不用循环能不能创建一个长度为100的1-100数组?

    今天在写一个小例子的时候,觉得写一个循环创建一个1-100的数组很OUT,但突然一想,php里不用循环怎么创建一个长度为100的1-100数组? 好像一下子又想不到这种函数和方法。感觉自己一下子不会php了似的!惭愧!实际PHP里有这种快速的方法的,其函数名就和python中的一样:range

    range 建立一个包含指定范围单元的数组,包括起始值自身。

array range ( mixed $start , mixed $limit [, number $step = 1 ] )

start:序列的第一个值。 
limit:序列结束于 limit 的值。 
step:如果给出了 step 的值,它将被作为单元之间的步进值。step应该为正值。如果未指定,step 则默认为 1

    但和python中的使用有一点不一样,php必须至少要传入2个参数,即start和limit必须传入,而python可以只传一个参数,比如传一个大于1的整数,此时即代表取从0至这个参数间的所有整数组成的数组。

#range的使用示例
print_r(range(1, 5));echo '<br>';
print_r(range(0, 10, 2));echo '<br>';
print_r(range(9, 1, 2));echo '<br>';
print_r(range('a', 'f'));echo '<br>';
print_r(range('a', 'f', 2));echo '<br>';
print_r(range(-10, -5));echo '<br>';#以上PHP代码执行结果
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) 
Array ( [0] => 0 [1] => 2 [2] => 4 [3] => 6 [4] => 8 [5] => 10 ) 
Array ( [0] => 9 [1] => 7 [2] => 5 [3] => 3 [4] => 1 ) 
Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f ) 
Array ( [0] => a [1] => c [2] => e ) 
Array ( [0] => -10 [1] => -9 [2] => -8 [3] => -7 [4] => -6 [5] => -5 ) 

    也许你会觉得不使用循环,php也就只能使用range来完成这件事了,SORRY,故事到这里还没有结束。我自己又发现不使用循环还有一个方法。结合array_pad这个函数,它可以将数组填充至指定长度。当然array_pad需要结合array_keys提取键,对键做处理以键的自动递增来取得整数数组。不过这里最后得到的是0-99合计100个整数的数组,如下实现:

#此方法也就是只能实现而已吧,最后得到的是0-99合计100个整数的数组
$a = array_keys(array_pad(array() , 100, ''));
#print_r($a);

这篇关于小巧PHP框架cola的运行加载过程分析以及php不用循环能不能创建一个长度为100的1-100数组的尝试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120356

相关文章

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三