2012-02-02 65 views
2

最近下载了一些与我玩的小型网页游戏有关的小型开源项目的代码。试图访问失败和吐出的错误消息:PHP没有在所需文件中声明函数

PHP Fatal error: Call to undefined function v() in /Applications/MAMP/htdocs/infocenter/modules/security_mod.php on line 7

搜索后,我发现,函数V()是一个被称为“system.php”文件,该文件是由一个文件,该文件是所需的被定义由“security_mod.php”文件所要求的文件所要求的错误发生。任何require调用都不会发生错误(并且它们都是'require_once',而不是'include')。

这是system.php文件的全部:

<?php 
function v($a, $i) 
{ 
    return isset($a[$i]) ? $a[$i] : null; 
} 
?> 

这是抛出错误 'security_mod.php' 功能(也包括需要调用):

<?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"); 
+0

你能说明'system.php'是如何精确需要的吗? – 2012-02-02 18:42:33

回答

1

发现的问题:System.php文件被成功列入不一样的人在下载的代码。由于base_mod.php只提供了一个文件名,而不是一个路径,PHP首先检查了我的include_path指定的目录,结果证明这个目录包含一个名为System.php的文件。由于我的文件系统不区分大小写,因此被认为与system.php相同,因此被包括在内。