我的目录结构如下所示
> 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,但是从内部管理面板中它不起作用
答案 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()
函数检查父目录。
这就是全部