章 61. 雜類問題

有些問題沒法歸到其它類中,可以在這裡找到。

1. 在 Windows 中怎樣處理 bz2 壓縮的文件?
2. 在函數定義中,參數旁邊的 & 是什麼意思?例如 asort()
3. 怎麼處理 register_globals

1. 在 Windows 中怎樣處理 bz2 壓縮的文件?

若果沒有能處理 bz2 檔案的壓縮工具,從 Redhat 下載一個指令行工具(進一步訊息見下面)。

若果不喜歡用指令行工具,可以試試免費工具例如 Stuffit ExpanderUltimateZip7-Zip 或是 Quick Zip。若果有像 WinRAR 或是 Power Archiver 之類的工具,可以很容易用它解壓縮 bz2 檔案。若果用 Total Commander(前身為 Windows Commander),可以從 Total Commander 網站免費得到一個 bz2 外掛程式。

來自 Redhat 的 bzip2 指令行工具:

Win2K Sp2 會員下載最新版本 1.0.2,所有其它 Windows 會員應該用版本 1.00。下載後更名可執行檔案為 bzip2.exe。為方便起見將其放到一個在你路徑中的目錄,例如 C:\Windows,C 表示你安裝 Windows 的盤符。

注意:lang 指的是你的語種,x 是想要的格式,例如:pdf。要解壓縮 php_manual_lang.x.bz2,按照下面的簡單說明進行:

  • 開啟一個指令行視窗

  • 進入存放已下載的 php_manual_lang.x.bz2 的目錄

  • 呼叫 bzip2 -d php_manual_lang.x.bz2,將 php_manual_lang.x 釋放到同一個目錄

在下載了包括很多 html 檔案的 php_manual_lang.tar.bz2 的情況下,過程是一樣的。唯一區別是得到了一個 php_manual_lang.tar 檔案。tar 格式可以被大多數 Windows 下流行的壓縮工具所處理,例如 WinZip

2. 在函數定義中,參數旁邊的 & 是什麼意思?例如 asort()

這表示該參數是引用傳遞,該函數會修改其值。只可以用此方法傳遞變量,其實都不需要在函數呼叫中用 & 傳遞(此模式都已過時了)。

3. 怎麼處理 register_globals

有關 register_globals 實現方面的安全性,請閱讀使用 register_globals 一章。

推薦使用超全局變量而不要依賴 register_globals

若果需要在一台關閉了 register_globals 的共享主電腦上運行一些舊式程式而該程式需要此選項開啟時,或是在一些開啟了此選項的主電腦上但想消除安全隱患,那麼就需要用 PHP 來模擬出相反的設定。最好先問清楚是否能否在哪裡變更 PHP 配置的選項,若果不行,那可以用如下的相容手段。

例子 61-1. 模擬註冊全局變量

本例模擬 register_globals On。

<?php
// Emulate register_globals on
if (!ini_get('register_globals')) {
    
$superglobals = array($_SERVER$_ENV,
        
$_FILES$_COOKIE$_POST$_GET);
    if (isset(
$_SESSION)) {
        
array_unshift($superglobals$_SESSION);
    }
    foreach (
$superglobals as $superglobal) {
        
extract($superglobalEXTR_SKIP);
    }
}
?>

本例模擬 register_globals Off。要記住此代碼應在腳本最開頭的地方呼叫。

<?php
// Emulate register_globals off
function unregister_GLOBALS()
{
    if (!
ini_get('register_globals')) {
        return;
    }

    
// Might want to change this perhaps to a nicer error
    
if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
        die(
'GLOBALS overwrite attempt detected');
    }

    
// Variables that shouldn't be unset
    
$noUnset = array('GLOBALS',  '_GET',
                     
'_POST',    '_COOKIE',
                     
'_REQUEST''_SERVER',
                     
'_ENV',     '_FILES');

    
$input array_merge($_GET,    $_POST,
                         
$_COOKIE$_SERVER,
                         
$_ENV,    $_FILES,
                         isset(
$_SESSION) && is_array($_SESSION) ? $_SESSION : array());

    foreach (
$input as $k => $v) {
        if (!
in_array($k$noUnset) && isset($GLOBALS[$k])) {
            unset(
$GLOBALS[$k]);
        }
    }
}

unregister_GLOBALS();

?>