Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
6a7a723
修正跳转模板的一处js错误
liu21st Jan 3, 2013
532e673
A方法和D方法在独立分组模式下支持跨分组调用
liu21st Jan 3, 2013
b05e8fd
分组支持行为扩展定义文件
liu21st Jan 3, 2013
36e2b5f
入口文件增加对引擎扩展的载入支持 使用引擎扩展无需改变入口文件 只需要在入口文件中定义
liu21st Jan 6, 2013
1715d2d
调整入口文件,增加ENGIN_PATH常量定义
luofei614 Jan 9, 2013
3ff790e
查询条件支持sql函数,例如:
liu21st Jan 17, 2013
6ad62d9
改进内置的 xml_encode 和 data_to_xml函数,不仅可以用于ajaxReturn还可以用于其他xml数据的返回
Aoiujz Jan 24, 2013
dcf464f
修改xml_encode函数一处逻辑错误
Aoiujz Jan 25, 2013
7de01c8
trace信息增加吞吐率显示,用户能更直观看见对程序的优化效果
luofei614 Feb 13, 2013
91059fa
改进Model类的_parseOptions方法对join的过滤支持
liu21st Feb 26, 2013
b60e330
改进对__INFO__ 常量的定义
liu21st Feb 26, 2013
4063a9a
W方法增加path参数,支持定义Widget类路径
liu21st Feb 26, 2013
c359d4a
修正CacheFile驱动的clear方法
liu21st Mar 1, 2013
1670588
改进action参数绑定的支持 可以同时支持get和post
liu21st Mar 1, 2013
8ec349b
改进文件缓存类的初始化方法
liu21st Mar 1, 2013
52e8d1e
修改RUNTIME_PATH的定义,强制转换为绝对路径,可解决exit退出不能写日志的BUG。建议自定义ThinkPHP相关路径常量时直接…
Aoiujz Mar 5, 2013
9e4e8ea
改进异常输出,更友好的显示系统异常信息
Aoiujz Mar 11, 2013
a6419ce
更改README为 markdown 语法
Aoiujz Mar 11, 2013
7ffc6fd
Update functions.php
wudi Mar 13, 2013
e75e29d
Update App.class.php
Mar 14, 2013
4b1eae8
修正W方法
liu21st Mar 17, 2013
a060310
Merge pull request #32 from eslizn/patch-1
liu21st Mar 17, 2013
53ae5e8
Merge pull request #31 from EagleWu/patch-1
liu21st Mar 17, 2013
ea61b13
数据库驱动的error方法添加输出错误代码
liu21st Mar 19, 2013
8ed0e3d
删除无用注释
liu21st Mar 22, 2013
d271ad8
Model类的result方法改进 支持callback方式,例如:
liu21st Mar 25, 2013
8466ca9
增加I方法用于安全的获取系统变量,支持过滤和默认值。
liu21st Mar 27, 2013
1232272
改进I方法
liu21st Mar 27, 2013
c6b5c59
I方法支持PHP内置的过滤方法,例如:
liu21st Mar 27, 2013
0c50ece
修正I方法的一处错误
liu21st Mar 27, 2013
716a82d
修正notbetween标签条件判断错误
luofei614 Mar 28, 2013
bb40000
Merge branch 'master' of https://github.com/liu21st/thinkphp
luofei614 Mar 28, 2013
7fa02cc
改进Think类的appException方法 简化异常页面显示信息
liu21st Apr 1, 2013
fab517b
改进 致命错误抛出异常的显示机制
liu21st Apr 1, 2013
d6513a0
改进S方法 修正一处警告错误
liu21st Apr 2, 2013
3d862bf
修正pathinfo的兼容判断
luofei614 Apr 2, 2013
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
## 简介

ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

## 全面的WEB开发特性支持

最新的ThinkPHP为WEB应用开发提供了强有力的支持,这些支持包括:

