PHP 手册
后退 |  | 前进

# 章 60. 杂类问题

有些问题没法归到其它类中，可以在这里找到。

1. 在 Windows 中怎样处理 bz2 压缩的文档？
2. 在函数定义中，参数旁边的 & 是什么意思？例如 asort()。
3. 怎么处理 register_globals？

1. 在 Windows 中怎样处理 bz2 压缩的文档？

如果没有能处理 bz2 文件的压缩工具，从 Redhat 下载一个命令行工具（进一步信息见下面）。

如果不喜欢用命令行工具，可以试试免费工具例如 Stuffit Expander，UltimateZip，7-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 配置的选项，如果不行，那可以用如下的兼容手段。

例子 60-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($superglobal, EXTR_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();
?>`

后退 | 起点 | 前进
从 PHP 4 移植到 PHP 5 | 上一级 | 附录