前段时间,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