HYPHP是一款支持中文語法的PHP MVC開發(fā)框架. 它可以幫助你快速開發(fā)PHP應(yīng)用. HYPHP基于Apache2開源協(xié)議發(fā)布 由 和悅網(wǎng)絡(luò)科技團(tuán)隊(duì)進(jìn)行維護(hù)
框架為了快速開發(fā)PHP應(yīng)用而誕生的.
框架版本請跟隨GIT GIT 地址 https://github.com/hyyyp/HYPHP2 https://github.com/hyyyp/HYPHP2.git
HYPHP 是OOP面向?qū)ο罂蚣? 所以需要PHP 5.3+環(huán)境 (包括5.3) 同時(shí)也支持PHP7.0+ HYPHP 數(shù)據(jù)庫操作采用了國外Medoo開源框架. 需要PDO支持! 僅支持PDO!
HYPHP框架 并不需要高大上的服務(wù)器環(huán)境. 框架文件并且輕量簡潔.
建議你在本地搭建開發(fā)環(huán)境, 推薦幾款: XAMPP , PHPStudy , 本地環(huán)境盡量采用Apache 作為WEB服務(wù)器 較為方便
第一次訪問框架, 框架將自動生成應(yīng)用目錄
根目錄 ├─Action 控制器目錄 │ ├─Index.php 生成的Index控制器 ├─Conf 配置項(xiàng)目錄 │ ├─config.php 默認(rèn)配置文件 ├─Lib 自定義類庫目錄 ├─Model 數(shù)據(jù)庫模型目錄 ├─Plugin 插件目錄 ├─Tmp 緩存文件目錄 ├─View 模板目錄
框架默認(rèn)會生成一個(gè)Index控制器 (/Action/Index.php) 該文件內(nèi)容為:
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
echo 'HY框架';
}
}+++ get:/ <<< success HY框架 +++
HYPHP控制器采用了OOP方式進(jìn)行訪問調(diào)用. 控制器就是一個(gè)類, 而操作方法則是一個(gè)類成員函數(shù) 下面是一個(gè)默認(rèn)的 /Action/Index.php 內(nèi)容
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
echo 'HY框架';
}
}當(dāng)我們訪問 (如果我們直接訪問首頁 不增加參數(shù) 則會自動指向 Index控制器的Index() 方法)
+++ get:/ <<< success HY框架 <<<
+++
訪問了 /?index 既是訪問了index控制器
+++ get:/?index <<< success HY框架 <<< +++
訪問了 /?index/index 既是訪問了index控制器里的index() 方法
+++ get:/?index/index <<< success HY框架 <<<
+++
訪問了 /?index/test 既是訪問了index控制器里的test() 方法
+++ get:/?index/test <<< Error 你的\Action\IndexAction沒有存在Test操作方法 +++
當(dāng)訪問test就出錯(cuò)了 是因?yàn)門est() 并沒有在Index中定義 Index中僅定義了 Index()
控制器的定義采用駝峰法. 首字母大寫. 接下來新建一個(gè) User 控制器 在/Action目錄下新建文件 User.php (注意第一位大寫字母) 在User.php文件寫入內(nèi)容
<?php
namespace Action;
use HY\Action;
class User extends Action {
public function Index(){
echo '這里是User模塊的Index方法';
}
}而類的名稱也是一樣采用首字母大寫的方式 User 繼承了 Action
+++ get:/?User <<< success 這里是User模塊的Index方法 +++
+++ get:/?User/Index <<< success 這里是User模塊的Index方法 +++ 同理, 如果你僅僅訪問了User控制器 卻沒有輸入Index , 框架還是會自動指向Index()函數(shù), 如果你的User控制器中 沒有Index()函數(shù) 則會出錯(cuò)
有朋友不明白 為什么訪問 /?User/Index 就能觸發(fā) Action/User.php文件中的Index函數(shù) 而根目錄并沒有/User目錄呀
當(dāng)訪問了一個(gè)鏈接 /Test/Index 但你的控制器文件中 并沒有Test.php 既是沒有Test控制器 . 則框架會默認(rèn)尋找Action下的No.php控制器
+++ get:/?Test/Index <<< Error Test控制器不存在! +++
新建一個(gè)空控制器 No.php 放入/Action目錄 并寫入內(nèi)容
<?php
namespace Action;
use HY\Action;
class No extends Action {
public function index(){
echo '你訪問的控制器不存在, 但被Empty接收了';
}
}我們在訪問
+++ get:/?Test/Index <<< Success 你訪問的控制器不存在, 但被Empty接收了 +++
但如果我們訪問 /?Test/Home 呢
+++ get:/?Test/Home <<< Success 你的\Action\No沒有存在Home操作方法 +++ 就會提示 你的Empty中沒有Home函數(shù)了
我們在Empty中寫入函數(shù) _no _no函數(shù) 可以在任何控制中加入
<?php
namespace Action;
use HY\Action;
class No extends Action {
public function index(){
echo '你訪問的控制器不存在, 但被Empty接收了';
}
public function _no(){
echo '你訪問的函數(shù)未定義';
}
}再次訪問/Test/Home
+++ get:/?Test/Home <<< Success 你訪問的函數(shù)未定義 +++ 可見 _no 已經(jīng)接收了 空控制器下的空函數(shù)
有同學(xué)要問了 怎么獲取訪問進(jìn)來的控制器名以及函數(shù)名呢 框架內(nèi)置了一個(gè)變量 儲存了訪問了URL $_GET['HY_URL']
$_GET['HY_URL'][0] 則是 控制器名稱 $_GET['HY_URL'][1] 則是 函數(shù)名稱
單純的Action輸出內(nèi)容是有限的, HYPHP內(nèi)置了一個(gè)模板引擎. 默認(rèn)模板目錄位于 /View
/Action/Index.php # Index控制器編寫一下內(nèi)容
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
$this->display("index");
}
}在 /View目錄 新建文件 index.html 寫入內(nèi)容
Action調(diào)用了這個(gè)模板
訪問首頁
+++ get:/
<<< success Action調(diào)用了這個(gè)模板 +++
可見訪問了首頁觸發(fā)了 Index 控制器的 Index函數(shù) 并在函數(shù)中調(diào)用了 display 顯示 模板 index
display('index') 既是調(diào)用了 /View/index.html
有童鞋問了 模板后綴 .html 能不能更換呢 答: 可以的, 你可以在/Conf/config.php配置中 增加一項(xiàng) 'tpl_suffix' => '.tpl'
將成為 /View/index.tpl
顯示模板();
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
顯示模板("index");
}
}當(dāng)我們在Action中輸出了模板. 但模板如何調(diào)用 Action中的變量呢? 看一下下面錯(cuò)誤的示范 Index 控制器內(nèi)容
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
$string = '這是一個(gè)字符串';
$this->display("index");
}
}模板 index.html 內(nèi)容
我想調(diào)用剛才Action 的 $string 變量 輸出變量: <?php echo $string; ?>
當(dāng)我們訪問時(shí)
+++ / <<< Error 調(diào)用了未定義的變量 $string +++ 可見 訪問后 PHP提示出錯(cuò) 模板調(diào)用了一個(gè) 未定義的變量$string 但控制器中已經(jīng)定義它了呀 在這里說明一下 Action 與 模板 是分離的 模板是不能直接使用 Action的值的 那該咋辦咧
使用Action成員 v函數(shù) 將變量復(fù)制到模板中
再次編輯 Index 控制器內(nèi)容
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
$string = '這是一個(gè)字符串';
$this->v("string",$string);
$this->v("a",$string);
$this->display("index");
}
}$this->v(復(fù)制后名稱,傳入變量)
index.html 模板內(nèi)容 再次編輯
我想調(diào)用剛才Action 的 $string 變量 輸出變量: <?php echo $string; ?> 在增加一個(gè) <?php echo $a; ?>
再次訪問首頁
+++ get:/ <<< success 我想調(diào)用剛才Action 的 $string 變量 輸出變量: 這是一個(gè)字符串 在增加一個(gè) 這是一個(gè)字符串 +++ 可見 輸出內(nèi)容中 $a 以及 $string 都變成了 這是一個(gè)字符串
額外的模板引擎標(biāo)簽 請?jiān)谀0逡婺夸洸榭?/p>
Json & Jsonp 輸出 我們通常會在前端用到JSON. 所以框架內(nèi)置了兩個(gè)簡單的 JSON格式化輸出函數(shù)
該函數(shù)會更改 Content-Type 類型為 application/json; charset=utf-8
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
$arr = array(1,2,3);
$this->json($arr);
}
}+++ get:/ <<< success [1,2,3] +++
可能新手不懂jsonp是什么意思. jsonp是提供給跨域訪問使用的. 放A網(wǎng)站使用了ajax去獲取 B網(wǎng)站的一個(gè)JSON數(shù)據(jù) 但兩者是不同的域名 造成了 跨域危險(xiǎn). 所以AJax是不能直接通信的 所以只能采用JavaScript腳本的方法 使用函數(shù)去執(zhí)行 格式化遠(yuǎn)程端的字符串JSON
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
$arr = array(1,2,3);
$this->jsonp($arr,'run');
}
}+++ get:/ <<< success run([1,2,3]); +++
我們通常定義的控制器 Index User Home ...等等 訪問他們就需要 /index , /user /home 能不能不改變Index的情況下 改變URL中index名稱呢? 就是 訪問 /i 就能訪問到 Index 控制器. HYPHP內(nèi)置了一個(gè)小型控制器以及方法的綁定路由過程
打開/Conf/config.php 配置文件 增加配置項(xiàng)
<?php
//這是 Conf/config.php 配置文件
return array(
'HY_URL'=>array(
'action'=>array(
'Index'=>'i',
'User'=>'u'
),
'method'=>array(
'Index'=>array(
'Index'=>'i'
)
)
),
)先看 Action 項(xiàng) 'Index' => 'i' 既是將URL中index方法改為了i 通常我們訪問/?Index 現(xiàn)在可以通過 /?i 就可以訪問了 而Method 則是控制器里函數(shù)方法. 將Index() 改為了 i() 通常我們訪問 /?Index/Index 訪問到 Index() 方法 我們現(xiàn)在可以用過 /?Index/i 的方法就訪問到了 Index() 當(dāng)然 你的控制器以及方法都該了 方法將成為 /?i/i 就能訪問到了 /?Index/Index
為什么需要這個(gè)函數(shù)? 有童鞋覺得是多余的, 太多余麻煩. 是的,作者本人也覺得麻煩, 開發(fā)時(shí)不如直接寫固定連接好了 還要調(diào)用啥函數(shù). 所以這個(gè)函數(shù)是提供給 需要經(jīng)常使用 URL縮短控制器方法的童鞋
他會通過你的縮短控制器更改去 生成合適的方法
具體使用方式詳情 : http://bbs.hyphp.cn/t/740.html
獲取用戶請求類型 通常情況下 我們?yōu)g覽器訪問我們的網(wǎng)站時(shí)都是使用 GET 而提交表單大多都是使用POST 以及JS腳本AJAX訪問 如果在控制器中獲取訪問者的請求類型呢 目前框架已經(jīng)直接內(nèi)置了常量
| 常量名 | 說明 |
|---|---|
| IS_GET | 直接訪問的GET方式 |
| IS_POST | 直接訪問的POST方式 |
| IS_AJAX | 直接訪問的AJAX方式 |
目前就內(nèi)置了3個(gè)常用的判斷 他們的值將會是 bool類型
使用場景演示
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
if(IS_POST)
echo '用戶采用了POST訪問';
elseif(IS_GET)
echo '用戶采用了GET訪問';
elseif(IS_AJAX)
echo '用戶采用了AJAX訪問';
}
}并不是3個(gè)類型 只有一個(gè)是 true
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
if(IS_POST && IS_AJAX)
echo '用戶采用了AJAX POST訪問';
}
}我們開發(fā)時(shí)經(jīng)常會輸出大量的HTML內(nèi)容, 但這些內(nèi)容不可能堆積在控制器中. 所以我們最好使用文件區(qū)分開來. HYPHP內(nèi)置了模板引擎, 提供一些常用的PHP標(biāo)簽以及 組合方式 默認(rèn)模板路徑在 /View ,常量定義為 VIEW_PATH . 建立方式: 模板名 + .后綴 例: (home.html) 控制器中調(diào)用該模板 $this->display("home") .從而輸出 home.html的內(nèi)容 .
可見定義模板時(shí) 使用了 (.html) 框架內(nèi)置的默認(rèn)值為 array(.html , .php) 意為模板可以使用 .html以及.php 如果你想修改該配置 可以從 Conf/config.php 加入 'tpl_suffix' => '.tpl' 或數(shù)組
Index控制器內(nèi)容
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
$this->display("home");
}
}模板 home.html 內(nèi)容
這是home模板 <br> 第二行文字
當(dāng)我們訪問時(shí)
+++ / <<< Success 這是home模板 第二行文字 +++
通常我們的模板文件都放于模板目錄中. 而太多模板文件堆積在一起 卻看起來很煩惱 所以有必要進(jìn)行分組使用
通產(chǎn)我們使用的模板目錄位于 /View , 我們可以在該目錄下建立子目錄. 例 : 建立目錄 /View/home , 并新建模板文件在該目錄下
在控制器方法中 調(diào)用display前 , 將分組名賦值給 : $this->view ,從而框架會通過該變量去增加路徑 (注意大小寫)
<?php
//這是/Action/Index.php 文件
namespace Action;
use HY\Action;
class Index extends Action {
public function index(){
//目前顯示模板 /View/index_index.html
$this->display('index_index');
}
public function test(){
//將使用 /View/home/index_index.html 模板
$this->view = 'home';
$this->display('index_index');
}
}當(dāng)我們在控制器輸出模板時(shí), 模板是無法直接調(diào)用方法函數(shù)中的變量的. 我們需要通過框架內(nèi)置的輸出方法, 將變量賦值到模板當(dāng)中使用.
看一下下面錯(cuò)誤的示范 Index 控制器內(nèi)容
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
$string = '這是一個(gè)字符串';
$this->display("index");
}
}模板 index.html 內(nèi)容
我想調(diào)用剛才Action 的 $string 變量 輸出變量: <?php echo $string; ?>
當(dāng)我們訪問時(shí)
+++ / <<< 出錯(cuò) 調(diào)用了未定義的變量 $string +++ 可見結(jié)果, 模板是無法直接使用控制器內(nèi)的變量的. 我們需要在控制器方法中 輸出模板時(shí)將變量賦值到模板中 使用Action成員 v函數(shù) 將變量復(fù)制到模板中
再次編輯 Index 控制器內(nèi)容
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
$string = '這是一個(gè)字符串';
$this->v("string",$string);
$this->v("a",$string);
$this->display("index");
}
}$this->v(復(fù)制后名稱,傳入變量)
index.html 模板內(nèi)容 再次編輯
我想調(diào)用剛才Action 的 $string 變量
輸出變量: <?php echo $string; ?>
在增加一個(gè) <?php echo $a; ?>
HYPHP 內(nèi)置標(biāo)簽輸出變量 : {$a}再次訪問首頁
+++ get:/ <<< success 我想調(diào)用剛才Action 的 $string 變量 輸出變量: 這是一個(gè)字符串 在增加一個(gè) 這是一個(gè)字符串 HYPHP 內(nèi)置標(biāo)簽輸出變量 : 這是一個(gè)字符串 +++ 可見 輸出內(nèi)容中 $a 以及 $string 都變成了 這是一個(gè)字符串
框架的模板引擎提供了一系列輸出標(biāo)簽.
{$a}
等同于
<?php echo $a; ?>Index 控制器內(nèi)容
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
$arr =array(
'user'=>'admin',
'pass'=>'123456'
);
$this->v('arr',$arr);
$this->display("index");
}
}模板 index.html 內(nèi)容
我想調(diào)用剛才Action 的 $arr 變量
輸出變量: {$arr.user} {$arr.pass}當(dāng)我們訪問時(shí)
+++ / <<< 出錯(cuò) 我想調(diào)用剛才Action 的 $arr 變量 輸出變量: admin 123456 +++
我們之前的介紹都是在控制器中 單獨(dú)輸出了一個(gè)模板文件. 但我們的項(xiàng)目肯定是需要使用到 包含文件的 最常見的就是 HTML的 header 以及footer 或Menu
Index控制器內(nèi)容
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
$this->display("index");
}
}模板 index.html 內(nèi)容
{include header}
我是Index模板<br>
{include footer}模板 header.html 內(nèi)容
我是頭部文件 header <br>
模板 footer.html 內(nèi)容
我是尾部文件 footer <br>
+++ / <<< Success 我是頭部文件 header 我是Index模板 我是尾部文件 footer +++
可見我們的結(jié)果中. 控制器輸出了index模板 而index中使用了include 包含了header 以及 footer 使用 {include} 是不需要加入模板后綴的.
PHP中我們使用的流程控制判斷 大多都是使用 if elseif else
Index控制器內(nèi)容
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
$this->display("index");
}
}模板 index.html 內(nèi)容
我是Index模板<br>
{if '1' == '1'}
當(dāng)然啦
{else}
你中毒不淺
{/if}
等同于
<?php
if('1' == '1')
echo '當(dāng)然啦';
else
echo '你中毒不淺';
?>在 {if} 允許使用變量 以及 PHP函數(shù). 框架解析后 與 PHP原生是一樣的
<!-- 注意 if 或者 elseif 后需要空格, 后面才是條件 -->
{if $a > $b}
{elseif $a > $b} <!-- elseif 可將它去除 -->
{else}
{/if}
<!-- 這是原生的語句 -->
<?php if (condition): ?>
<?php else: ?>
<?php endif ?>
--------if elseif ---------
<?php if (condition): ?>
<?php elseif (condition): ?>
<?php else: ?>
<?php endif ?>
與php是一致的標(biāo)簽
模板文件內(nèi)容
{for $i=0;$i<10;$i++}
{/for}
<!-- 第二種演示 -->
{for $i=0,$ii=10;$i<$ii;$i++,$ii--}
{/for}
<!-- 原生for -->
<?php for ($i=0;$i<10;$i++): ?>
輸出$i : {$i}
<?php endfor ?>
--------------輸出結(jié)果
輸出$i : 0
輸出$i : 1
輸出$i : 2
輸出$i : ...{foreach $data as $K=>$v}
{/foreach}
{foreach $data as $v}
{/foreach}
<!-- 下面是原生foreach -->
<?php $arr = array('1','2','3'); ?>
<?php foreach ($arr as $key => $value): ?>
輸出arr : {$value}
<?php endforeach ?>
----輸出結(jié)果
輸出arr : 1
輸出arr : 2
輸出arr : 3框架采用了國外Medoo作為支持. 它必須采用PHP PDO擴(kuò)展支持, 否則將無法使用 目前框架支持的數(shù)據(jù)庫引擎
PHP_PDO 擴(kuò)展列表
打開 php.ini 找到你想要的相應(yīng)擴(kuò)展,去掉前面的;號即可
;extension=php_pdo_mysql.dll // 修改成 extension=php_pdo_mysql.dll // 保存,重啟你的PHP或者服務(wù)器
如果你是Linux下的PHP環(huán)境 則.dll 為 .so
Config 配置 請打開 /Conf/config.php 文件 增加以下信息
<?php
return array(
//其他一些配置
....
//數(shù)據(jù)庫類型
"SQL_TYPE" => "mysql",
//數(shù)據(jù)庫名稱
"SQL_NAME" => "test",
//數(shù)據(jù)庫地址
"SQL_IP"=>"localhost",
//數(shù)據(jù)庫賬號
'SQL_USER' => 'root',
//數(shù)據(jù)密碼
'SQL_PASS' => 'root',
//數(shù)據(jù)庫字符集
'SQL_CHARSET' => 'utf8',
//數(shù)據(jù)庫端口
'SQL_PORT' => 3306,
//數(shù)據(jù)庫前綴
'SQL_PREFIX' => 'hy_',
//PDO配置
'SQL_OPTION' => array(
PDO::ATTR_CASE => PDO::CASE_NATURAL,
//PDO::ATTR_PERSISTENT => true //長連接
)
);| 名稱 | 說明 |
|---|---|
| SQL_TYPE | 數(shù)據(jù)庫類型 |
| SQL_NAME | 數(shù)據(jù)庫名稱 |
| SQL_IP | 數(shù)據(jù)庫地址 |
| SQL_USER | 數(shù)據(jù)庫 用戶 |
| SQL_PASS | 數(shù)據(jù)庫 密碼 |
| SQL_CHARSET | 數(shù)據(jù)庫編碼 |
| SQL_PORT | 數(shù)據(jù)庫端口 |
| SQL_PREFIX | 數(shù)據(jù)庫前綴 |
| SQL_OPTION | PDO 額外配置項(xiàng) |
/Conf/config.php 增加內(nèi)容
<?php
return array(
//單個(gè)數(shù)據(jù)庫配置
//數(shù)據(jù)庫類型
"SQL_TYPE" => "mysql",
//數(shù)據(jù)庫名稱
"SQL_NAME" => "hybbs",
//數(shù)據(jù)庫地址
"SQL_IP"=>"localhost",
//數(shù)據(jù)庫賬號
'SQL_USER' => 'root',
//數(shù)據(jù)密碼
'SQL_PASS' => '',
//數(shù)據(jù)庫字符集
'SQL_CHARSET' => 'utf8',
//數(shù)據(jù)庫端口
'SQL_PORT' => 3306,
//數(shù)據(jù)庫前綴
'SQL_PREFIX' => 'hy_',
//PDO配置
'SQL_OPTION' => array(
PDO::ATTR_CASE => PDO::CASE_NATURAL,
//PDO::ATTR_PERSISTENT => true //長連接
),
//增加多數(shù)據(jù)庫配置
'SQL_MORE'=>array(
//這個(gè)數(shù)據(jù)庫的名稱
'caiji'=>array(
//數(shù)據(jù)庫類型
"SQL_TYPE" => "mysql",
//數(shù)據(jù)庫名稱
"SQL_NAME" => "caiji",
//數(shù)據(jù)庫地址
"SQL_IP"=>"localhost",
//數(shù)據(jù)庫賬號
'SQL_USER' => 'root',
//數(shù)據(jù)密碼
'SQL_PASS' => '',
//數(shù)據(jù)庫字符集
'SQL_CHARSET' => 'utf8',
//數(shù)據(jù)庫端口
'SQL_PORT' => 3306,
//數(shù)據(jù)庫前綴
'SQL_PREFIX' => '',
//PDO配置
'SQL_OPTION' => array(
PDO::ATTR_CASE => PDO::CASE_NATURAL,
//PDO::ATTR_PERSISTENT => true //長連接
),
),
//再增加多個(gè)數(shù)據(jù)庫
//'xxx'=>array('SQL_TYPE' .... .. . . .)
//.. ... ..
//.....
),
);和以往的數(shù)據(jù)庫配置一樣 不過他就是放入了 SQL_MORE 中
可見 SQL_MORE 中添加了一個(gè) caiji 項(xiàng) caiji 項(xiàng)的數(shù)據(jù)庫信息 包含在caiji數(shù)組中 數(shù)據(jù)庫信息 很直觀 一看就懂
在使用多數(shù)據(jù)庫前一定要配置 SQL_MORE 項(xiàng) 否則無法使用的! 接著上一個(gè)文章 的配置信息
'SQL_MORE'=>array(
'name1'=>array(
//數(shù)據(jù)庫類型
"SQL_TYPE" => "mysql",
//數(shù)據(jù)庫名稱
"SQL_NAME" => "caiji",
//數(shù)據(jù)庫地址
"SQL_IP"=>"localhost",
//數(shù)據(jù)庫賬號
'SQL_USER' => 'root',
//數(shù)據(jù)密碼
'SQL_PASS' => '',
//數(shù)據(jù)庫字符集
'SQL_CHARSET' => 'utf8',
//數(shù)據(jù)庫端口
'SQL_PORT' => 3306,
//數(shù)據(jù)庫前綴
'SQL_PREFIX' => '',
//PDO配置
'SQL_OPTION' => array(
PDO::ATTR_CASE => PDO::CASE_NATURAL,
//PDO::ATTR_PERSISTENT => true //長連接
),
)
),<?php
//連接 多個(gè)數(shù)據(jù)庫配置中的 name 數(shù)據(jù)庫. 并操作 他的user 表
$User = S('user','name');
使用數(shù)據(jù)庫無時(shí)無刻都需要條件去檢索數(shù)據(jù) . 框架內(nèi)置的where 采用數(shù)組方式傳入解析. 并還原SQL語句進(jìn)行執(zhí)行
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例User表為對象
$User = S("User");
//滿足email = a 的數(shù)據(jù),并返回 user_name 字段數(shù)組
$User->select("user_name", array(
"email" => "a"
));
// WHERE email = 'a'
$User->select(user_name", array(
"user_id" => 200
));
// WHERE user_id = 200
$User->select("user_name", array(
"user_id[>]" => 200
));
// WHERE user_id > 200
$User->select("user_name", array(
"user_id[>=]" => 200
));
// WHERE user_id >= 200
$User->select(user_name", array(
"user_id[!]" => 200
));
// WHERE user_id != 200
$User->select("user_name", array(
"age[<>]" => [200, 500]
));
// WHERE age BETWEEN 200 AND 500
$User->select("user_name", array(
"age[><]" => [200, 500]
));
// WHERE age NOT BETWEEN 200 AND 500
// [><] 和 [<>] 可以用于 datetime
$User->select("user_name", array(
"birthday[><]" => array(
date("Y-m-d", mktime(0, 0, 0, 1, 1, 2015)), date("Y-m-d")
)
));
//WHERE "create_date" BETWEEN '2015-01-01' AND '2015-05-01' (now)
// 你不僅可以使用字符串和數(shù)字,還可以使用數(shù)組
$User->select("user_name", array(
"OR" => array(
"user_id" => [2, 123, 234, 54],
"email" => array("[email protected]", "[email protected]", "[email protected]")
)
));
// WHERE
// user_id IN (2,123,234,54) OR
// email IN ('[email protected]','[email protected]','[email protected]')
// 多條件查詢
$User->select("user_name", array(
"AND" => array(
"user_name[!]" => "foo",
"user_id[!]" => 1024,
"email[!]" => ["[email protected]", "[email protected]", "[email protected]"],
"city[!]" => null,
"promoted[!]" => true
)
));
// WHERE
// `user_name` != 'foo' AND
// `user_id` != 1024 AND
// `email` NOT IN ('[email protected]','[email protected]','[email protected]') AND
// `city` IS NOT NULL
// `promoted` != 1
// 或者嵌套 select() ak get() 方法
$User->select("user_name", array(
"user_id" => $User->select("post", "user_id", ["comments[>]" => 40])
));
// WHERE user_id IN (2, 51, 321, 3431)
}
}上面是基礎(chǔ)的Where語句,下面看一下復(fù)雜一點(diǎn)的 你可以使用"AND" 或 "OR" 來拼接非常復(fù)雜的SQL語句
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例User表為對象
$User = S("User");
// 基礎(chǔ)使用
$User->select("user_name", array(
"AND" => array(
"user_id[>]" => 200,
"age[<>]" => array(18, 25),
"gender" => "female"
)
));
// WHERE user_id > 200 AND age BETWEEN 18 AND 25 AND gender = 'female'
$User->select("user_name", array(
"OR" => array(
"user_id[>]" => 200,
"age[<>]" => array(18, 25),
"gender" => "female"
)
));
// WHERE user_id > 200 OR age BETWEEN 18 AND 25 OR gender = 'female'
// 復(fù)合條件
$User->has(array(
"AND" => array(
"OR" => array(
"user_name" => "foo",
"email" => "[email protected]"
),
"password" => "12345"
)
));
// WHERE (user_name = 'foo' OR email = '[email protected]') AND password = '12345'
// 注意
// 因?yàn)槭褂玫氖菙?shù)組傳參,所以下面這種用法是錯(cuò)誤的。
// 可見 你有兩個(gè)OR ,數(shù)組不可能存在兩個(gè)相同索引. 所以你需要將另一個(gè)OR 加上一個(gè)注釋
$User->select('*', array(
"AND" => array(
"OR" => array(
"user_name" => "foo",
"email" => "[email protected]"
),
"OR" => array(
"user_name" => "bar",
"email" => "[email protected]"
)
)
));
// [X] SELECT * FROM "account" WHERE ("user_name" = 'bar' OR "email" = '[email protected]') 這是錯(cuò)誤的示范
// 正確的方式是使用如下方式定義復(fù)合條件
$User->select('*', array(
"AND #Actually, this comment feature can be used on every AND and OR relativity condition" => array(
"OR #the first condition" => array(
"user_name" => "foo",
"email" => "[email protected]"
),
"OR #the second condition" => array(
"user_name" => "bar",
"email" => "[email protected]"
)
)
));
// SELECT * FROM "account"
// WHERE (
// (
// "user_name" = 'foo' OR "email" = '[email protected]'
// )
// AND
// (
// "user_name" = 'bar' OR "email" = '[email protected]'
// )
// )
}
}
接下來我們看一下模糊匹配 Like語句 LIKE 使用語法 [~] .
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例User表為對象
$User = S("User");
// 默認(rèn)情況下,使用%在前后包含關(guān)鍵詞
$User->select("id", array(
"city[~]" => "lon"
));
WHERE "city" LIKE '%lon%'
// 數(shù)組形式,查詢多個(gè)關(guān)鍵詞
$User->select("id", array(
"city[~]" => array("lon", "foo", "bar")
));
WHERE "city" LIKE '%lon%' OR "city" LIKE '%foo%' OR "city" LIKE '%bar%'
// 不包含 [!~]
$User->select("id", array(
"city[!~]" => "lon"
));
WHERE "city" NOT LIKE '%lon%'
// 使用SQL自帶的一些通配符
// 你可以使用sql自帶的一些通配符來完成較復(fù)雜的查詢
$User->select("id", array(
"city[~]" => "stan%" // Kazakhstan, Uzbekistan, Türkmenistan
));
$User->select("id", array(
"city[~]" => "Londo_" // London, Londox, Londos...
));
$User->select("id", array(
"name[~]" => "[BCR]at" // Bat, Cat, Rat
));
$User->select("id", array(
"name[~]" => "[!BCR]at" // Eat, Fat, Hat...
));
}
}<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例User表為對象
$User = S("User");
$User->select("user_id", array(
// "ORDER" => "age DESC"
"ORDER" => ['age'=>'DESC'],
));
// SELECT user_id FROM account
// ORDER BY age
// 多個(gè)排序
$User->select("user_id", array(
"ORDER" => array('user_name DESC', 'user_id ASC')
));
// SELECT user_id FROM account
// ORDER BY "user_name" DESC, "user_id" ASC
// 根據(jù)字段自定義排序順序
// "ORDER" => array("column_name", [array #ordered array])
$User->select("user_id", array(
"user_id" => array(1, 12, 43, 57, 98, 144),
"ORDER" => array("user_id", array(43, 12, 57, 98, 144, 1))
));
// SELECT "user_id"
// FROM "account"
// WHERE "user_id" IN (1,12,43,57,98,144)
// ORDER BY FIELD("user_id", 43,12,57,98,144,1)
// array(6) {
// [0]=> string(2) "43"
// [1]=> string(2) "12"
// [2]=> string(2) "57"
// [3]=> string(2) "98"
// [4]=> string(3) "144"
// [5]=> string(1) "1"
// }
}
}<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例User表為對象
$User = S("User");
//搜索一個(gè)用戶 可能user 或者 email中存在關(guān)鍵字
$User->select("post_id", array(
"MATCH" => array(
"columns" => array("user", "email"),
"keyword" => "foo"
)
);
// WHERE MATCH (content, title) AGAINST ('foo')
}
}在一些特殊的情況下,你可能需要使用SQL系統(tǒng)函數(shù),只需要字段名前加上#號即可
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例User表為對象
$User = S("User");
$data = $User->select( array(
'user_id',
'user_name'
), array(
'#datetime' => 'NOW()'
));
// SELECT "user_id","user_name"
// FROM "account"
// WHERE "datetime" = NOW()
// [重要]記住,價(jià)值也不會引用應(yīng)符合xxx()大寫。
//下面是一個(gè)錯(cuò)誤的示例
$User->select(array(
'user_id',
'user_name'
), array(
'#datetime2' => 'now()',
'datetime3' => 'NOW()',
'#datetime4' => 'NOW'
));
}
}<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例User表為對象
$User = S("User");
$User->select("account", "user_id", array(
"GROUP" => "type",
// 必須有使用它與小組一起
"HAVING" => array(
"user_id[>]" => 500
),
// LIMIT => 20
"LIMIT" => array(20, 100)
));
// SELECT user_id FROM account
// GROUP BY type
// HAVING user_id > 500
// LIMIT 20,100
}
}數(shù)據(jù)庫查詢
select( $columns, $where) columns [string/array] 要查詢的字段名. where (optional) [array] 查詢的條件.
select($join, $columns, $where) join [array] 多表查詢,不使用可以忽略. columns [string/array] 要查詢的字段名. where (optional) [array] 查詢的條件.
返回: [array] 你可以使用*來匹配所有字段, 但如果你指名字段名可以很好的提高性能.
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例User表為對象
$User = S("User");
$datas = $User->select(array(
"user_name",
"email"
), array(
"user_id[>]" => 100
));
//返回?cái)?shù)據(jù)
// $datas = array(
// [0] => array(
// "user_name" => "admin1",
// "email" => "admin1"
// ),
// [1] => array(
// "user_name" => "admin2",
// "email" => "admin2"
// )
// )
foreach($datas as $data)
{
echo "user_name:" . $data["user_name"] . " - email:" . $data["email"];
}
// 查詢所有字段 使用 *
$datas = $database->select("*");
// 查詢一個(gè)字段 輸入他的字段名稱
$datas = $database->select("user_name");
// $datas = array(
// [0] => "admin1",
// [1] => "admin2"
// )
}
}多表查詢
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例User表為對象
$User = S("User");
// [>] == LEFT JOIN
// [<] == RIGH JOIN
// [<>] == FULL JOIN
// [><] == INNER JOIN
$User->select("post", array(
// Here is the table relativity argument that tells the relativity between the table you want to join.
// The row author_id from table post is equal the row user_id from table account
"[>]account" => array("author_id" => "user_id"),
// The row user_id from table post is equal the row user_id from table album.
// This is a shortcut to declare the relativity if the row name are the same in both table.
"[>]album" => "user_id",
// [post.user_id is equal photo.user_id and post.avatar_id is equal photo.avatar_id]
// Like above, there are two row or more are the same in both table.
"[>]photo" => array("user_id", "avatar_id"),
// If you want to join the same table with different value,
// you have to assign the table with alias.
"[>]account (replyer)" => array("replyer_id" => "user_id"),
// You can refer the previous joined table by adding the table name before the column.
"[>]account" => array("author_id" => "user_id"),
"[>]album" => array("account.user_id" => "user_id"),
// Multiple condition
"[>]account" => array(
"author_id" => "user_id",
"album.user_id" => "user_id"
)
), array(
"post.post_id",
"post.title",
"account.user_id",
"account.city",
"replyer.user_id",
"replyer.city"
), array(
"post.user_id" => 100,
"ORDER" => "post.post_id DESC",
"LIMIT" => 50
));
// SELECT
// `post`.`post_id`,
// `post`.`title`,
// `account`.`city`
// FROM `post`
// LEFT JOIN `account` ON `post`.`author_id` = `account`.`user_id`
// LEFT JOIN `album` USING (`user_id`)
// LEFT JOIN `photo` USING (`user_id`, `avatar_id`)
// WHERE
// `post`.`user_id` = 100
// ORDER BY `post`.`post_id` DESC
// LIMIT 50
}
}舉一個(gè)通俗易懂的例子 兩個(gè)表 post 與 user
post表的數(shù)據(jù)
| id | uid | title |
|---|---|---|
| 1 | 1 | 文章標(biāo)題 |
| 2 | 1 | 文章標(biāo)題 |
| 3 | 1 | 文章標(biāo)題 |
user表的數(shù)據(jù) | uid | username | | --- | --- | | 1 | admin | | 2 | xxxx | | 3 | dddd |
問題: 如果獲取 post表數(shù)據(jù)的時(shí)候 同時(shí)獲取 用戶名 (user.username) 答: 簡單的都是先獲取了 post的數(shù)據(jù)出來 再循環(huán)user表中的username
我們?nèi)〕鰌ost表的數(shù)據(jù)時(shí) 還能取出uid 用戶ID 卻不能取出用戶名, 這時(shí)就能用到多表查詢
S('Post')->select(array(
"[>]user" => [ "uid" => "uid"], //post.uid == user.uid
),array(
'post.title',
'user.username'
)
);
輸出:
arrary(
'title'=>'文章標(biāo)題',
'username'=>'admin'
)多表查詢 Count
S('Post')->count(array(
"[>]user" => [ "uid" => "uid"], //post.uid == user.uid
),
'*'
);復(fù)雜的多表查詢 Count (HYBBS處的一段搜索代碼)
$page_count = $Thread->count(
array(
"[>]post" => [ "pid" => "id"], //post.id == thread.pid
),
'*',
array('AND'=>array(
'isthread'=>1
,'OR'=>array(
'thread.title[~]'=>$key,
'post.content[~]'=>$key
)))
);OBJ->count($join, "*" ,條件 );
insert($data) 中文 : 插入($data) data [array] 插入到表里的數(shù)據(jù) Return: [number] 返回插入的id
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例User表為對象
$User = S("User");
$User->insert(array(
"user" => "admin",
"pass" => "admin",
));
//返回插入的ID
$User->id();
//中文語法
$User->插入(array(
"user" => "admin",
"pass" => "admin",
));
}
}<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例User表為對象
$User = M("User");
$id = $User->insert(array(
array(
"user" => "admin",
"pass" => "admin",
),
array(
"user" => "admin1",
"pass" => "admin1",
)
));
}
}update($data, $where) 中文 : 更新(數(shù)據(jù),條件) data [array] 修改的數(shù)據(jù). WHERE 條件.[可選] Return: [number] 受影響的行數(shù).
$User = S("User");
$User->update(array(
"type" => "user",
// age字段的值 + 1
"age[+]" => 1,
// 減 - 5
"level[-]" => 5,
// 兩倍 2
"score[*]" => 2,
// SQL 函數(shù)
"#uid" => "UUID()"
), array(
"user_id[<]" => 1000
));將 用戶名user 等于 admin的用戶密碼修改為 123
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例User表為對象
$User = M("User");
$User->update(
array(
"pass" => "123",
),
array(
'user'=>'admin'
)
);
//中文
$User->更新(
array(
"pass" => "123",
),
array(
'user'=>'admin'
)
);
}
}delete($where) 中文 : 刪除(條件); where [array] WHERE 刪除條件. Return: [number] 返回被刪除的行數(shù).
刪除一個(gè) user = admin 并 年齡<18的數(shù)據(jù)
$User = S("User");
$User->delete(array(
"AND" => array(
"user" => "admin"
"age[<]" => 18
)
));
//中文語法
$User->刪除(array(
"AND" => array(
"user" => "admin"
"age[<]" => 18
)
));刪除 user 等于 admin的數(shù)據(jù)
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例User表為對象
$User = S("User");
$User->delete(
array(
"user" => "admin",
)
);
}
}通過條件查詢,將返回一條記錄
find($columns, $where) 中文 : 查找(返回字段, 條件); columns [string/array] 返回的字段列. where (optional) [array] WHERE 條件. Return: [string/array] 返回查詢到的數(shù)據(jù).
//查找 user 等于 admin的數(shù)據(jù) 并返回pass
$User = S("User");
$pass = $User->find("pass", array(
"user" => "admin"
));
//查找條件與上一致 返回 更多字段的數(shù)據(jù)
$data = $User->find(array(
"email",
"user",
"pass"
), array(
"user" => "admin"
));
// $data = array(
// "email" => "[email protected]",
// "user" => "admin",
// "pass" => "admin"
// )
$pass = $User->find("*", array(
"user" => "admin"
));
//返回 所有字段
//中文語法
$User = S("User");
$pass = $User->查找("pass", array(
"user" => "admin"
));
通過條件搜素 判斷數(shù)據(jù)是否存在
has($where) 中文 : 是否存在(條件); where [array] WHERE 條件. Return: [boolean] 返回 TRUE 或者 FALSE.
has($join, $where) join [array] 多表查詢. where [array] WHERE條件.
Return: [boolean] 返回 TRUE 或者 FALSE.
例:可以使用它來判斷某用戶是否存在 , 或者賬號密碼是否正確!
$User = S("User");
// 判斷用戶賬號密碼是否正確, 可見 user = admin && pass = admin
if ($User->has(array(
"AND" => array(
"user" => "admin",
"pass" => "admin"
)
))){
echo "正確";
}
else{
echo "不正確";
}
//判斷賬號是否存在
if ($User->has(array(
"user" => "admin",
)))
echo '存在';
else
echo '不存在';
通過條件 檢索數(shù)據(jù)的數(shù)量
count($where) 中文 : 總數(shù)(條件); where (optional) [array] WHERE 條件.
count( $join, $column, $where) join [array] 多表查詢. column [string] 需要統(tǒng)計(jì)的字段. where (optional) [array] WHERE 條件.
Return: [number] 行的數(shù)量. 返回的是數(shù)字類型.
$User = S("User");
//查看 user = admin 有多少數(shù)目
$count = $User->count(array(
"user" => "admin"
));
//查找User表的數(shù)據(jù)總數(shù)
$All_count = $User->count();max($column, $where) 中文語法 : 最大值() / 最小值() column [string] 查詢的字段列. where (optional) [array] WHERE 條件.
max($join, $column, $where) join [array] 多表查詢. column [string] 字段名. where (optional) [array] 條件.
Return: [number] 返回最大的值.
查詢數(shù)據(jù)表中某整數(shù)字段的 最大值. 例如User表有一個(gè)年齡字段
$User = S("User");
//查看 age 字段最大值.
$max = $User->max("age");
//增加條件檢索
//user=admin的數(shù)據(jù) age 最大值
$max = $User->max("age",array(
'user' = 'admin'
));參數(shù)同Max 查詢數(shù)據(jù)表中某整數(shù)字段的 最小值 用法與Max一致
action( $callback ) $callback [function] 事務(wù)內(nèi)執(zhí)行的方法.
$User = S("User");
$User->action(function($User) {
$User->insert('User',array(
"user" => "admin",
"pass" => "admin"
));
return true; //false 回滾
});query($query) query [string] The SQL query. Return: [object] The PDOStatement object.
$User = S("User");
$User->query("CREATE TABLE table (
c1 INT STORAGE DISK,
c2 INT STORAGE MEMORY
) ENGINE NDB;");
$data = $User->query("SELECT email FROM account")->fetchAll();
print_r($data);PDO對象
//$Model -> pdo
$User = S("User");
$User->pdo->query("CREATE TABLE table (
c1 INT STORAGE DISK,
c2 INT STORAGE MEMORY
) ENGINE NDB;");
$data = $User->pdo->query("SELECT email FROM account")->fetchAll();
print_r($data);quote($string) $string [string] 字符串. Return: [string]
可用于過濾字符串的SQL注入
$User = M("User");
$string = 'Nice';
print "Unquoted string: $string\n";
print "Quoted string: " . $User->quote($string) . "\n";
以上例程會輸出:
Unquoted string: Nice
Quoted string: 'Nice'
/* Dangerous string */
$string = 'Naughty \' string';
print "Unquoted string: $string\n";
print "Quoted string:" . $User->quote($string) . "\n";
以上例程會輸出:
Unquoted string: Naughty ' string
Quoted string: 'Naughty '' string'
/* Complex string */
$string = "Co'mpl''ex \"st'\"ring";
print "Unquoted string: $string\n";
print "Quoted string: " . $User->quote($string) . "\n";
以上例程會輸出:
Unquoted string: Co'mpl''ex "st'"ring
Quoted string: 'Co''mpl''''ex "st''"ring'什么是Model , 當(dāng)我們有大量的SQL需要重復(fù)執(zhí)行, 不適合在控制器中大量的寫入. 我們就需要將他們封裝成函數(shù).
比如我們有一段 添加用戶賬號密碼進(jìn)入用戶表的代碼 . 這代碼可能會在多個(gè)控制器中使用. 此時(shí)我們就可以將這段代碼封裝到Model中.
Model的定義與控制器Action 是一樣的操作 Model 默認(rèn)存放目錄在 /Model. 我們實(shí)例一個(gè)
寫入內(nèi)容 Model定義方式與Action一致 首字母大寫.
新建文件 /Model/User.php
<?php
namespace Model;
use HY\Model;
!defined('HY_PATH') && exit('HY_PATH not defined.');
class User extends Model{
public function test(){
echo '這是UserModel的test函數(shù)';
}
}上面就是一個(gè)簡單的Model 類 與 方法函數(shù) 我們嘗試在控制器中使用它
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例UserModel
$User = M("User");
//調(diào)用UserModel 中的 test() ;
$User->test();
//對User表插入數(shù)據(jù)
$User->insert(array(
"user" => "admin",
"pass" => "admin",
));
}
}+++ get:/ <<< success 這是UserModel的test函數(shù) +++
/Model/User.php 內(nèi)容
<?php
namespace Model;
use HY\Model;
!defined('HY_PATH') && exit('HY_PATH not defined.');
class User extends Model{
//一個(gè)添加用戶的函數(shù)
public function add_info($user,$pass){
$this->insert(array(
"user" => $user,
"pass" => $pass,
));
}
//刪除某用戶函數(shù)
public function del_user($user){
$this->delete(array(
'user'=>$user
))
}
}控制器中使用
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例UserModel
$User = M("User");
//調(diào)用UserModel 中的 add_info() ;
//添加一個(gè)用戶
$User->add_info('admin','123456');
//刪除 admin 用戶
$User->del_user('admin');
}
}Model上的 debug()方法 可以對該條語句不執(zhí)行 并輸出該語句所生成的SQL語句
$id = $User->debug()->insert(array(
"user" => "admin",
"pass" => "admin",
));
//輸出
INSERT INTO "hy_user" ("user", "pass") VALUES ('admin', 'admin')
//中文語法
$id = $User->調(diào)試()->插入(array(
"user" => "admin",
"pass" => "admin",
));通常我們在使用select和find的時(shí)候,希望查詢結(jié)果緩存下來,但是又需要調(diào)用cache(), 還要寫判斷語句,為了避免這種麻煩,HYPHP 直接在Model中內(nèi)置了 查詢緩存。
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
$User = S("User");
$User->select('user',array(
"uid" =>1,
));
}
}上面的代碼 select 獲取user表 uid為1的用戶 這是一個(gè)我們常用的查詢方法。而且是固定的結(jié)果。 但是每次訪問都必須執(zhí)行這個(gè)SQL去獲取。 所以會消耗服務(wù)器資源。 所以我們有必要將這個(gè)查詢結(jié)果緩存下來。
S()->cache($key,$expire=NULL)->select() ->cache(緩存鍵名,緩存過期時(shí)間)->select()
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
$User = S("User");
$User->cache('user',10)->select('user',array(
"uid" =>1,
));
}
}上面的代碼 緩存10秒這個(gè)select查詢得到的數(shù)據(jù) 緩存鍵名為user
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
$User = S("User");
$User->cache(true,10)->select('user',array(
"uid" =>1,
));
}
}->cache(true,10) 緩存鍵名填寫 true 則會按照這條sql做 自動補(bǔ)充鍵名。
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
$User = S("User");
$User->cache(true)->select('user',array(
"uid" =>1,
));
}
}看到上面代碼,cache沒有輸入過期時(shí)間。則該緩存會永久緩存
Lib 可以在多種場景中使用, 包括Action,Model,View 中 默認(rèn)Lib目錄處于 /Lib . 新建文件 /Lib/User.php (注意大小寫 首字母必須大寫)
<?php
namespace Lib;
class User{
public function check_user($user){
$len = strlen($user);
if($len < 6 || $len > 18)
return false; //'賬號長度不符合標(biāo)準(zhǔn),必須 大于6位 小于18位'
return true;
}
}<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function Index(){
//實(shí)例UserLib
$UserLib = L("User");
$user = 'admin';
$bool = $UserLib->check_user($user);
if($bool)
echo '用戶名格式正確';
else
echo '反之';
}
}
獲取 PHP預(yù)定義變量 框架內(nèi)置了一個(gè)函數(shù) 可以獲取提交到服務(wù)器的參數(shù)數(shù)據(jù).
函數(shù)聲明 X(獲取類型,默認(rèn)值='');
X 函數(shù)可以獲取 _GET _POST _SESSION _COOKIE _SERVER 數(shù)據(jù). 并且你不需要再去使用isset 去判斷索引是否存在 以及 empty 去判斷是否為空 如果 X 函數(shù)返回假 說明不存在
| 類型 | 原方式 | 運(yùn)用方式 |
|---|---|---|
| post | $_POST['參數(shù)名'] | X('post.參數(shù)名') |
| get | $_GET['參數(shù)名'] | X('get.參數(shù)名') |
| cookie | $_COOKIE['參數(shù)名'] | X('cookie.參數(shù)名') |
| session | $_SESSION['參數(shù)名'] | X('session.參數(shù)名') |
| server | $_SERVER['參數(shù)名'] | X('server.參數(shù)名') |
控制器中使用
<?php
namespace Action;
use HY\Action;
class IndexAction extends Action {
public function Index(){
echo X("get.id");
echo X('get.xxxx',0); //如果沒設(shè)置get參數(shù)xxxx 則返回默認(rèn)值0
}
}
訪問Index控制器 +++ get:/?id=1 <<< success 1 0 +++
大家在之前的文檔中 會經(jīng)常看到 M("User") 的出現(xiàn) M() 是框架一個(gè)內(nèi)置的函數(shù)
M 函數(shù)用于加載你的 Model 類 并且實(shí)例這個(gè)表作為對象操作.
<?php
namespace Action;
use HY\Action;
class IndexAction extends Action {
public function Index(){
//使用 M 函數(shù)對 User 數(shù)據(jù)表 進(jìn)行操作
$User = M("User");
//插入數(shù)據(jù)
$User->insert ... ..
....
..
關(guān)于 SQL操作 請?jiān)跀?shù)據(jù)庫模型中查看
}
}
該函數(shù)在之前的文檔中 沒有提過 也沒有進(jìn)行過使用. 該函數(shù)與S 函數(shù)差不多 S函數(shù) 是不加載你的自定義Model模型 跳過Model 的加載 直接加載系統(tǒng)底層操作對象類 所以使用S函數(shù)加載的對象 是操作不了Model的內(nèi)容的
當(dāng)我們的Model封裝了太多的 函數(shù)后 我們有時(shí)候操作簡單的SQL 并不會使用到Model的內(nèi)容是 我們就可以使用S函數(shù) 跳過Model的加載 提升效率
<?php
namespace Action;
use HY\Action;
class IndexAction extends Action {
public function Index(){
//使用 S 函數(shù)對 User 數(shù)據(jù)表 進(jìn)行操作
$User = S("User");
//插入數(shù)據(jù)
$User->insert ... ..
}
}
C 函數(shù)可以獲取你在 /Conf/config.php 配置的值 你也可以臨時(shí)將值儲存 但他不會保存到你的config.php中哦! 你可以重復(fù)設(shè)置同一個(gè)值 進(jìn)行覆蓋
<?php
namespace Action;
use HY\Action;
class IndexAction extends Action {
public function Index(){
//獲取
echo C("url_explode"); //獲取 URL分隔符
echo C("SQL_IP"); //獲取 數(shù)據(jù)庫地址
//設(shè)置
C('TEST','123');
C(array(
'TEST'=>'123',
'AAA'=>'zxc'
));
//獲取
echo C('TEST'); //輸出 123
echo C('AAA'); //輸出 zxc
}
}
我們開發(fā)時(shí)肯定會有很多個(gè)控制器 存放于 Action中 但如果我們想在 Index控制器 中調(diào)用 Home控制器 里的函數(shù)怎么辦咧? 使用A函數(shù)
這是Index控制器內(nèi)容
<?php
namespace Action;
use HY\Action;
class IndexAction extends Action {
public function Index(){
echo '我是Index控制器的Index()方法 <br>';
//我們調(diào)用一下 Home控制器的 test 方法
A('Home')->test();
//我們可以將 A 儲存為對象
$HomeAction = A("Home");
$HomeAction->test();
}
}
這是Home控制器內(nèi)容
<?php
namespace Action;
use HY\Action;
class HomeAction extends Action {
public function test(){
echo '我是Home控制器的test()方法 <br>' ;
}
}我們訪問一下 Index 控制器 看一下結(jié)果 +++ get:/ <<< success 我是Index控制器的Index()方法 我是Home控制器的test()方法 我是Home控制器的test()方法 +++ End
該函數(shù)復(fù)制與 ThinkPHP .
Cookie 是我們最常用的操作 將數(shù)據(jù)存儲在 用戶瀏覽器上, 并且可以設(shè)置有效期.
cookie($name='', $value='',$expire=0) $name : cookie字段 [可選] $value : 設(shè)置cookie值 [可選] $expire : cookie有效期 [可選] 0 等于永遠(yuǎn) 如果3個(gè)參數(shù)都輸入 直接調(diào)用cookie 會直接返回所有cookie .作為數(shù)組返回 相當(dāng)于返回整個(gè) $_COOKIE
<?php
namespace Action;
use HY\Action;
class IndexAction extends Action {
public function Index(){
//獲取cookie值
$user = cookie('user'); //儲存在用戶瀏覽器的user字段
//設(shè)置cookie值
cookie('user','admin');
//設(shè)置cookie值 并 設(shè)置有效期
//單位是秒
// 設(shè)置cookie user 只有60秒
cookie('user','admin',60);
//刪除cookie
//將第二參數(shù) 設(shè)置為 null 即為刪除 user字段
cookie('user',null);
}
}
session 與cookie不同. cookie 的數(shù)據(jù)是保存在 用戶瀏覽器那邊的, 所以懂點(diǎn)技術(shù)的用戶是可以看到cookie 的內(nèi)容的. 而session的數(shù)據(jù)是儲存在 服務(wù)器的, 用戶是無法直接看到 session儲存的數(shù)據(jù)的
session 還是需要通過cookie儲存一個(gè)索引在用戶瀏覽器中 從而session從這個(gè)索引中找到 屬于這個(gè)用戶的數(shù)據(jù)
<?php
namespace Action;
use HY\Action;
class IndexAction extends Action {
public function Index(){
//使用session 時(shí)一定要先啟動session
//啟動session
session('[start]'); //啟動了這步 才能操作session 這個(gè)步驟請勿多次使用 每次執(zhí)行只能使用一次
//獲取session值
echo session('user');
//設(shè)置session值
session('user','admin');
//刪除session值
session('user',null);
//返回所有 session 等同于$_SESSION
print_r(session());
}
}
該函數(shù)較為少用 用于終止PHP運(yùn)行 并拋出PHP錯(cuò)誤進(jìn)行提醒
該函數(shù)不是exit 以及 die 而是 throw new \Exception($str);
cache 數(shù)據(jù)緩存 HYPHP內(nèi)置了 THINKPHP 的 數(shù)據(jù)緩存類 系統(tǒng)目前已經(jīng)支持的緩存類型包括:Apachenote、Apc、Db、Eaccelerator、File、Memcache、Redis、Shmop、Sqlite、Wincache和Xcache。
默認(rèn)會使用使用File緩存類型. 將你的數(shù)據(jù)儲存到 /Tmp目錄中 作為文件儲存
配置你的數(shù)據(jù)緩存類型 配置信息請?zhí)顚懺?/Conf/config.php 中
以下是配置實(shí)例
<?php
return array(
'DATA_CACHE_TYPE' => 'File',
'DATA_CACHE_TIME' => 0,
'DATA_CACHE_TABLE' => 'cache',
'DATA_CACHE_PREFIX' => '',
'DATA_CACHE_COMPRESS' => false, //開啟緩存數(shù)據(jù)壓縮 gzcompress
'DATA_CACHE_PATH' => TMP_PATH . 'cache',
'DATA_CACHE_KEY' => '',
)上面是File緩存方式的配置 關(guān)于配置項(xiàng)的更多信息
| 配置名 | 說明 |
|---|---|
| DATA_CACHE_TYPE | Apachenote、Apc、Db、Eaccelerator、File、Memcache、Redis、Shmop、Sqlite、Wincache和Xcache |
| DATA_CACHE_TIME | 緩存過期時(shí)間 (秒) 0 = 永久緩存 |
| DATA_CACHE_TABLE | 如果使用數(shù)據(jù)庫DB緩存 請?zhí)顚慏B表 |
| DATA_CACHE_PREFIX | 緩存前綴 默認(rèn)為空 |
| DATA_CACHE_PATH | 文件緩存保存路徑 默認(rèn)為 TMP_PATH/cache |
| DATA_CACHE_KEY | 文件緩存名加密KEY |
| DATA_CACHE_COMPRESS | 是否壓縮數(shù)據(jù) (需要gzcompress , gzuncompress函數(shù)支持) |
| DATA_CACHE_TIMEOUT | 連接緩存服務(wù)器 超時(shí)時(shí)間 默認(rèn)為空 使用系統(tǒng)默認(rèn)值 |
| REDIS_HOST | REDIS緩存服務(wù)器地址 |
| REDIS_PORT | REDIS緩存服務(wù)器端口 |
| MEMCACHE_HOST | Memcache 緩存服務(wù)器地址 |
| MEMCACHE_PORT | Memcache 緩存服務(wù)器端口 |
| MEMCACHED_SERVER | Memcached 緩存服務(wù)器地址 必須是array 多臺服務(wù)器IP |
| MEMCACHED_LIB | Memcached 配置參數(shù) |
MemcacheD 配置
'MEMCACHED_SERVER' => array(
array('mem1.domain.com', 11211, 33),
array('mem2.domain.com', 11211, 67)
);DB表的建立
/** * 數(shù)據(jù)庫方式緩存驅(qū)動 hy_ 是你配置的數(shù)據(jù)庫前綴 * CREATE TABLE hy_cache ( * cachekey varchar(255) NOT NULL, * expire int(11) NOT NULL, * data blob, * datacrc int(32), * UNIQUE KEY `cachekey` (`cachekey`) * ); */
換網(wǎng)線
我們默認(rèn)不需要配置以上的信息, 只是有額外需求時(shí)配置. 我們的cache函數(shù)是依然可用的
//設(shè)置緩存 設(shè)置字段user 儲存為 admin 該數(shù)據(jù)就會默認(rèn)儲存為文件 可以下次使用
cache('user','admin');
//獲取緩存
echo cache('user'); //獲取之前設(shè)置的user字段
//輸出 admin
//刪除緩存
cache('user',null) ; //將第二參數(shù)設(shè)置為null 則為刪除緩存
//更多使用
//設(shè)置緩存 儲存admin到user字段 有效期60秒 如果超過60秒 去獲取 user 則返回false
cache('user','admin',array(
'expire'=>60
));
//設(shè)置緩存 改為 db 緩存
cache('user','admin',array(
'type'=>'db'
'expire'=>60
));
//獲取 后期db緩存
cache('user','',array(
'type'=>'db'
'expire'=>60
));
F 函數(shù)是cache衍生的一個(gè)函數(shù) 他只采用File方式進(jìn)行緩存 使用方式和cache 是一致的
//設(shè)置緩存
F('user','admin');
//輸出緩存
echo F('user');
//刪除緩存
F('user',null)hy_is_mobile 函數(shù) 該函數(shù)來源于 Wordpress 中 返回(bool)
if(hy_is_mobile())
echo '移動短';
else
echo '非移動端';框架也直接內(nèi)置了 判斷移動端的常量 他的定義也是來源于 hy_is_mobile函數(shù) 內(nèi)置了3個(gè)常量 IS_MOBILE , IS_SHOUJI , IS_WAP
if(IS_MOBILE)
echo '移動端';
else
echo '非移動端';vendor 函數(shù) vendor 函數(shù)是用于自動加載類庫時(shí)使用的, 當(dāng)我們在網(wǎng)絡(luò)服務(wù)中獲得 SDK 時(shí), 就需要用到了. 現(xiàn)在大多SDK 都采用了namespace . 拿七牛云儲存的SDK演示
在網(wǎng)站根目錄新建目錄 SDK , 在目錄中放入七牛的SDK 路徑成 wwwroot/SDK/Qiniu 當(dāng)我們的 Action 需要使用Qiniu的SDK時(shí)
<?php
namespace Action;
use HY\Action;
class Index extends Action {
public function index(){
$auth = new \Qiniu\Auth('accessKey', 'secretKey');
//當(dāng)訪問時(shí) 就會出現(xiàn) 沒有\(zhòng)Qiniu\Auth 類
//因?yàn)榭蚣懿]有找到 \Qiniu的目錄進(jìn)行自動加載
//所以我們需要用到 vendor函數(shù)
vendor('SDK');
//意為 將 SDK 加載到自動加載路徑判斷列表中
}
}部分常量 你可以在框架入口文件定義它.
| 常量名 | 說明 | 可否提前定義 |
|---|---|---|
| NOW_TIME | 當(dāng)前服務(wù)器時(shí)間 返回時(shí)間戳 秒 | |
| CLIENT_IP | 當(dāng)前訪問客戶IP,非獲取真實(shí)代理! | |
| IS_GET | 當(dāng)前訪問是否為GET | |
| IS_POST | 當(dāng)前訪問是否為POST | |
| IS_AJAX | 當(dāng)前訪問是否為AJAX | |
| ACTION_NAME | 當(dāng)前訪問Action | |
| METHOD_NAME | 當(dāng)前訪問方法函數(shù) | |
| IS_WAP | 當(dāng)前訪問是否為移動端 | |
| IS_SHOUJI | 當(dāng)前訪問是否為移動端 | |
| IS_MOBILE | 當(dāng)前訪問是否為移動端 | |
| PATH | 項(xiàng)目路勁 | Y |
| ACTION_PATH | Action控制器目錄路徑 | Y |
| VIEW_PATH | View模板目錄路徑 | Y |
| CONF_PATH | Conf配置文件目錄路徑 | Y |
| TMP_PATH | Tmp模板緩存目錄路徑 | Y |
| TMPHTML_PATH | TmpThml靜態(tài)緩存目錄路徑 | Y |
| MYLIB_PATH | Lib自定義類庫目錄路徑 | Y |
| MODEL_PATH | 模型文件目錄路徑 | Y |
| HY_PATH | 框架目錄路徑 | Y |
| PLUGIN_PATH | HOOK 目錄 | Y |
| DEBUG | 調(diào)試模式 true or false | Y |
| PLUGIN_ON HOOK | 插件機(jī)制開關(guān) (bool) | Y |
| PLUGIN_ON_FILE | 每個(gè)插件目錄獨(dú)立開關(guān) (bool) | Y |
| PLUGIN_MORE_LANG_ON | 中文PHP語法 (bool) | Y |
####額外說明 有的童鞋說 框架默認(rèn)生成的目錄路勁 能不能自己定義? 框架默認(rèn)會將目錄生成于根目錄下 如果你要搬走它 請把入口文件index.php改為如下:
<?php
define('INDEX_PATH' , str_replace('\\', '/', dirname(__FILE__)).'/');
define('PATH' , INDEX_PATH.'Apping/');
define('DEBUG' ,true);
require INDEX_PATH . 'App/HY/HY.php';框架生成的目錄 就會在你的根目錄下/App目錄中生成
Config.php 參數(shù) 可能文檔未來得及更新 部分配置參數(shù)
| 配置項(xiàng) | 說明 | 可否修改 |
|---|---|---|
| var_left_tpl | { 模板變量輸出標(biāo)志符 | N |
| var_right_tpl | } 模板變量輸出標(biāo)志符 | N |
| tpl_suffix | 模板文件后綴 默認(rèn).html | Y |
| url_suffix | URL為靜態(tài)后綴 默認(rèn).html | Y |
| url_explode | 路由控制分割符號 默認(rèn)/ | Y |
| tmphtml_del_time | 靜態(tài)文件有效期 默認(rèn)0 為永久 否則秒單位 | Y |
| DEBUG_PAGE | DEBUG 頁面顯示 默認(rèn)false | Y |
| HOOK_SUFFIX | HOOK后綴 | Y |
| error_404 | 404頁面模板, 默認(rèn)使用框架404頁面 | Y |
| MORE_LANG_LIB_FILE | 額外中文PHP函數(shù)配置 (數(shù)組) | Y |
| 配置項(xiàng) | 說明 |
|---|---|
| DATA_CACHE_TYPE | Apachenote、Apc、Db、Eaccelerator、File、Memcache、Redis、Shmop、Sqlite、Wincache和Xcache |
| DATA_CACHE_TIME | 緩存過期時(shí)間 (秒) 0 = 永久緩存 |
| DATA_CACHE_TABLE | 如果使用數(shù)據(jù)庫DB緩存 請?zhí)顚慏B表 |
| DATA_CACHE_PREFIX | 緩存前綴 默認(rèn)為空 |
| DATA_CACHE_PATH | 文件緩存保存路徑 默認(rèn)為 TMP_PATH/cache |
| DATA_CACHE_KEY | 文件緩存名加密KEY |
| DATA_CACHE_COMPRESS | 是否壓縮數(shù)據(jù) (需要gzcompress , gzuncompress函數(shù)支持) |
| DATA_CACHE_TIMEOUT | 連接緩存服務(wù)器 超時(shí)時(shí)間 默認(rèn)為空 使用系統(tǒng)默認(rèn)值 |
| REDIS_HOST | REDIS緩存服務(wù)器地址 |
| REDIS_PORT | REDIS緩存服務(wù)器端口 |
| MEMCACHE_HOST | Memcache 緩存服務(wù)器地址 |
| MEMCACHE_PORT | Memcache 緩存服務(wù)器端口 |
| MEMCACHED_SERVER | Memcached 緩存服務(wù)器地址 必須是array 多臺服務(wù)器IP |
| MEMCACHED_LIB | Memcached 配置參數(shù) |
| 配置項(xiàng) | 說明 |
|---|---|
| SQL_TYPE | 數(shù)據(jù)庫類型 : 數(shù)據(jù)庫引擎用了PDO, 必須開啟PDO擴(kuò)展. 數(shù)據(jù)庫支持根據(jù)你的PDO支持所支持 |
| SQL_NAME | 數(shù)據(jù)庫庫名 |
| SQL_IP | 數(shù)據(jù)庫 IP |
| SQL_USER | 數(shù)據(jù)庫 用戶名 |
| SQL_PASS | 數(shù)據(jù)庫 密碼 |
| SQL_CHARSET | 數(shù)據(jù)庫字符集 |
| SQL_PORT | 數(shù)據(jù)庫 端口 |
| SQL_PREFIX | 數(shù)據(jù)庫 前綴 |
| SQL_OPTION | PDO配置 |
什么是插件? 或者說是一種模塊 他可以在不修改你Action Model View源代碼的情況下 去修改 你的代碼內(nèi)容.
該模式一般用于開源項(xiàng)目上使用, 可以更好的實(shí)現(xiàn)插件化程序.
目前框架提供了兩種插件解析
作者自評該模式 優(yōu)缺各有展現(xiàn), 優(yōu)點(diǎn)可以更好的模塊化, 缺點(diǎn)需要hook點(diǎn)以及關(guān)鍵字替換.
該模式一旦開啟 你的Action Model 將會想View一樣 采用緩存形式進(jìn)行編譯. 從而才能讓插件模式進(jìn)行解析.
在入口文件 index.php 開啟插件模式 開發(fā)時(shí) 務(wù)必開啟 DEBUG 模式.
<?php
define('INDEX_PATH' , str_replace('\\', '/', dirname(__FILE__)).'/');
define('DEBUG' ,true); //開啟DEBUG模式
define('PLUGIN_ON' ,true); //開啟插件模式
require INDEX_PATH . 'HY/HY.php';如果沒有這個(gè)模式需求 請不要開啟他
默認(rèn)插件目錄 /Plugin. 我們在該目錄新建一個(gè)文件夾 test. 在 test 目錄下新建文件 a.hook. 在a.hook文件中寫入內(nèi)容
echo '這是test插件的a hook內(nèi)容 <br>';
那我們的控制器如何使用到這個(gè)a.hook呢 我們看一下控制器內(nèi)容
<?php
namespace Action;
use HY\Action;
class IndexAction extends Action {
public function Index(){
//{hook a}
echo '這是Index控制器的index() 方法';
}
}訪問控制器 +++ get:/
<<< success 這是test插件的a hook內(nèi)容 這是Index控制器的index() 方法 +++ 在控制器中建立hook點(diǎn) //{hook 名稱} 框架引擎將查找你的插件目錄 尋找到名稱.hook 吧內(nèi)容插入到控制器中執(zhí)行
re 插件機(jī)制可以與hook同時(shí)使用, 但re機(jī)制的解析優(yōu)先級要比hook的優(yōu)先. re 插件機(jī)制 與 hook的不同之處是 hook需要在源代碼插入hook點(diǎn), 而re機(jī)制則不需要hook點(diǎn) 直接查找源代碼進(jìn)行替換修改 接著上面的做法 在test 插件目錄新建文件re.php. 寫入
<?php
return array(
'Action/Index.php'=>array(
'a1'=>'a2'
)
);上面的意思是指: 修改Action/Index.php內(nèi)容. 查找 /Plugin/test/a1 文件內(nèi)容 替換為 /Plugin/test/a2 文件內(nèi)容
Index控制器內(nèi)容
<?php
namespace Action;
use HY\Action;
class IndexAction extends Action {
public function Index(){
//{hook a}
echo '這是Index控制器的index() 方法';
}
}Plugin/test/a1 文件內(nèi)容
echo '這是Index控制器的index() 方法';
Plugin/test/a2 文件內(nèi)容
echo '這是Index控制器的index() 方法 <br>'; echo '我是re機(jī)制追加的內(nèi)容'
訪問控制器 +++ get:/
<<< success 這是test插件的a hook內(nèi)容 這是Index控制器的index() 方法 我是re機(jī)制追加的內(nèi)容 +++
控制每個(gè)插件的可用性
入口文件增加常量定義
<?php
define('INDEX_PATH' , str_replace('\\', '/', dirname(__FILE__)).'/');
define('DEBUG' ,true); //開啟DEBUG模式
define('PLUGIN_ON' ,true); //開啟插件模式
define('PLUGIN_ON_FILE',true); //插件獨(dú)立開關(guān)
require INDEX_PATH . 'HY/HY.php';此時(shí)你的插件會全部失效. 只有你的插件目錄存在 on 文件 才會啟動它.
例: test插件 /Plugin/test. 你需要在 test 目錄新建一個(gè) on 文件 (不需要寫入數(shù)據(jù)到該文件) test 插件才會生效
中文PHP可以在Action Model中使用 該引擎不會與原PHP函數(shù)出現(xiàn)沖突. 目前支持大部分常用的PHP內(nèi)置函數(shù) 以及固定好的 HYPHP框架函數(shù)
在入口文件 index.php 中定義常量
define('PLUGIN_ON' ,true);
define('PLUGIN_MORE_LANG_ON',true);即可開啟該機(jī)制
完整 index.php
<?php
define('DEBUG' ,true);
define('PLUGIN_ON' ,true);
define('PLUGIN_MORE_LANG_ON',true);
require 'HY/HY.php';| 中文名 | 原PHP名稱 |
|---|---|
| 輸出 | echo |
| 輸出數(shù)組 | print_r |
| 中文名 | 原PHP名稱 |
|---|---|
| 如果 | if |
| 或者 | elseif |
| 反之 | else |
| 循環(huán)對象 | foreach |
| 循環(huán) | for |
| 循環(huán)判斷 | while |
| 跳出循環(huán) | break |
| 跳到下次循環(huán) | continue |
| 返回 | return |
| 結(jié)束 | exit |
| 包含文件 | include |
| 跳轉(zhuǎn)運(yùn)行 | goto |
| 延遲 | sleep |
| 微秒延遲 | usleep |
| 中文名 | 原PHP名稱 |
|---|---|
| 讀取文件 | file_get_contents |
| 寫入文件 | file_put_contents |
| 新建目錄 | mkdir |
| 移動文件 | rename |
| 文件重命名 | rename |
| 文件是否存在 | is_file |
| 目錄是否存在 | is_dir |
| 刪除文件 | unlink |
| 刪除目錄 | rmdir |
| 復(fù)制文件 | copy |
| 打開文件 | fopen |
| 關(guān)閉文件 | fclose |
| 文件_指針是否結(jié)束 | feof |
| 文件_讀取指針處字符 | fgetc |
| 文件_讀取指針處一行 | fgets |
| 文件_讀取指針處一行_過濾HTML | fgetss |
| 文件_讀入數(shù)組 | file |
| 文件_上次訪問時(shí)間 | fileatime |
| 文件_上次修改時(shí)間 | filemtime |
| 文件_所有者 | fileowner |
| 文件_獲取權(quán)限 | fileperms |
| 文件_大小 | filesize |
| 文件_類型 | filetype |
| 文件_鎖 | flock |
| 文件_讀取指針處所有數(shù)據(jù) | fpassthru |
| 文件_是否可讀 | is_readable |
| 文件_是否可寫 | is_writable |
| 中文名 | 原PHP名稱 |
|---|---|
| 打開目錄句柄 | opendir |
| 關(guān)閉目錄句柄 | closedir |
| 目錄_句柄讀取 | readdir |
| 刪除目錄 | rmdir |
| 中文名 | 原PHP名稱 |
|---|---|
| 執(zhí)行程序 | exec |
| 執(zhí)行程序并返回結(jié)果 | system |
| 中文名 | 原PHP名稱 |
|---|---|
| 數(shù)組_索引是否存在 | array_key_exists |
| 數(shù)組_獲取所有索引名稱 | array_key_exists |
| 數(shù)組_合并 | array_merge |
| 數(shù)組_排序 | array_multisort |
| 數(shù)組_刪除結(jié)尾元素 | array_pop |
| 數(shù)組_刪除開頭元素 | array_shift |
| 數(shù)組_所有值相乘 | array_product |
| 數(shù)組_所有值相加 | array_sum |
| 數(shù)組_結(jié)尾追加元素 | array_push |
| 數(shù)組_開頭追加元素 | array_unshift |
| 數(shù)組_隨機(jī)取元素 | array_rand |
| 數(shù)組_搜索值 | array_search |
| 數(shù)組_刪除重復(fù)值 | array_unique |
| 數(shù)組索引總數(shù) | count |
| 數(shù)組_是否存在該值 | in_array |
| 定義數(shù)組 | array |
| 中文名 | 原PHP名稱 |
|---|---|
| 當(dāng)前時(shí)間戳 | time |
| 格式化時(shí)間 | date |
| 中文名 | 原PHP名稱 |
|---|---|
| 分割字符串 | explode |
| 分割 | explode |
| 獲取字符串長度 | strlen |
| 查找字符串位置 | strlen |
| 字符串_取部分 | strlen |
| 字符串_過濾HTML與PHP代碼 | strlen |
| 轉(zhuǎn)為小寫 | strtolower |
| 轉(zhuǎn)為大寫 | strtoupper |
| 字符串_倒轉(zhuǎn) | strrev |
| 隨機(jī)打亂字符串 | str_shuffle |
| 字符串_首字母轉(zhuǎn)大寫 | ucfirst |
| 字符串_買個(gè)段落首字母轉(zhuǎn)大寫 | ucwords |
| 字符串_截?cái)鄶?shù)量 | wordwrap |
| 字符串_引號加斜杠 | addslashes |
| 兩個(gè)字符串相似度 | similar_text |
| 中文名 | 原PHP名稱 |
|---|---|
| DNS通信測試 | checkdnsrr |
| 獲取域名指向IP | gethostbyname |
| 獲取域名指向IP_數(shù)組 | gethostbynamel |
| IP轉(zhuǎn)數(shù)字 | ip2long |
| 數(shù)字轉(zhuǎn)IP | long2ip |
| 打開套接字 | fsockopen |
| 打開套接字_持久 | pfsockopen |
| 關(guān)閉套接字 | fclose |
| 設(shè)置COOKIE | setcookie |
| 中文名 | 原PHP名稱 |
|---|---|
| 輸出模板 | $this->display |
| 中文名 | 原PHP名稱 |
|---|---|
| 查找 | find |
| 插入 | insert |
| 插入更多 | insertAll |
| 選擇 | select |
| 更新 | update |
| 刪除 | delete |
| 是否存在 | has |
| 替換 | replace |
| 總數(shù) | count |
| 最大值 | max |
| 最小值 | min |
| 平均值 | avg |
| 相加 | sum |
| 調(diào)試 | debug |
Index 控制器內(nèi)容
<?php
namespace Action;
use HY\Action;
class IndexAction 繼承 Action{
公開函數(shù) index(){
輸出 '這里是IndexAction中的Index()方法';
}
public function test(){
輸出 '這里是IndexAction中的test()方法';
}
}訪問 / 則輸出
這里是IndexAction中的Index()方法
訪問 /index/test 則輸出
這里是IndexAction中的test()方法
Index 控制器內(nèi)容
<?php
namespace Action;
use HY\Action;
class IndexAction 繼承 Action{
公開函數(shù) index(){
$string = '這是一句話';
寫入文件(PATH . 'test.txt',$string);
輸出 讀取文件(PATH . 'test.txt');
刪除文件(PATH . 'test.txt');
}
}寫入文件(路徑,內(nèi)容); 讀取文件(路徑); 刪除文件(路徑); 訪問輸出
這是一句話
更多的文件操作API 可以在文檔中查看.
你可以在 config.php 中加入配置 MORE_LANG_LIB_FILE 加入更多的中文解析配置進(jìn)來
config.php 內(nèi)容
<?php
return array(
//....其他配置
'MORE_LANG_LIB_FILE'=>array(
'配置文件路徑'
),
};例如: 在Lib目錄下新建文件 a.php; 寫入內(nèi)容
<?php
return array(
'/([{};,(\s.]+)讀文件([\s\'\"\(]+)/i'=>'$1file_get_contents$2',
};config.php 內(nèi)容
<?php
return array(
//....其他配置
'MORE_LANG_LIB_FILE'=>array(
'/Lib/a.php'
),
};我們在代碼中就可以使用 讀文件 了