PHP過濾器的實(shí)現(xiàn)方法第2/2頁
更新時(shí)間:2010年07月08日 02:51:02 作者:
要想在PHP中實(shí)現(xiàn)一個(gè)類似過濾器的功能,因?yàn)槲业男枨笫沁@樣的,有個(gè)開發(fā)好了的OA系統(tǒng),要集成到我們的應(yīng)用中,OA要對外來的數(shù)據(jù)進(jìn)行過濾,在給自己處理。
在java中實(shí)現(xiàn)過濾器,很簡單,只需要在web.xml中配置如:
<filter>
<filter-name>iSpaceAuth</filter-name>
<filter-class>
com.skylark.console.servlet.ISpaceLoginFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>iSpaceAuth</filter-name>
<url-pattern>/console/*</url-pattern>
</filter-mapping>
要想在PHP中實(shí)現(xiàn)一個(gè)類似的功能,因?yàn)槲业男枨笫沁@樣的,有個(gè)開發(fā)好了的OA系統(tǒng),要集成到我們的應(yīng)用中,OA要對外來的數(shù)據(jù)進(jìn)行過濾,在給自己處理。這樣就等于我必須寫一個(gè)Php文件進(jìn)行過濾,然后OA系統(tǒng)的文件都必須include該文件。這多恐怖,要重復(fù)的改好多代碼,而且,代碼的耦合度相當(dāng)?shù)母摺?
查找PHP手冊發(fā)現(xiàn)了有一些過濾的東西,
一、過濾函數(shù)
filter_has_var — Checks if variable of specified type exists 檢查變量是否是指定的類型
filter_id — Returns the filter ID belonging to a named filter 通過過濾器名得到過濾器的ID
filter_input_array — Gets external variables and optionally filters them
filter_input — Gets a specific external variable by name and optionally filters it
filter_list — Returns a list of all supported filters 返回支持的過濾器列表
filter_var_array — Gets multiple variables and optionally filters them 得到多個(gè)變量的值,每個(gè)變量選擇一個(gè)過濾器
filter_var — Filters a variable with a specified filter 用指定的過濾器過濾變量
以前沒使用過這個(gè)東東,今天試用下。
<?php
function convertSpace($string){
return str_replace("_", " ", $string);
}
$string = "Peter_is_a_great_guy!";
echo filter_var($string, FILTER_CALLBACK,array("options"=>"convertSpace"));
?>
會(huì)輸出 Peter is a great guy!
發(fā)現(xiàn)PHP提供的過濾器只是對輸入數(shù)據(jù)的過濾。不能像java一樣,對整個(gè)項(xiàng)目訪問進(jìn)行過濾。java的過
濾器還能指定過濾規(guī)則??吹竭@個(gè)規(guī)則讓我想起了apache有個(gè)rewrite_rules的模塊。讓所有的訪問都
重定向到一個(gè)文件,那個(gè)文件就相當(dāng)于一個(gè)過濾器了。我個(gè)那個(gè)文件取名filter
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)host [NC]
RewriteRule ^(.*) filter.php
雖然這樣是可以實(shí)現(xiàn)。但是文件的組織方式必須是有規(guī)則的,就像單入口訪問一樣的。通過在filter.php通過new一個(gè)訪問對象,
調(diào)用一個(gè)方法來訪問頁面。
單入口的代碼
復(fù)制代碼 代碼如下:
<?php
require_once './config.php';
$act = isset($_REQUEST['act']) ? trim($_REQUEST['act']) : 'index';
$ctl = isset($_REQUEST['ctl']) ? trim($_REQUEST['ctl']) : 'default';
$ctl = strtolower($ctl);
$act = strtolower($act);
require_once ROOTPATH.'/'.'lib'.'/controller/'.$ctl.'.php';
$ctl = ucfirst($ctl).'Controller';
$act = $act.'Action';
$app = new $ctl($act);
但是該OA實(shí)現(xiàn)的不是單入口訪問。這樣的話訪問的頁面就一直是filter.php跳轉(zhuǎn)之后又跳回來了。
最后在發(fā)現(xiàn)在PHP的配置文件php.ini中可以配置 auto_prepend_file,該值的作用是在每個(gè)文件訪問
之前include該文件。這樣include的文件就相當(dāng)一個(gè)過濾器了。哈哈!該配置文件要重啟服務(wù)啊,有點(diǎn)
郁悶,那有沒有改了之后不用重啟服務(wù)的方法呢?當(dāng)然有了,那就是采用.htaccess文件了。配置如
下。
RewriteEngine on
php_value auto_prepend_file "D:/web/htdocs/demo1/filter.php" 不過這樣有個(gè)缺點(diǎn)就是,當(dāng)訪問量大的時(shí)候,性能會(huì)受到影響。而直接在php.ini文件中改得花就不用 會(huì)了。還有個(gè)優(yōu)點(diǎn)就是如果把.htaccess文件某個(gè)目錄,只對該目錄有效。那么在web目錄下不是所有 的項(xiàng)目都會(huì)添加該文件。 下面我們來測試下。我建個(gè)項(xiàng)目叫demo該項(xiàng)目下的文件有

index.php
復(fù)制代碼 代碼如下:
echo "index.php \n";
filter.php
代碼
復(fù)制代碼 代碼如下:
<?php
echo 'filter'."\n";
$fileName = pathinfo($_SERVER['SCRIPT_FILENAME']);
if($fileName['filename'] == 'index')
{
header("location:".'./test.php');
}
test.php
復(fù)制代碼 代碼如下:
<?php
echo 'test';
?>
我們在url 中輸入 http://localhost/demo/index.php
結(jié)果是:filter test
雖然實(shí)現(xiàn)了但是還是java的相差太多了.java的過濾器可以實(shí)現(xiàn)多個(gè),這個(gè)就不行了。還可以指定哪些訪問要過濾,這個(gè)就不行了。
附:
1、apache rewrite模塊的啟用方法。
在http.conf文件中找到LoadModule rewrite_module modules/mod_rewrite.so把前面的# 刪除。
相關(guān)文章
libmysql.dll與php.ini是否真的要拷貝到c:\windows目錄下呢
很多安裝PHP的教程,都是教大家把php里的libmysql.dll拷貝到c:\windows目錄下(有的教程會(huì)說還要把php.ini等文件拷到系統(tǒng)目錄的,其實(shí)一個(gè)文件都不用拷貝去的。)。2010-03-03用PHP將網(wǎng)址字符串轉(zhuǎn)換成超鏈接(網(wǎng)址或email)
該函數(shù)將 URL 和 E-mail 地址字符串轉(zhuǎn)換為可點(diǎn)擊的超級(jí)鏈接。2010-05-05PHP基于Closure類創(chuàng)建匿名函數(shù)的方法詳解
這篇文章主要介紹了PHP基于Closure類創(chuàng)建匿名函數(shù)的方法,結(jié)合實(shí)例形式詳細(xì)分析了Closure 類的功能、常用函數(shù)使用技巧及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-08-08