* MVC支持-基于模型(M)、视图(V)、控制器(C)的设计模式
* ORM支持-提供了全功能和高性能的ORM支持,支持大部分数据库
* 模板引擎支持-内置了高性能的基于标签库和XML标签的编译型模板引擎
* RESTFul支持-REST模式提供了RESTFul支持,为你打造全新的URL设计和访问体验
* SAE支持-提供了新浪SAE平台的强力支持,具备“横跨性”和“平滑性”,支持本地化开发和调试以及部署切换,打造全新的SAE开发体验
* CLI支持-支持基于命令行的应用开发
* AMF支持-支持Flex开发和Flash通讯,打造互联网富应用
* PHPRPC支持-提供基于PHPRpc的WEBService解决方案
* MongoDb支持-提供NoSQL的支持
* 缓存支持-提供了包括文件、数据库、Memcache、Xcache、Redis等多种类型的缓存支持

## 大道至简的开发理念

ThinkPHP从诞生以来一直秉承大道至简的开发理念,无论从底层实现还是应用开发,我们都倡导用最少的代码完成相同的功能,正是由于对简单的执着和代码的修炼,让我们长期保持出色的性能和极速的开发体验。在主流PHP开发框架的评测数据中表现卓越,简单和快速开发是我们不变的宗旨。

## 安全性

框架在系统层面提供了众多的安全特性,确保你的网站和产品安全无忧。这些特性包括:

* XSS安全防护
* 表单自动验证
* 强制数据类型转换
* 输入数据过滤
* 表单令牌验证
* 防SQL注入
* 图像上传检测

## 商业友好的开源协议

ThinkPHP遵循Apache2开源协议发布。Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再作为开源或商业软件发布。
36 changes: 0 additions & 36 deletions README.txt

This file was deleted.

102 changes: 96 additions & 6 deletions ThinkPHP/Common/common.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,86 @@
* @author liu21st <liu21st@gmail.com>
*/

/**
* 获取输入参数 支持过滤和默认值
* 使用方法:
* <code>
* I('id',0); 获取id参数 自动判断get或者post
* I('post.name','','htmlspecialchars'); 获取$_POST['name']
* I('get.'); 获取$_GET
* </code>
* @param string $name 变量的名称 支持指定类型
* @param mixed $default 不存在的时候默认值
* @param mixed $filter 参数过滤方法
* @return mixed
*/
function I($name,$default='',$filter='') {
if(strpos($name,'.')) { // 指定参数来源
list($method,$name) = explode('.',$name);
}else{ // 默认为自动判断
$method = 'param';
}
switch(strtolower($method)) {
case 'get' : $input =& $_GET;break;
case 'post' : $input =& $_POST;break;
case 'put' : parse_str(file_get_contents('php://input'), $input);break;
case 'param' :
switch($_SERVER['REQUEST_METHOD']) {
case 'POST':
$input = $_POST;
break;
case 'PUT':
parse_str(file_get_contents('php://input'), $input);
break;
default:
$input = $_GET;
}
if(C('VAR_URL_PARAMS')){
$params = $_GET[C('VAR_URL_PARAMS')];
$input = array_merge($input,$params);
}
break;
case 'request' : $input =& $_REQUEST; break;
case 'session' : $input =& $_SESSION; break;
case 'cookie' : $input =& $_COOKIE; break;
case 'server' : $input =& $_SERVER; break;
case 'globals' : $input =& $GLOBALS; break;
default:
return NULL;
}
// 全局过滤
// array_walk_recursive($input,'filter_exp');
if(C('VAR_FILTERS')) {
$_filters = explode(',',C('VAR_FILTERS'));
foreach($_filters as $_filter){
// 全局参数过滤
array_walk_recursive($input,$_filter);
}
}
if(empty($name)) { // 获取全部变量
$data = $input;
}elseif(isset($input[$name])) { // 取值操作
$data = $input[$name];
$filters = isset($filter)?$filter:C('DEFAULT_FILTER');
if($filters) {
$filters = explode(',',$filters);
foreach($filters as $filter){
if(function_exists($filter)) {
$data = is_array($data)?array_map($filter,$data):$filter($data); // 参数过滤
}else{
$data = filter_var($data,is_int($filter)?$filter:filter_id($filter));
if(false === $data) {
return isset($default)?$default:NULL;
}
}
}
}
}else{ // 变量默认值
$data = isset($default)?$default:NULL;
}
return $data;
}

