Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP自动加载程序添加命名空间路径_Php_Namespaces_Require Once_Autoloader_Spl Autoloader - Fatal编程技术网

PHP自动加载程序添加命名空间路径

PHP自动加载程序添加命名空间路径,php,namespaces,require-once,autoloader,spl-autoloader,Php,Namespaces,Require Once,Autoloader,Spl Autoloader,我的MVC结构如下: - web -- Classes --- Loader.php -- Core --- Controller.php --- Model.php --- View.php --- Bootstrap.php --- DB.php -- Project --- Controllers (folder) --- Models (folder) --- Views (folder) 现在,我为每

我的MVC结构如下:

- web
  -- Classes
    --- Loader.php
  -- Core
    --- Controller.php
    --- Model.php
    --- View.php
    --- Bootstrap.php
    --- DB.php
  -- Project
    --- Controllers (folder)
    --- Models (folder)
    --- Views (folder)
现在,我为每个节点指定了名称空间。比如我有

    namespace Classes; //for Loader.php
    namespace Core; //For Controller.php, Model.php etc...
    namespace Project\Controllers; //For Controllers inside Controllers folder etc...
我的自动加载器如下所示:

public static function Autoloader2($className) {
    $className = explode('\\', $className);
    $class = array_pop($className);
    $namespace = implode(DIRECTORY_SEPARATOR, $className);
    $file = $namespace . DIRECTORY_SEPARATOR . str_replace('_', DIRECTORY_SEPARATOR, $class) . '.php';

   require $file;
}
我的main index.php使用

    spl_autoload_register( array('Loader', 'Autoloader2') );
    $app = new Core\Bootstrap();
当我打开localhost/web时/ 我得到以下错误:

  Warning: require(Core/Project/Controllers/Index.php): failed to open stream: N
似乎它在请求的文件前加了Core/前缀。php位于项目/控制器内部,而不是核心/项目/控制器。如果我试图删除

  //namespace Core; from Bootstrap.php i get the following error
  Fatal error: Class 'Core\Bootstrap' not found 

请帮助

您应该使用
$app=\Core\Bootstrap()


路径前的斜杠很重要,如果没有斜杠,命名空间路径将彼此相对。

那么,在执行new Core\Bootstrap()时,您会得到Index.php require警告?正确吗?是的,它在名称空间中附加了Core/这就是为什么它找不到它,因为Index.php在Project/Controllers/中,而不是在Core/Project/Controllers中。您是否对文件使用任何“use”语句,例如use Core\Bootstrap;然后$app=new Bootstrap();我刚刚在所有的mand错误消息中添加了use语句,这意味着我需要用use填充所有类,看看这是否有效。我想这就是问题所在。我做了同样的事情。我将use语句添加到所有语句中,现在显示了标题。我是新手,不太了解“use”语句suse语句是不好的做法,因为您将所有内容都带到全局命名空间中,然后冒名称冲突的风险。其他程序员调试您的代码也比较困难,因为很难跟踪类等。现在除了视图之外,一切都正常了。在我的Core\View.php中,我有$header=newproject\Views\index\header();这显示了标题,也给出了一个错误,说找不到Project\Views\index\header.php我的加载程序假设要更改为/I确实经常使用“use”,我不认为这是一个坏习惯,我见过很多框架使用它们。它当然不如Java或.NET方式好!