最近下载了一些与我玩的一个小型网络游戏相关的小型开源项目的代码。尝试访问它失败并抛出错误消息:
PHP致命错误:在第7行上调用/Applications/MAMP/htdocs/infocenter/modules/security_mod.PHP中未定义的函数v()
经过搜索,我发现函数v()是在一个名为"system.php"的文件中定义的,该文件是发生错误的"security_mod.php"文件所需的文件所需。任何require调用都不会发生错误(它们都是"require_one",而不是"include")。
这是整个system.php文件:
<?php
function v($a, $i)
{
return isset($a[$i]) ? $a[$i] : null;
}
?>
这是"security_mod.php"中抛出错误的函数(也包括require调用):
<?php
require_once("settings_mod.php");
require_once("account_mod.php");//this file requires base_mod.php, which requires system.php
class SecurityMod {
public static function checkLogin() {
$name = v($_REQUEST, "acc");//this is the line that causes the error
$password = v($_REQUEST, "pwd");
if (!isset($name) || !isset($password)) {
return null;
}
$acc = AccountMod::getAccount($name);
if (SettingsMod::USE_ENCRYPTED_PASSWORDS) {
if (is_null($acc) || $acc->getPassword() != md5($password)) {
return null;
} else
return $acc;
} else {
if (is_null($acc) || $acc->getPassword() != $password) {
return null;
} else
return $acc;
}
}
?>
我做了一些测试,发现我可以访问其他一些必需文件中的变量和函数。不过,所有这些都在类中,与v()不同。这会是原因吗?
编辑以澄清如何需要"system.php":"security_mod.php"在文件的开头有以下两个require_once
调用:
require_once("settings_mod.php");
require_once("account_mod.php");
"settings_mod.php"是一个包含程序中使用的常量的文件,不包含任何文件。"account_mod.php"有以下两个require_once
调用:
require_once("base_mod.php");
require_once("account.php");
"account.php"有一对include_once
调用,其中包括无关紧要的和不相关的文件。"base_mod.php"是对"system.php"有最终要求的文件:
require_once("system.php");
require_once("settings_mod.php");
发现问题:成功包含的System.php
文件与下载的代码中的文件不同。由于base_mod.php
只提供了一个文件名,而没有提供路径,因此PHP首先检查了我的include_path
指定的目录,该目录原来包含一个名为System.php
的文件。由于我的文件系统不区分大小写,因此被判断为与system.php
相同,因此被包含在内。