Notephp以Smarty作为模板引擎的简约型PHPMVC,框架风格结构吸取国内优秀的thinkphp框架与简约快速的Codeigniter框架,你可以轻松的阅读Noetphp 核心类文件里面的每行代码。你可根据自己的需要更改里面的核心文件,添加任意有趣的东西,把它打造成你自己开发的工具,所以建议大家发挥自己想法,根据自己需要修改框架,或把你的想法Email给我hebarguan@gmail.com,有疑问 这里,也欢迎大家Pull Request!
- 项目总目录
./Webapp
- 模块目录
./Webapp/Home(入口文件默认定义)
- 项目日志记录目录
./Webapp/Log
- 项目自定义扩展目录
./Webapp/Extends
- 项目公共配置目录
./Webapp/Common/Conf
- 项目公共函数目录
./Webapp/Common/Function(默认遍历里面所有php文件)
- 模块模型目录
./Webapp/Home/Model
- 模块控制器目录
./Webapp/Home/Controller
- 模块模板文件目录
./Webapp/Home/View
- 模块模板编译目录
./Webapp/Home/Runtime/Compile
- 模块模板缓存目录
./Webapp/Home/Runtime/Cache
- 模块数据缓存目录
./Webapp/Home/Runtime/Data
$ git clone git@github.com:hebarguan/notephp.git ~/根目录
$ chmod -R 755 notephp
点击 Download ZIP解压直接将目录文件拷贝到你的根目录下
若要隐藏路由中index.php
:
Apache下: 不用配置,根目录下有.htaccess文件
Nginx下:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?$1 last;
}
}
或者:
location / {
try_files $uri $uri/ /index.php?$uri&args;
}
描述: 框架的入口文件,在这例可以添加自己的设置和常量
常量:
APP_NAME
模块的名称,默认是Home,若有多模块,该值将是默认模块
DEBUG_ON
调试选项,开发阶段要显示错误信息建议设置为true
,项目结束后再设置为false
ERROR_IGNORE_TYPE
不显示的错误类型,多个错误类型以,
分开,设置后将不捕捉此类型的错误
提示: 更改APP_NAME
的值,重新运行,可创建新模块,多模块通过该方法创建
描述: 项目的公共配置文件是目录./Webapp/Common/Conf
下的configure.php
注意: 该目录下也可以添加特定模块的配置文件,如Admin
模块的配置文件(模块的小写)命名为admin.php
,公共配置文件与该配置文件的相同的配置项将会被覆盖
配置示例:
<?php
return array(
"DB_TYPE" => "mysql", // 数据库类型
"DB_USER" => "root" , // 数据库用户名
"DB_HOST" => "localhost", // 数据库主机
"DB_NAME" => "notephp", // 数据库名
"DB_PASSWORD" => "123456", // 数据库密码
"URL_HIDE_MODULE" => true, // 开启自动隐藏模块
"URL_MODE" => 1 ,
);
配置提示:
配置数据键必须是大写字母DB_NAME
不能写成db_name
.
更多配置选项请查看核心默认配置文件./notephp/Common/Conf/default.php
##项目模块
描述: 第一次运行时自动创建的模块,多模块也同样使用该方法创建,只需要更改入口文件内的APP_NAME
即可
**提示:**开启路由自动隐藏模块功能URL_HIDE_MODULE => true
路由访问由http://localhost/Home/Index/index
变为http://localhost/Index/index
描述: 多用于功能块分发,例如前台模块,后台模块
配置参数: 如果存在多个模块,请在配置文件里添加MODULE_LIST
和MODULE_DEFAULT
两个选项
访问方式: http://localhost/Admin(模块名)/Index/index
配置示例:
"MODULE_LIST" => "Home,Admin,Manage", // 模块列表
"MODULE_DEFAULT" => "Home", // 默认模块,可以不设置默认是入口文件定义的APP_NAME
注意
如果开启了路由自动隐藏模块即URL_HIDE_MODULE => true(默认是false)
,这里只对默认模块进行路由模块隐藏,将访问不了其它模块
若要开启自动隐藏模块,又要使用多模块功能,请参考子域名部署
**描述:**当访问某个定子域名时,要指定运行特定模块,可以使用子域名部署
配置:
return array(
"sub_domain_rules" => array(
"admin.example.com" => "admin",
"manage.example.com" => "manage"
),
);
示例:
当访问admin.example.com时相当于访问www.example.com/admin/
提示: 开发阶段可以先用http://localhost/admin/
代替访问测试
描述:
路由的基本结构http://localhost/(模块)/(控制器名)/(操作方法)
,
路由访问映射http://localhost/ => http://location/(默认模块APP_NAME)/(默认控制器Index)/(默认操作index)
也就是说http://localhost/Home/
等于访问 http://localhost/Home/(默认控制器)Index/(默认操作)index
http://localhost/Home/Test/
等于访问 http://localhost/Home/Test/index(默认操作)
若开启路由自动隐藏模块,访问http://localhost/Index/index
等于访问 http://localhost/(模块名)/Index/index
配置示例:
return array(
"URL_MODE" => 1, // 路由模式
"URL_HIDE_MODULE" => true, // 路由自动隐藏模块
);
示例: http://localhost/Home/Index/index?day=12&month=5&year=2016
路由重写示例:
return array(
"URL_REWRITE_RULES" => array(
"/^(\/test)/" => "/index/out",
// 访问http://localhost/test 等于访问 http://localhost/index/out
),
);
*提示:*路由重写的内容是路由http://localhost
后面的字符串,匹配规则为正则表达式
示例: http://localhost/Home/index/index/day/12/month/5/year/2016
路由映射示例:
return array(
"URL_MAP_RULES" => array(
"/view/:day/:month/:year" => "/index/test",
// 访问http://localhost/view/12/5/2016 等同http://localhost/index/test/day/12/motch/5/year/2015
),
);
注意: 路由重写的GET参数是限制个数的,默认是6个即/view/:day/:month/:year/:hour/:minute/:second/:invaild)
中的invaild
无效,可以在配置文件添加自定义个数GET_FIELDS_LENGTH => (int)
伪静态: 配置添加URL_STATIC_SUFFIX => (string)'xhtml'
,路由http://localhost/home/index/index
与http://localhost/home/index/index.xhtml
等效
区分大小写: 只对操作方法有效,即http://localhost/home/index/test
与http://localhost/home/index/Test
是有区别的,配置选项URL_CASE_INSENSITIVE => (bool)
,默认为false
不区分大小写
描述: 控制器为处理用户数据的逻辑层,一个操作方法最多可对应一个模板文件
命名规则: 以驼峰式命名控制器类文件,如IndexController.class.php
且类名与控制器类名必须相同
配置参数: 配置参数有默认控制器DEFAULT_CONTROLLER
,默认操作方法DEFAULT_METHOD
;
控制器类示例:
<?php
class IndexController extends Controller
{
public function index()
{
echo "Hi ~ You";
}
}
控制器内置操作方法
assign()
模板赋值操作
示例
class IndexController Extends Controller
{
public function index()
{
$sayHi = "Hi";
$toWho = "hebar";
$this->assign('word', $sayHi);
$this->assign('name', $toWho);
// 或使用数组模式
$message = array('word' => $sayHi, 'name' => $toWho);
$this->assign($message);
}
}
display()
模板显示操作,参数$template
默认为空,表示显示当前操作方法对应模板文件
示例
$this->assign('foo', 'hello world !');
// 显示模板
$this->display();
// 注意:一旦调用类display方法下面的所有操作将无效,这里为了演示下面继续操作
// 可以指定要显示模板文件,相对路径
$templateFile = "./Webapp/Home/Home/View/Index/test.tpl";
$this->display($templateFile);
show()
输出数据内容,可以是HTML实体,或普通字符串
实例
$html = "<h1> 标题 </h1&gl";
// 或html字符串 $html = "<h1>标题</h1>";
// 或
$this->show($html);
dataReturn()
返回数据,配置DATA_RETURN_TYPE
,默认是json
示例
$data = array('states' => 1, 'msg' => 'success');
$this->dataReturn($data);
redirect()
路由重定向,可以是完整路由,也可以是控制器操作方法
示例
/*
* @param $url 重定向路由
* @param $msg 跳转页面的提示
* @param $time 延迟时间
* 跳转模板对应的三个变量{$redirectMsg} {$delayedTime} {$redirectUrl}
* 重定向跳转模板文件为配置 REDIRECT_FILE, 默认是./notephp/Tpl/redirect.tpl
*/
$this->redirect('https://www.baidu.com');
// 跳转提示,5秒跳转到http://localhost/index/dita
$this->redirect('/index/dita', '跳转中...', 5);
描述: 用于数据库操作
配置参数示例:
return array(
"DB_TYPE" => "mysql", // 数据库类型
"DB_USER" => "root" , // 数据库用户名
"DB_HOST" => "localhost", // 数据库主机
"DB_NAME" => "notephp", // 数据库名
"DB_PASSWORD" => "123456", // 数据库密码
"DB_PERSISTENT_LINK" => false, // 数据库持久连接,默认为false,不持久连接
"CURD_TYPE" => "mysql", // 数据库操作扩展 mysql,DatabaseObject(PDO)两种,默认是mysql
"MYSQL_CONNECT_ENCODING"=> "utf8" , // 数据库链接编码,默认是utf8防止中文乱码
);
实例该类:
/* 使用内置函数M()实例方法
* M函数有两个参数$table,$bool
* @param $table 要实例的模型或数据库表
* @param $bool 用户模型是否存在,默认是true,说明存在文件./Webapp/Home/Model/($table)Model.class.php
*/
$mode = M('user');
// 如User模型不存在
$mode = M('user', false); // 将直接实例user数据库表,且数据库表是由小写字母组成
$data = $mode->execute(1); // 查找id=2的数据,返回一个一维数组
var_dump($data);
最简洁的方法是在控制器的构造方法中自动加载:
class IndexController extends Controller
{
public funcion __construct()
{
parent::_construct();
// 模型目录中必须要存在TestModel.class.php文件却类名为TestModel必须
$this->model = new TestModel();
}
/*
* 调用模型的方法,处理数据
*/
public function index()
{
$this->model->getResult();
}
}
描述: 该类方法用于数据库CURD筛选条件,不区分调用顺序,即$mode->fields()->trans()
与$mode->trans()->fields()
等效
提示: 使用条件方法查找获取数据时,将返回一个二维数组且每个元素代表一个字段,值对应的数据行
描述: 查找数据行指定字段
示例:
/* 不调用该方法,表示查找所有字段
* 参数为字符串类型,多个字段以`,`分开
*/
$data = $this->fields('name,salary')->execute();
// 等效的SQL语句为SELECT name,salary FROM employee
$data = $this->fields('DISTINCT department')->execute();
/* fields('COUNT(*) AS members')
* fields('SUM(salary)')
* 这里可以添加各种数据库字段查询函数
*/
#####limit
描述: 限制查询的行数
示例
/* 该方法有连个参数$offset起始行,$rows行数
* 当只有一个参数的时候,表示查找前$param 行
*/
$rows = $this->limit(6)->execute(); // 将返回前6行
$rows = $this->limit(3, 4)->execute(); // 从第3行起,返回4行
#####page
描述: 自动读取分页数据一般结合limit使用
示例
/* 查询页数
* @param int|string $page 页数
*/
// 读取第二页,每页四行
$rows = $this->page(2)->limit(4)->execute();
// 返回查询的总页数
$sumpage = $this->sumpage;
#####join
描述: 多表查询
示例
$this->where('uid', 2);
$this->from('user As a')->join('class AS b', 'a.id=b.uid);
$result = $this->execute();
$row = $result->row();
#####from
描述: 查询表
示例
$this->from('user');
$this->from('user AS a, money AS b');
#####where
描述: 数据库条件查询
示例:
/* (字符串)方式
* 字符串类型更接近源生的Where条件,所以将不对数据进行过滤
* 要使用字符串类型需要自己手动过滤数据,且要求掌握Mysql语句风格防止语法错误或漏洞
* 建议只对简单的数字型数据提供查询
* 例如Where('id=2') 大多数情况建议使用数组模式
*/
$userInput = intval($_GET['id']);
$query = $mode->where("id=$userInput")->execute();
/* (单字段)数组模式
* 下面将对各种(单字段)组合模式进行举例
*/
$this->where('uid', 2)->execute();
$condition = array('id' => 2);
$query = $mode->where($condition)->execute();
// 对应的SQL语句是 'SELECT * FROM employee WHERE id=2 '
$condition = array('id' => array('>', 10));
// 对应的SQL语句是 'SELECT * FROM employee WHERE id>2 '
$condition = array('id' => array(array('>', 3), array('<', 20), 'AND'));
// 对应SQL语句 'SELECT * FROM employee WHERE id > 3 AND id < 20'
// 特殊条件符号NOT IN, IN
$condition = array('id' => array('IN', '2,5,8'));
// 字符串必须要用数组模式
$condition = array('name' => array('IN', array('li', 'zhang', 'wu')));
// BETWEEN NOT BETWEEN举例
$condition = array('id' => array('BETWEEN', '1,3'));
// 更多特殊查询
$condition = array('name' => array('LIKE', '%e\n'\%''));
$condition = array('name' => array('REGEXP', 'guan$'));
/* (多字段)数组模式
* 提示:多字段与单字段唯一不同在于,多字段条件数组可以使用多个元素
* 注意:多字段的个数无限制,最后一个元素必须为并列符号,即AND或OR
* 当只有两个字段时,并列符号可以不填,默认是AND
* 下面对多字段进行举例
*/
$condition = array(
'department' => 'hr',
'salary' => array(array('>', 5000), array('<', 20000)),
'id' => array(array('BETWEEN', '2,16'), array('NOT IN', '5,11')),
'AND'
);
// 对应SQL语句
/*'SELECT * FROM employee
* WHERE
* (department='hr') AND
* (salary > 5000 AND salary < 20000 ) AND
* (id BETWEEN 2 AND 16 AND id NOT IN (5,11) )
*'
*/
描述: 对数据行按指定字段排序
示例:
/* 参数为字符串
* 多个字段以','分开
* 常见ASC升序,DESC降序
*/
$query = $this->order('salary desc')->execute();
// 多个字段排序
$query = $this->order('on_duty asc,salary desc')->execute();
描述: 对数据进行过滤
示例:
/* 参数为数组
* 通常用于数据修改和数据写入过滤
*/
$inputData = array('name' => 'zhao', 'sex' => 1, 'salary' => 6000, 'department' => 'it');
$insertID = $this->data($inputData)->add();
// 对数据修改
$updataData = array('department' => 'hr');
$affectedRows = $this->data($updataData)->where(['name' => 'zhao'])->save();
// 对于数字型数据自增,建议使用下面方法
$increment = array('salary=salary+500' => '');
$affectedRows = $this->data($increment)->where(['department' => 'hr'])->execute();
描述: 对字段进行按组查询
示例:
/* 参数为字符串
* 对于非ENUM()设置的字段同样有效
*/
$query = $mode->group('name,salary')->execute();
// 也可以结合having使用
$query = $this->fields('COUNT(*) AS members')->group('sex')->having(array('sex' => 'F'))->execute();
描述: 指定字段存在某个值
实例:
/* 参数为键值对应数组
* 使用自定义符号,值为一个数据
* 且第一个元素是符号
*/
$query = $this->having(array('name' => 'hebar'))->execute();
// 对应SQL语句SELECT * FROM employee HAVING name = 'hebar'
$query = $this->having(array('id' => array('>', 12)))->execute();
// 对应SQL语句SELECT * FROM employee HAVING id > 12
描述: 检测数据是否存在
示例:
/* 参数为boolean类型
* 成功时返回查找到的行数
*/
$check = $this->Where(array('name' => 'hebar', 'password' => '12345'))->check(true)->execute();
// 输出int(1)
描述: 事务滚动,紧在PDO数据库扩展下有效
示例:
/* 参数为bool类型
* 下面为实例
*/
$query = $this->data(array('salary=salary+500' => ''))
->where(array('name' => 'hebar'))
->trans(true)
->execute();
描述: 查询预处理,紧在PDO数据库扩展下有效
示例:
/* 参数为bool类型
* 比较适合简单重复的查询
*/
$query = $this->where(array('id' => 1))->stmt(true)->execute();
描述: 终止当前数据模型操作,并返回结果
描述: 执行数据查询
示例:
/* 参数为数字或为空
* 若为数字,将返回id为该数字的数据行,且为一维数组
*/
$query = $this->execute(1);
//对应的SQL语句为'SELECT * FROM employee WHERE id=1'
// 提示:当execute()有参数时,前面的连贯操作无效
// 例如:
$query = $this->where(['name' => 'hebar', 'id' => 1])->execute(2);
// 将返回(bool)false
// 注意:若参数为空,且只有一个execute方法时,将返回该表全部数据行
$query = $this->execute();
// 上面的语句将返回该表全部数据行
描述: 修改数据库数据
示例:
/* 参数为数组或为空
* 当参数为空时,要用到操作方法data存放数据
*/
$data = array('salary' => 6000);
$update = $this->where(['id' => 12])->save($data);
$dataUpdate = $this->where(['id' => 12])->data($data)->save();
// 上面两种方法相同
// 对应的SQL语句'UPDATE employee SET salary=6000 WHERE id=12 '
// 使用自增修改
$incrementData = array('score=score+5' => '');
$updata = $this->where('id=1')->data($data)->save();
// 对应的SQL语句'UPDATE employee SET score=score+5 WHERE id=1 '
描述: 添加数据行
示例:
/* 参数为数组或空
* 添加成功返回该行的id
* 若该数据库表无id字段,将返回执行结果
*/
$data = array(
'name' => 'hebarguan',
'sex' => 2,
'salary' => 8000,
'mailbox'=> 'hebarguan@gmail.com',
'on_duty' => '20140601',
'department' => 'it'
);
$add = $this->add($data);
$dataAdd = $this->data($data)->add();
// 以上两种模式效果一样
描述: 删除数据行
示例:
/* 参数为数字或空
* 若参数为数字将删除id为该数字的行
* 删除成功返回影响行数
* 失败返回false
*/
$delete = $this->delete(5);
$conditionDelete = $this->where('id=5')->delete();
// 以上的执行效果一样
// 对应的SQL语句 'DELETE FROM employee WHERE id=5 '
// 更多复杂的条件筛选请参考上面的连贯操作
// 只需在终止方法使用delete即可
描述: 返回执行的SQL语句
示例:
/* 参数为字符串
* 参数选项有,execute,add,save,delete
* 默认是execute
*/
$sql = $this->where('id=1')->returnSql();
// 返回'SELECT * FROM employee WHERE id=1'
$sql = $this->where('id=1')->returnSql('delete');
// 返回'DELETE FROM employee WHERE id=1'
$sql = $this->data('salary' => 5000)->wher('id=1')->return('save');
// 返回'UPDATE employee SET salary=5000 WHERE id=1'
$sql = $this->data(array('name' => 'hebar', 'password' => '123'))->returnSql('add');
// 返回'INSERT INTO employee (name, password) VALUES('hebar', '123')'
- 返回一行(object)/row
- 返回全部结果(object)/result
- 返回数组结构(array)/fetchArray
- [返回结果行数(int)/numRows](#numRows)
{
$result = $this->from('user')->execute();
// 返回结果一行,默认返回对象类型,若要返回数组带参数true
$row = $result->row();
$rowArray = $result->row(true);
// 返回全部结果对象
$resultObject = $result->result();
// 返回全部数据数组结构
$resultArray = $result->fetchArray();
// 返回查询的行数
$resultRowNum = $result->numRows();
}
## 视图模板
**描述:** 用于向浏览器返回指定页面
**模板后缀:** 配置选项`TEMP_DEFAULT_SUFFIX`,默认是`tpl`
**模板规则:** 在模块下面的`View`目录下的模板命名规则有两种方式:1`View/Index(目录)/index.tpl`,2`View/Index_index.tpl`,默认是第一种,可以修改配置项`TEMP_METHOD => (int)`,`Index`是项目模块控制器的名称
**模板缓存:** 配置选项`SMARTY_TEMPLATE_CACHE`默认是`false`表示不缓存,缓存时间有配置选项`SMARTY_CACHE_LIFETIME`默认是3600秒,你也可以手动设置对特定模板缓存:
```php
// 在控制器操作方法里面设置
$this->caching = true;
// 设置缓存过期时间
// 这里设置60秒过期,从新生成缓存文件
$this->cacheLifeTime = 60;
// 显示页面
$this->display();
模板标签: 开启标签SMARTY_LEFT_DELMITER => '{'
,结束标签SMARTY_RIGHT_DELMITER => '}'
,可根据自己的需要自定义更改
提示: 模板使用的是比较出色的Smarty模板,手册请自行参考官方文档
注意: 在模板文件下面调用自定义函数,即模块/Common/Function
目录下的自定义函数库,可以直接在标签内调用函数名;如果发现BUG
,希望能Email给我或自行解决,然后Pull Request给我吧!
描述: 对大小型数据进行缓存或储存
####Memcached缓存
描述: 以函数的方法缓存,函数名Cache()
配置选项:
return array(
"MEMCACHED_CONF" => array( // Mencached配置
"SERVERS" => array( // Mencached服务器连接池
array("localhost", 11211, 100),
// 更多Memcached服务器
),
"EXPIRATION" => 0 // 数据键过期时间,0为持久有效
)
);
提示: 该缓存以函数方法进行进行简约封装
示例:
/* Mencached的命令很多,这里只封装部分命令
* 为了满足用户自定义操作,调用Cache()可返回Mencached的实例
* 单个事件只能缓存1024kb大小的数据,要缓存大数据请使用RedisStorage类
*/
$cacheData = Cache('name', 'hebarguan');
// 获取缓存数据
$getCacheData = Cache('name');
// 输出:'hebarguan'
// 设置5秒过期时间
$expire = 5;
$expireCache = Cache('word', 'I will be delete in 5 seconds', $expire);
// 缓存多条数据
$multiCache = array('name' => 'hebarguan', 'password' => '1234', 'time' => '20160601');
$cache = Cache($multiCache);
// 设置10缓存时间
$expire = 10;
$cache = Cache($multiCache, $expire);
// 获取多条缓存数据
$getCache = array('name', 'password');
$getMultiCache = Cache($getCache);
// 返回键值对应的数组
// 删除缓存数据
// 成功时返回true
// 失败时返回错误码
$deleteCache = Cache('name', '');
// 延迟10秒删除数据
$expireDelete = Cache('name', '', 10);
// 上面的这条命令的延迟效果无效,我也不知道为什么,但数据会马上被删除
// 我用源命令测了多遍都不行,不知道是不是版本问题
// 删除多条数据
$deleteArr = array('name', 'password');
$delete = Cache($deleteArr, '');
// 注意:当要缓存的键已存在时,将修改当前键的值
$setName = Cache('name', 'I am have a new name');
// 当你获取Cache('name')时,就不是'hebarguan'了
// 更多有趣的源生命令请参考http://php.net/memcached
$newMemcached = Cache();
$getKeys = $newMemcached->getAllKeys();
// 这里可以做更多多的事情
描述: 以类封装的方式缓存,类名RedisStorage
示例:
/* Redis缓存同样提供自定义操作链接柄
* 链接柄为类成员$redisHandle
* 本类提供三种缓存数据类型,String(字符串),List(列表),Set(集合)
* 为了更好的区分缓存数据类型和防止重复的键
* 所有的缓存键必须以`str_`开头,列表以`list_`开头,集合以`set_`开头
*/
$redis = new RedisStorage();
// 设置缓存数据
$redis->set('str_path', '/public/images/');
// 设置过期时间
$redis->set('str_file', '/test.png', 60); // 60秒过期
// 获取缓存数据
$redisData = $redis->get('str_file');
// 输出:/test.png
// 缓存多条数据
$multiStorage = array('str_id' => array('1210034971', 60), 'set_name' => 'zhou');
// 二维数组的第二个参数为过期时间,60秒过期
//获取多个缓存数据
$multiGet = array('str_id', 'set_name');
$getStorageData = $redis->mget($multiGet);
// 缓存集合数据
$setCache = array(30, 60, 16, 50, 12, 23, 24, 61, 32);
foreach ($setCache as $value) {
$redis->set('set_score', $value);
// 缓存列表数据
$redis->set('list_score', $value);
}
// 获取集合所有数据
$getCache = $redis->get('set_score');
// 返回的结果为$setCache的升序
$getListCache = $redis-get('list_score');
// 返回的结果为$setCache的倒序
// 获取列表的部分数据
$startIndex = 2; // 从第三个元素开启
$endIndex = 6; // 结束索引
$cacheBlock = $redis->get('list_score', $startIndex, $endIndex);
// 输出:array(24, 23, 12, 50, 16)
// 删除某个键
$result = $redis->clear('str_path');
$result = $redis->clear('list_score');
// 删除多个键
$result = $redis->clear(array('string_file', 'set_score'));
// 返回删除的数据数量
// 删除该缓存数据库的所有键
$redis->clearDB();
// 删除所有缓存数据库的所有键
$redis->clearAllDB();
// 参数为字符串,且为控制器名
$action = Controller('Index');
$action->test();
// 还有一种方法可以实例控制器
// 使用框架的内部的自动加载类函数
// 实例方法
$newClass = new IndexController();
// 这种方法采用遍历目录的方式加载类文件
// 与Controller函数不同在于函数采用直接加载指定文件
$newClass->test();
// 参数为字符串
// 支持多维数组常量
// 下面举例
$dbName = C('DB_NAME');
// 多维数组
// 'MY_CONF' => array('HOST' => array('PORT' => 80));
$myConf = C('MY_CONF.HOST.PORT');
// 返回:80
参数说明: loadFile('(内外目录名).(扩展目录名).(扩展入口文件名)')
,内部用notephp
,外部Webapp
外部扩展目录: ./Webapp/Extends/
内部扩展目录: ./notephp/Extends/
// 以遍历的方式加载入口文件
loadFile('Webapp.Image.ImageInit');
// 加载的时候将遍历加载目录./Webapp/Extends/Image/下查找初始化文件ImageInit.php
loadFile('notephp.Smarty.Smarty.class');
// 加载内部的第三方扩展Smarty./notephp/Extends/Smarty/目录下的Smarty.class.php文件
提示: 该函数的对应解密函数为SysDecrypt()
/* @param $data要加密的数据
* @param $secretKey加密键,解密的时候要用到
* 该函数采用mcrypt加密,更多请参考php官网
*/
$fileData = file_get_content('./test.txt');
$key = "This is a Key for open the Encryption's Door";
$encryptData = SysCrypt($fileData, $key);
// 解密
$decryptData = SysDecrypt($encryptData, $key);
数据库扩展PDO的过滤函数采用的是addslashes(),所以需要在转义过滤数据之前时,使用get_magic_quotes_gpc ()
函数验证是否开启了POST,GET数据自动转义,防止出现双重转义.Mysql扩展依然使用mysqli_real_escape_string()
为安全过滤函数
为了帮助了解框架的内部运行方式和更好的阅读代码,下面是框架的基本运行文件顺序:
1.index.php 框架入口文件
2.Tunnel.php 入口初始文件
3.Notephp.class.php 框架初始化文件
4.Url.class.php 路由处理文件
5.ControllerDriver.class.php 项目控制器驱动(如果不显示页面,这是框架终止文件)
6.View.class.php 模板初始化文件
7.Smarty.class.php 模板引擎文件
由于本人的能力也是有限的,在此过程中可能出现各种不足之处,在功能上也不够完善,例如:Thinkphp上有表单令牌这些方便的功能,但这里没有,这里就需要你自己发挥创造力,添加各种有趣的东西。丰富的框架能提高开发的工作效率,但不建议过于依赖框架本身,毕竟很多的功能就像是封装在一个箱子,而你且不知道箱子里是什么,所以箱子不能拿来就用,更应该学习里面的内容,把它当做学习的例子,这样才能得到更多知识能力,所以建议大家去了解框架的源代码,查看各种各样的框架代码。