在子文件夹中使用spl_autoload_register进行PHP自动加载

时间:2012-05-07 09:46:23

标签: php namespaces spl

我的目录结构如下所示

> 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();
?>

到目前为止它工作正常,它渲染模板并填充模板变量,

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

  

致命错误:找不到类'classes \ template_vars'   第47行/home/aamir/www/CMS/classes/template.php

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

2 个答案:

答案 0 :(得分:3)

你必须使用一个技巧:

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

在您加入../config.php

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

内部config.php

答案 1 :(得分: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上的namespace关键字,则错误消失。

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

如果没有指定命名空间,spl_autoload_register();函数也会查找当前目录(root\)并查找名为sampleClass.php的类,但是如果指定了命名空间与我们示例中的root类似,spl_autoload_register();函数将尝试加载位于“root \ root”之类的文件。

所以在这一点上你有两个解决方案:

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

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

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

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

这就是全部