学习思路之ONETHINK

简介:

前段时间,ThinkPHP 的整体设计思路,包括 各个模块的实现。

TP官方为了测试该框架,写了一个ONEThink,是可以学习下的


不太推荐使用这个,感觉就是测试性质。但是你可以体会下他的设计思路,继续深化思考,就可以重新写一个适合自己的。


比如:测试各种环境,用数组组合一下数据信息

1
2
3
4
5
6
7
$items  array (
         'os'       =>  array ( '操作系统' '不限制' '类Unix' , PHP_OS,  'success' ),
         'php'      =>  array ( 'PHP版本' '5.3' '5.3+' , PHP_VERSION,  'success' ),
         'upload'   =>  array ( '附件上传' '不限制' '2M+' '未知' 'success' ),
         'gd'       =>  array ( 'GD库' '2.0' '2.0+' '未知' 'success' ),
         'disk'     =>  array ( '磁盘空间' '5M' '不限制' '未知' 'success' ),
     );

然后可以利用引用来实现数据的实时更改

1
foreach  ( $items  as  & $val )

再比如:自动化的一些思路,写好一部分配置文件或者SQL语句或者输出文件的模板,然后替换一部分信息

conf.tpl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<? php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> < http: //www.zjzit.cn>
// +----------------------------------------------------------------------
 
/**
  * 系统配文件
  * 所有系统级别的配置
  */
return array(
     /* 模块相关配置 */
     'AUTOLOAD_NAMESPACE' => array('Addons' => ONETHINK_ADDON_PATH), //扩展模块列表
     'DEFAULT_MODULE'     => 'Home',
     'MODULE_DENY_LIST'   => array('Common','User','Admin','Install'),
     //'MODULE_ALLOW_LIST'  => array('Home','Admin'),
 
     /* 系统数据加密设置 */
     'DATA_AUTH_KEY' => '[AUTH_KEY]', //默认数据加密KEY
 
     /* 用户相关设置 */
     'USER_MAX_CACHE'     => 1000, //最大缓存用户数
     'USER_ADMINISTRATOR' => 1, //管理员用户ID
 
     /* URL配置 */
     'URL_CASE_INSENSITIVE' => true, //默认false 表示URL区分大小写 true则表示不区分大小写
     'URL_MODEL'            => 3, //URL模式
     'VAR_URL_PARAMS'       => '', // PATHINFO URL参数变量
     'URL_PATHINFO_DEPR'    => '/', //PATHINFO URL分割符
 
     /* 全局过滤配置 */
     'DEFAULT_FILTER' => '', //全局过滤函数
 
     /* 数据库配置 */
     'DB_TYPE'   => '[DB_TYPE]', // 数据库类型
     'DB_HOST'   => '[DB_HOST]', // 服务器地址
     'DB_NAME'   => '[DB_NAME]', // 数据库名
     'DB_USER'   => '[DB_USER]', // 用户名
     'DB_PWD'    => '[DB_PWD]',  // 密码
     'DB_PORT'   => '[DB_PORT]', // 端口
     'DB_PREFIX' => '[DB_PREFIX]', // 数据库表前缀
 
     /* 文档模型配置 (文档模型核心配置,请勿更改) */
     'DOCUMENT_MODEL_TYPE' => array(2 => '主题', 1 => '目录', 3 => '段落'),
);

然后写一部分替换

1
2
$conf  str_replace ( '[AUTH_KEY]' , $auth , $conf );
$user  str_replace ( '[AUTH_KEY]' , $auth , $conf );

或者说起来的替换或者读取执行

1
2
3
4
5
6
7
8
//读取SQL文件
     $sql  file_get_contents (MODULE_PATH .  'Data/install.sql' );
     $sql  str_replace ( "\r" "\n" $sql );
     $sql  explode ( ";\n" $sql );
 
     //替换表前缀
     $orginal  = C( 'ORIGINAL_TABLE_PREFIX' );
     $sql  str_replace ( " `{$orginal}" " `{$prefix}" $sql );

再比如:TP的扩展最核心的就是Behavior

写一个tags.php

1
2
3
return  array (
         'app_init' => array ( 'Common\Behavior\InitHookBehavior' )
     );

这样就可以使用你想用的组件来进行模板解析,各种权限管理,路由控制,应用的前置后置处理,一些横向切面的工具

这样就可以动态加进来很多组件,也就实现了扩展,你的框架的核心不在于组件,而是你如何让数据流动,组合,以及讲故事。这是程序最值得称赞地方

附录下他的InithookBehavior

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class  InitHookBehavior  extends  Behavior{
     public  function  run(& $content ){
         if (defined( 'BIND_MODULE' ) && BIND_MODULE ===  'Install' return  ;
 
         $data  = S( 'hooks' );
         if (! $data ){
             $hooks  = M( 'Hooks' )->getField( 'name,addons' );
             foreach  ( $hooks  as  $key  =>  $value ) {
                 # code...
                 if ( $value ){
                     $map [ 'status' ] = 1;
                     $names  explode ( ',' , $value );
                     $map [ 'name' ] =  array ( 'in' , $names );
                     $data  = M( 'Addons' )->where( $map )->getField( 'id,name' );
                     if ( $data ){
                         $addons  array_intersect ( $names $data );
                         Hook::add( $key , array_map ( 'get_addon_class' , $addons ));
                     }
                 }
             }
             S( 'hooks' ,Hook::get());
         } else {
             Hook::import( $data ,false);
         }
     }
}
 
//附加组件addons
//由钩子去附件里面去找相应的组件


这就涉及到自动化运维的感觉,这就让人想起来python。


就写这么多吧,技术是属于每个人的,每个人的潜力不同,我们身边有很多人的兴趣点也是不一样的。照顾好自己的生活身体之后,前往顶峰。


愿法界众生,皆得安乐

本文转自 jackdongting 51CTO博客,原文链接:http://blog.51cto.com/10725691/1963481


相关文章
|
5月前
|
存储 算法
智能算法 | 刷题的方法真的找到正确思路了嘛
智能算法 | 刷题的方法真的找到正确思路了嘛
|
10月前
|
算法
写题思路的分享
写题思路的分享
50 0
|
11月前
|
安全 Shell 网络安全
5项目五:W1R3S-1(思路为主!)
5项目五:W1R3S-1(思路为主!)
71 0
|
决策智能 索引 Python
动态规划原理及案例介绍
更多文章可关注我的微信公众号:python学习杂记
194 0
|
机器学习/深度学习 存储 缓存
力扣70爬楼梯:思路分析+优化思路+代码实现+补充思考
力扣70爬楼梯:思路分析+优化思路+代码实现+补充思考
136 0
|
算法 Go 开发者
二分查找的思路分析|学习笔记
快速学习二分查找的思路分析
二分查找的思路分析|学习笔记
|
物联网 开发者 智能硬件
|
物联网 数据库 知识图谱
[视频]理思路|学习笔记(二)
快速学习[视频]理思路|学习笔记
|
存储 算法
算法不难的话,也挺简单的哈
算法不难的话,也挺简单的哈
105 0