notephp / notephp
The notephp Framework.
Installs: 3
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 2
Forks: 1
Open Issues: 0
Type:project
Requires
- smarty/smarty: ~3.1
This package is auto-updated.
Last update: 2024-04-21 19:38:42 UTC
README
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
安装/配置
在Linux下:
$ git clone git@github.com:hebarguan/notephp.git ~/根目录
$ chmod -R 755 notephp
在windows下:
点击 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()
等效
提示: 使用条件方法查找获取数据时,将返回一个二维数组且每个元素代表一个字段,值对应的数据行
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) ) *' */
order
描述: 对数据行按指定字段排序
示例:
/* 参数为字符串 * 多个字段以','分开 * 常见ASC升序,DESC降序 */ $query = $this->order('salary desc')->execute(); // 多个字段排序 $query = $this->order('on_duty asc,salary desc')->execute();
data
描述: 对数据进行过滤
示例:
/* 参数为数组 * 通常用于数据修改和数据写入过滤 */ $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();
group
描述: 对字段进行按组查询
示例:
/* 参数为字符串 * 对于非ENUM()设置的字段同样有效 */ $query = $mode->group('name,salary')->execute(); // 也可以结合having使用 $query = $this->fields('COUNT(*) AS members')->group('sex')->having(array('sex' => 'F'))->execute();
having
描述: 指定字段存在某个值
实例:
/* 参数为键值对应数组 * 使用自定义符号,值为一个数据 * 且第一个元素是符号 */ $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
check
描述: 检测数据是否存在
示例:
/* 参数为boolean类型 * 成功时返回查找到的行数 */ $check = $this->Where(array('name' => 'hebar', 'password' => '12345'))->check(true)->execute(); // 输出int(1)
trans
描述: 事务滚动,紧在PDO数据库扩展下有效
示例:
/* 参数为bool类型 * 下面为实例 */ $query = $this->data(array('salary=salary+500' => '')) ->where(array('name' => 'hebar')) ->trans(true) ->execute();
stmt
描述: 查询预处理,紧在PDO数据库扩展下有效
示例:
/* 参数为bool类型 * 比较适合简单重复的查询 */ $query = $this->where(array('id' => 1))->stmt(true)->execute();
终止方法
描述: 终止当前数据模型操作,并返回结果
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(); // 上面的语句将返回该表全部数据行
save
描述: 修改数据库数据
示例:
/* 参数为数组或为空 * 当参数为空时,要用到操作方法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 '
add
描述: 添加数据行
示例:
/* 参数为数组或空 * 添加成功返回该行的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(); // 以上两种模式效果一样
delete
描述: 删除数据行
示例:
/* 参数为数字或空 * 若参数为数字将删除id为该数字的行 * 删除成功返回影响行数 * 失败返回false */ $delete = $this->delete(5); $conditionDelete = $this->where('id=5')->delete(); // 以上的执行效果一样 // 对应的SQL语句 'DELETE FROM employee WHERE id=5 ' // 更多复杂的条件筛选请参考上面的连贯操作 // 只需在终止方法使用delete即可
returnSql
描述: 返回执行的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(); // 这里可以做更多多的事情
Redis缓存
描述: 以类封装的方式缓存,类名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();
内置函数
实例控制器Controller()
// 参数为字符串,且为控制器名 $action = Controller('Index'); $action->test(); // 还有一种方法可以实例控制器 // 使用框架的内部的自动加载类函数 // 实例方法 $newClass = new IndexController(); // 这种方法采用遍历目录的方式加载类文件 // 与Controller函数不同在于函数采用直接加载指定文件 $newClass->test();
获取配置常量函数C()
// 参数为字符串 // 支持多维数组常量 // 下面举例 $dbName = C('DB_NAME'); // 多维数组 // 'MY_CONF' => array('HOST' => array('PORT' => 80)); $myConf = C('MY_CONF.HOST.PORT'); // 返回:80
扩展加载函数loadFile()
参数说明: 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文件
加密函数SysCrypt()
提示: 该函数的对应解密函数为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上有表单令牌这些方便的功能,但这里没有,这里就需要你自己发挥创造力,添加各种有趣的东西。丰富的框架能提高开发的工作效率,但不建议过于依赖框架本身,毕竟很多的功能就像是封装在一个箱子,而你且不知道箱子里是什么,所以箱子不能拿来就用,更应该学习里面的内容,把它当做学习的例子,这样才能得到更多知识能力,所以建议大家去了解框架的源代码,查看各种各样的框架代码。