/**
* 记录和统计时间(微秒)和内存使用情况
* 使用方法:
Expand Down Expand Up @@ -264,7 +344,13 @@ function D($name='',$layer='') {
$name = C('DEFAULT_APP').'/'.$layer.'/'.$name;
}
if(isset($_model[$name])) return $_model[$name];
import($name.$layer);
$path = explode('/',$name);
if(count($path)>3 && 1 == C('APP_GROUP_MODE')) { // 独立分组
$baseUrl = $path[0]== '@' ? dirname(BASE_LIB_PATH) : APP_PATH.'../'.$path[0].'/'.C('APP_GROUP_PATH').'/';
import($path[2].'/'.$path[1].'/'.$path[3].$layer,$baseUrl);
}else{
import($name.$layer);
}
$class = basename($name.$layer);
if(class_exists($class)) {
$model = new $class(basename($name));
Expand Down Expand Up @@ -311,15 +397,19 @@ function A($name,$layer='',$common=false) {
$name = '@/'.$layer.'/'.$name;
}
if(isset($_action[$name])) return $_action[$name];
if($common){ // 独立分组情况下 加载公共目录类库
$path = explode('/',$name);
if(count($path)>3 && 1 == C('APP_GROUP_MODE')) { // 独立分组
$baseUrl = $path[0]== '@' ? dirname(BASE_LIB_PATH) : APP_PATH.'../'.$path[0].'/'.C('APP_GROUP_PATH').'/';
import($path[2].'/'.$path[1].'/'.$path[3].$layer,$baseUrl);
}elseif($common) { // 加载公共类库目录
import(str_replace('@/','',$name).$layer,LIB_PATH);
}else{
import($name.$layer);
}
import($name.$layer);
}
$class = basename($name.$layer);
if(class_exists($class,false)) {
$action = new $class();
$_action[$name] = $action;
$action = new $class();
$_action[$name] = $action;
return $action;
}else {
return false;
Expand Down
74 changes: 44 additions & 30 deletions ThinkPHP/Common/functions.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,10 @@ function halt($error) {
$trace = debug_backtrace();
$e['message'] = $error;
$e['file'] = $trace[0]['file'];
$e['class'] = isset($trace[0]['class'])?$trace[0]['class']:'';
$e['function'] = isset($trace[0]['function'])?$trace[0]['function']:'';
$e['line'] = $trace[0]['line'];
$traceInfo = '';
$time = date('y-m-d H:i:m');
foreach ($trace as $t) {
$traceInfo .= '[' . $time . '] ' . $t['file'] . ' (' . $t['line'] . ') ';
$traceInfo .= $t['class'] . $t['type'] . $t['function'] . '(';
$traceInfo .= implode(', ', $t['args']);
$traceInfo .=')<br/>';
}
$e['trace'] = $traceInfo;
ob_start();
debug_print_backtrace();
$e['trace'] = ob_get_clean();
} else {
$e = $error;
}
Expand Down Expand Up @@ -70,7 +62,7 @@ function halt($error) {
*/
function throw_exception($msg, $type='ThinkException', $code=0) {
if (class_exists($type, false))
throw new $type($msg, $code, true);
throw new $type($msg, $code);
else
halt($msg); // 异常类型不存在则输出错误信息字串
}
Expand Down Expand Up @@ -295,11 +287,13 @@ function U($url='',$vars='',$suffix=true,$redirect=false,$domain=false) {
* @param string $name Widget名称
* @param array $data 传人的参数
* @param boolean $return 是否返回内容
* @param string $path Widget所在路径
* @return void
*/
function W($name, $data=array(), $return=false) {
function W($name, $data=array(), $return=false,$path='') {
$class = $name . 'Widget';
require_cache(BASE_LIB_PATH . 'Widget/' . $class . '.class.php');
$path = empty($path) ? BASE_LIB_PATH : $path;
require_cache($path . 'Widget/' . $class . '.class.php');
if (!class_exists($class))
throw_exception(L('_CLASS_NOT_EXIST_') . ':' . $class);
$widget = Think::instance($class);
Expand Down Expand Up @@ -390,7 +384,11 @@ function S($name,$value='',$options=null) {
}elseif(is_null($value)) { // 删除缓存
return $cache->rm($name);
}else { // 缓存数据
$expire = is_numeric($options)?$options:NULL;
if(is_array($options)) {
$expire = isset($options['expire'])?$options['expire']:NULL;
}else{
$expire = is_numeric($options)?$options:NULL;
}
return $cache->set($name, $value, $expire);
}
}
Expand Down Expand Up @@ -483,31 +481,47 @@ function to_guid_string($mix) {
/**
* XML编码
* @param mixed $data 数据
* @param string $encoding 数据编码
* @param string $root 根节点名
* @param string $item 数字索引的子节点名
* @param string $attr 根节点属性
* @param string $id 数字索引子节点key转换的属性名
* @param string $encoding 数据编码
* @return string
*/
function xml_encode($data, $encoding='utf-8', $root='think') {
$xml = '<?xml version="1.0" encoding="' . $encoding . '"?>';
$xml .= '<' . $root . '>';
$xml .= data_to_xml($data);
$xml .= '</' . $root . '>';
function xml_encode($data, $root='think', $item='item', $attr='', $id='id', $encoding='utf-8') {
if(is_array($attr)){
$_attr = array();
foreach ($attr as $key => $value) {
$_attr[] = "{$key}=\"{$value}\"";
}
$attr = implode(' ', $_attr);
}
$attr = trim($attr);
$attr = empty($attr) ? '' : " {$attr}";
$xml = "<?xml version=\"1.0\" encoding=\"{$encoding}\"?>";
$xml .= "<{$root}{$attr}>";
$xml .= data_to_xml($data, $item, $id);
$xml .= "</{$root}>";
return $xml;
}

/**
* 数据XML编码
* @param mixed $data 数据
* @param mixed $data 数据
* @param string $item 数字索引时的节点名称
* @param string $id 数字索引key转换为的属性名
* @return string
*/
function data_to_xml($data) {
$xml = '';
function data_to_xml($data, $item='item', $id='id') {
$xml = $attr = '';
foreach ($data as $key => $val) {
is_numeric($key) && $key = "item id=\"$key\"";
$xml .= "<$key>";
$xml .= ( is_array($val) || is_object($val)) ? data_to_xml($val) : $val;
list($key, ) = explode(' ', $key);
$xml .= "</$key>";
if(is_numeric($key)){
$id && $attr = " {$id}=\"{$key}\"";
$key = $item;
}
$xml .= "<{$key}{$attr}>";
$xml .= (is_array($val) || is_object($val)) ? data_to_xml($val, $item, $id) : $val;
$xml .= "</{$key}>";
}
return $xml;
}
Expand Down Expand Up @@ -750,4 +764,4 @@ function filter_exp(&$value){
if (in_array(strtolower($value),array('exp','or'))){
$value .= ' ';
}
}
}
3 changes: 2 additions & 1 deletion ThinkPHP/Lib/Behavior/ShowPageTraceBehavior.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ private function showTrace() {
$base = array(
'请求信息' => date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME']).' '.$_SERVER['SERVER_PROTOCOL'].' '.$_SERVER['REQUEST_METHOD'].' : '.__SELF__,
'运行时间' => $this->showTime(),
'吞吐率' => number_format(1/G('beginTime','viewEndTime'),2).'req/s',
'内存开销' => MEMORY_LIMIT_ON?number_format((memory_get_usage() - $GLOBALS['_startUseMems'])/1024,2).' kb':'不支持',
'查询信息' => N('db_query').' queries '.N('db_write').' writes ',
'文件加载' => count(get_included_files()),
Expand Down Expand Up @@ -124,4 +125,4 @@ private function showTime() {
// 显示详细运行时间
return G('beginTime','viewEndTime').'s ( Load:'.G('beginTime','loadTime').'s Init:'.G('loadTime','initTime').'s Exec:'.G('initTime','viewStartTime').'s Template:'.G('viewStartTime','viewEndTime').'s )';
}
}
}
Loading