欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP過濾器的實現(xiàn)方法第2/2頁

 更新時間:2010年07月08日 02:51:02   作者:  
要想在PHP中實現(xiàn)一個類似過濾器的功能,因為我的需求是這樣的,有個開發(fā)好了的OA系統(tǒng),要集成到我們的應(yīng)用中,OA要對外來的數(shù)據(jù)進(jìn)行過濾,在給自己處理。


在java中實現(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中實現(xiàn)一個類似的功能,因為我的需求是這樣的,有個開發(fā)好了的OA系統(tǒng),要集成到我們的應(yīng)用中,OA要對外來的數(shù)據(jù)進(jìn)行過濾,在給自己處理。這樣就等于我必須寫一個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 得到多個變量的值,每個變量選擇一個過濾器
filter_var — Filters a variable with a specified filter 用指定的過濾器過濾變量
以前沒使用過這個東東,今天試用下。
<?php
function convertSpace($string){
return str_replace("_", " ", $string);
}
$string = "Peter_is_a_great_guy!";
echo filter_var($string, FILTER_CALLBACK,array("options"=>"convertSpace"));
?>
會輸出 Peter is a great guy!
發(fā)現(xiàn)PHP提供的過濾器只是對輸入數(shù)據(jù)的過濾。不能像java一樣,對整個項目訪問進(jìn)行過濾。java的過
濾器還能指定過濾規(guī)則。看到這個規(guī)則讓我想起了apache有個rewrite_rules的模塊。讓所有的訪問都
重定向到一個文件,那個文件就相當(dāng)于一個過濾器了。我個那個文件取名filter
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)host [NC]
RewriteRule ^(.*) filter.php
雖然這樣是可以實現(xiàn)。但是文件的組織方式必須是有規(guī)則的,就像單入口訪問一樣的。通過在filter.php通過new一個訪問對象,
調(diào)用一個方法來訪問頁面。
單入口的代碼
復(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實現(xiàn)的不是單入口訪問。這樣的話訪問的頁面就一直是filter.php跳轉(zhuǎn)之后又跳回來了。
最后在發(fā)現(xiàn)在PHP的配置文件php.ini中可以配置 auto_prepend_file,該值的作用是在每個文件訪問
之前include該文件。這樣include的文件就相當(dāng)一個過濾器了。哈哈!該配置文件要重啟服務(wù)啊,有點
郁悶,那有沒有改了之后不用重啟服務(wù)的方法呢?當(dāng)然有了,那就是采用.htaccess文件了。配置如
下。
RewriteEngine on
php_value auto_prepend_file "D:/web/htdocs/demo1/filter.php" 不過這樣有個缺點就是,當(dāng)訪問量大的時候,性能會受到影響。而直接在php.ini文件中改得花就不用 會了。還有個優(yōu)點就是如果把.htaccess文件某個目錄,只對該目錄有效。那么在web目錄下不是所有 的項目都會添加該文件。 下面我們來測試下。我建個項目叫demo該項目下的文件有


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

雖然實現(xiàn)了但是還是java的相差太多了.java的過濾器可以實現(xiàn)多個,這個就不行了。還可以指定哪些訪問要過濾,這個就不行了。

附:
1、apache rewrite模塊的啟用方法。
在http.conf文件中找到LoadModule rewrite_module modules/mod_rewrite.so把前面的# 刪除。

相關(guān)文章

最新評論