require正在工作但require_once不是

时间:2015-09-29 09:51:33

标签: php

routes.php文件     

use MyMVC\Core\Route;

$route = new Route;
$route->add('/', 'HomeController@index');
$route->add('about', 'AboutController@index');
$route->add('contact', 'ContactController@index');

的index.php

<?php
/**
 * Define Constants
 */
define('BASE_PATH', dirname(realpath(__FILE__)));
define('APP_PATH', BASE_PATH . "/app");

/**
 * Including the Composer's autoloader
 */
require_once 'vendor/autoload.php';

/**
 * Load the routes declarations
 */
require_once 'app/routes.php';

/**
 * Bootstrap our application
 */
require_once 'app/init.php';

/**
 * Initialize our beautiful framework
 */
$application = new \MyMVC\Application($route);

composer.json

"autoload" : {
    "psr-4" : {
        "MyMVC\\" : "app/"
    },
    "classmap": [
        "app/Controllers",
        "app/Helpers"
    ],
    "files": ['app/routes.php']  // already removed this line
},

使用require_once时,它会提供undefined variable route error,而如果我只使用require则会显示路由对象。

为什么会这样?

2 个答案:

答案 0 :(得分:1)

所有症状都表明app / routes.php&#39;被包含在其他地方之前。由于它定义了一个变量,如果这样的包含不会发生在全局范围内,那么该变量将在任何地方被调用。

除了使用像Xdebug这样的专用调试器之外,您还可以使用内置工具来诊断问题。例如,您有http://www.spoj.com/problems/PRIME1/来获取给定点中包含的文件的列表。您还可以在&#39; app / routes.php&#39;之上添加get_included_files()。找出它的来源。

关于更新问题和后续评论的注意事项:如果您尝试自动加载文件并自动加载文件,我会说你&#39;我刚回答了你自己的问题。但值得注意的是,自动加载旨在用于函数和类定义。你有一个定义变量的任意代码片段,而且你只是学习 - 因为变量在自动加载器方法中变为局部变量,所以它没有多大用处。

答案 1 :(得分:1)

仅当文件已从其他文件加载时才会发生此类错误。这就是为什么它不再加载它而你没有获得$ route对象的实例。

E.g,

让我们说吧 file1.php 包含 routes.php

现在,如果您使用:

  1. 需要'routes.php'(它会再次加载相同的文件,即使已经加载

  2. requier_once'rouctions.php'(如果已经加载,它将不加载文件,因为你没有得到$ route变量的实例,这意味着它正在发生