声明的对象不在include中

时间:2012-05-18 15:07:16

标签: php oop

我正在尝试使用专有的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");
}

所以说我们在root.np根目录下,它包含了global.php并调用了init函数,我不得不重新声明$ mainClass,所以它然后包含controllers / login.php但是现在我必须在这个页面上redeclare $ mainClass = new 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");
}

1 个答案:

答案 0 :(得分:1)

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

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.
?>