0

我正在尝试使用专有 mvc 处理项目,我们有一个名为 global.php 的文件,其中包含与此类似的代码...

<?php
session_start();

require('config/config.php');
require('classes/pdo_extender.php');
require('classes/mainClass.php');
require('classes/utilities.php');

$mainClass = new mainClass;
?>

然后我们在根目录中有一个页面,其中有以下代码

<?php 
require_once($_SERVER['DOCUMENT_ROOT'].'/globals/global.php');
$mainClass->init();
?>

init 函数中的代码仅包含一个基于当前查看页面名称的文件...

public function init() {
    $section=explode("/",$_SERVER['SCRIPT_NAME']);
    $section=explode(".",$section[count($section)-1]);
    include("controllers/".$section[0].".php");
}

假设我们在根 login.php 中,它包含 global.php 并调用 init 函数,而我不必重新声明 $mainClass,因此它包含 controllers/login.php 但现在在此页面上我必须重新声明 $mainClass = 新主类;

有没有办法让init函数中包含的文件仍然可以访问global.php中设置的初始$mainClass?

编辑:除了接受之外,我发现的另一个解决方案如下:

public function init() {
    $section=explode("/",$_SERVER['SCRIPT_NAME']);
    $section=explode(".",$section[count($section)-1]);
    $mainClass= $this;
    include("controllers/".$section[0].".php");
}
4

1 回答 1

1

我以前也有过这样的事情。现在的问题是该函数中包含的文件继承了该函数的范围,因此它们将无法按照您的意愿在全局范围内访问。一个可能的解决方案是使用 te 函数来确定文件名和路径,然后将它们返回为一个排序数组或一个字符串(如果它只有一个)。然后在全局范围内执行函数之外的包含。

public function init() {
    $section=explode("/",$_SERVER['SCRIPT_NAME']);
    $section=explode(".",$section[count($section)-1]);
    return "controllers/".$section[0].".php";
}

<?php 
require_once($_SERVER['DOCUMENT_ROOT'].'/globals/global.php');
$file = $mainClass->init();
include($file);

// now the file is in the global include tree along with global.php 
// allowing the file to have access to w/e it is you have in there.
?>
于 2012-05-18T15:20:29.903 回答