文件说
在大多数情况下,所有 PHP 变量只有一个作用域。这个单一的范围还包括包含和必需的文件。
在我的示例中,我在控制器/index.php文件中收到错误/警告
注意:未定义变量:app 在第 4 行
解释为什么会这样?该变量$task工作正常。
ps 如果您在文件中声明global $app;或将其替换Route::load . . .
为require 'controllers/index.php';一切正常。
索引.php
require 'core/bootstrap.php';
Router::load('routes.php')
->direct(Request::uri(), Request::method()); //require controllers/index.php
引导程序.php
$app = [];
$app['config'] = require 'config.php';
require 'Request.php';
require 'Router.php';
require 'database/Connection.php';
require 'database/QueryBuilder.php';
$app['database'] = new QueryBuilder(
Connection::make($app['config']['database'])
);
控制器/index.php
// global $app;
$tasks = $app['database']->selectAll('tasks'); //4 строка
require 'public/index.view.php';
公共/index.view.php
<?php require 'partials/header.php'; ?>
<h1>Home page</h1>
<?php if (!is_null($tasks)) : ?>
<ul>
<?php foreach ($tasks as $t) : ?>
<li><?= $t->text; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<?php require 'partials/footer.php'; ?>
路由器.php
class Router {
protected $routes = [];
public static function load($file)
{
$router = new static;
require $file;
return $router;
}
public function define($routes)
{
$this->routes = $routes;
}
public function direct($uri, $requestMethod)
{
if (array_key_exists($uri, $this->routes[$requestMethod])) {
require $this->routes[$requestMethod][$uri];
} else {
require 'public/404.php';
}
}
}
$app在全局范围内声明,并且您在加载类函数中进行 require。此 require 中的所有内容都获得了类的范围,因此$app在那里不可见。您可以将任何包含或要求视为在所需位置手动插入一段代码。在这里,手动将代码
$task = $app...插入到加载函数中。您是否了解内部负载是一个完全不同的变量$app,与全局变量无关$app?require 也会发生同样的事情。