我正在尝试使用phpBB3(论坛应用)和ZF2。为此,我必须包含phpBB3中的文件。从理论上讲,这很简单:
include('/path/to/phpbb3/common.php');
$user->session_begin(); //$user is defined in common.php file
在common.php中定义了很多全局变量,之后需要一些使用这些全局变量的文件。 在ZF2中简单地包含common.php是行不通的,因为全局变量的范围不会超过所需的文件,所以我尝试了一个小技巧:
//in Application/Forum/Service
public function callForumAPI(){
$zf_dir = getcwd();
chdir('/var/www/html/phpBB3');
include('common.php');
$user->session_begin();
chdir($zf_dir);
}
在这种情况下,全局变量的范围都没有跨越所需的文件,因此所有全局变量都在这些文件中为NULL。 我怎么能解决这个问题?
答案 0 :(得分:1)
我考虑了两个主要问题:
<强> 1。正在加载资源
我不知道你是否改变了phpBB3的代码,因为如果你不这样做,你的问题就是其他问题。
Phpbb3,就像许多系统一样,不允许你直接访问任何文件,你必须通过index.php。正如你在common.php中看到的那样
if (!defined('IN_PHPBB'))
{
exit;
}
IN_PHPBB在index.php中定义,因此您只需使用
即可另外,common.php和其他文件使用$ phpbb_root_path,它在index.php中定义。 所以,至少,当你要包括common.php时,你需要
$zf_dir = getcwd();
chdir('/var/www/html/phpBB3');
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
include('common.php');
...
chdir($zf_dir);
可能还有其他一些你需要注意的事情。
<强> 2。可变范围
另外,考虑到在PHP中,就像在几乎每种语言中一样,在函数内声明的变量被认为是本地的,并且在该函数之外将是未定义的。所以可以肯定的是,如果你在callForumAPI()中做到这一点,你不会在外面有任何变量,而且,取决于你在做什么,包括......它实际上可能在函数内部,无论你是否注意到它因为ZF2是一个具有复杂的非obvius架构的框架。
因此,一旦加载文件,我建议使用ZF2服务管理器存储所有变量和对象,而不是在应用程序中使用。这是一个很好的衡量标准,即使你不需要它,因为这样你可以尽可能地集成所有东西,重要的是最小化和本地化访问phpbb3,因为它不是一个库,维护可能是棘手的,所以如果每个都在同一个文件中,然后你通过服务管理器创建自己的内部api,它将更加封装和更好。我假设你已经知道如何做到这一点,如果你不这样做,请告诉我。
试试这个,并告诉我它是否足够或我们需要更多的研究