4

我的目录结构如下所示

> Root
> -Admin // admin area
> --index.php // admin landing page, it includes ../config.php
> -classes // all classes
> ---template.php 
> ---template_vars.php // this file is used inside template.php as $template_vars = new tamplate_vars();
> -templates // all templates in different folder
> --template1
> -index.php
> -config.php

在我用过的 config.php 文件中

<?php
.... // some other php code
spl_autoload_register(NULL, FALSE);
spl_autoload_extensions('.php');
spl_autoload_register();

classes\template::setTemplate('template/template1');
classes\template::setMaster('master');
 .... // some other php code
?>

我已经设置了正确的命名空间(仅在类中),并且在我的根目录下的 index.php 中我访问了这些类

<?php 

require 'config.php';
$news_array = array('news1', 'news1'); // coming from database

$indexTemplate = new \classes\template('index');
$indexTemplate->news_list = $news_array; // news_list variable inside index template is magically created and is the object of template_vars class
$indexTemplate->render();
?>

到目前为止它工作完美,它呈现模板并填充模板变量,

但是当我在管理文件夹中打开索引文件时,它会出现以下错误

致命错误:在第 47 行的 /home/aamir/www/CMS/classes/template.php 中找不到类“classes\template_vars”

任何想法如何解决这个问题。它适用于root,但从管理面板内部它不起作用

4

2 回答 2

5

你必须为此使用一个技巧:

set_include_path(get_include_path() . PATH_SEPARATOR . '../');

包括之前../config.php OR

set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__ . '/');

里面config.php

于 2012-05-07T09:51:42.453 回答
2

我遇到了同样的问题(在 Windows 上),我想我可以解释一下。

例如,让我们采用两个简单的脚本,第一个在namespace名为root的目录中的调用中创建一个类root

- root\sampleClass.php

namespace root;

class sampleClass
{
    public function __construct()
    {
        echo __CLASS__;
    }

    public function getNameSpace()
    {
        return __NAMESPACE__;
    }
}

第二个脚本位于此处root\index.php,仅包含这两行:

spl_autoload_register();
$o = new sampleClass;

那么如果你运行这个root\index.php脚本,你会得到一个像这样的致命错误:

( ! ) SCREAM: Error suppression ignored for
( ! ) Fatal error: spl_autoload(): Class sampleClass could not be loaded in C:\wamp\www\root\test.php on line 4

如果您删除 上的命名空间关键字root\sampleClass.php,错误就会消失。

所以我不会对核心 php 的行为做出任何结论,因为我不是 php 核心开发人员,但会发生这样的事情:

如果您没有指定命名空间,该spl_autoload_register();函数还将在当前目录(即root\)中查找并找到被调用的类,sampleClass.php但如果您root在我们的示例中指定一个命名空间,该spl_autoload_register();函数将尝试加载位于某个位置的文件,例如“root\根”。

所以此时你有两个解决方案:

1)首先不正确的是创建一个名为的子目录root,其中还包含sampleClass.php

2)index.php第二个更好的是在脚本中添加一种技巧:

set_include_path(get_include_path().PATH_SEPARATOR.realpath('..'));

这将告诉spl_autoload_register()函数检查父目录。

就这样

于 2012-09-23T18:44:14.023 回答