Php 名称空间+;框架&x2B;创作者

Php 名称空间+;框架&x2B;创作者,php,Php,我已经读了很多文章,请继续回答这个问题,可能听起来像是重复的条目,但我没有正确理解它们,所以我期待着一个合理的解释 我正在重新创建一个框架(不是为了实现,只是为了了解框架是如何工作的)。结构如下所示: App App/Core App/Core/Controllers App/Core/Controllers/Home App/Core/Models App/Core/Views App/Libraries App/Libraries/vendor App/Libraries/composer.

我已经读了很多文章,请继续回答这个问题,可能听起来像是重复的条目,但我没有正确理解它们,所以我期待着一个合理的解释

我正在重新创建一个框架(不是为了实现,只是为了了解框架是如何工作的)。结构如下所示:

App
App/Core
App/Core/Controllers
App/Core/Controllers/Home
App/Core/Models
App/Core/Views
App/Libraries
App/Libraries/vendor
App/Libraries/composer.json
App/init.php
index.php
.htaccess
这是我的composer.json文件

{
    "autoload": {
        "psr-4": {
            "App\\": "App"
        }
    }
}
这是我的index.php文件

const CONTROLLERS = 'App/Core/Controllers/';
require_once 'App/init.php';
$time = microtime(true);
new App\Init();
这是我的init.php类

namespace App;

require_once __DIR__ . '/Libraries/vendor/autoload.php';

use App\Controller;

class Init
{

    private $resource;
    private $object;
    private $file;

    const HOME = 'home';

    function __construct()
    {

        $this->resource = empty($_GET) ? array(self::HOME) : self::Uri($_GET['resource']);

        $class = self::Object($this->resource);

        new App\Controller\$class;

    }

    private function Uri($_resource)
    {

        if($_resource != ucfirst(self::HOME))
        {
            $this->resource = explode('/', filter_var(rtrim($_resource, '/'), FILTER_SANITIZE_URL));
        }

        return $this->resource;

    }

    private function Object($_resource)
    {
        $this->object = ucfirst($_resource[0]);
        $this->file =  CONTROLLERS . $this->object . '.php';
        if(file_exists($this->file))
        {
            require $this->file;

            return $this->object;
        }
        else
        {
            echo 'Nope';
        }
    }
}
namespace App\Controller;

class Home
{
    public function __construct()
    {
        echo '<br>I am at home';
    }
}
这是我的Home.php类

namespace App;

require_once __DIR__ . '/Libraries/vendor/autoload.php';

use App\Controller;

class Init
{

    private $resource;
    private $object;
    private $file;

    const HOME = 'home';

    function __construct()
    {

        $this->resource = empty($_GET) ? array(self::HOME) : self::Uri($_GET['resource']);

        $class = self::Object($this->resource);

        new App\Controller\$class;

    }

    private function Uri($_resource)
    {

        if($_resource != ucfirst(self::HOME))
        {
            $this->resource = explode('/', filter_var(rtrim($_resource, '/'), FILTER_SANITIZE_URL));
        }

        return $this->resource;

    }

    private function Object($_resource)
    {
        $this->object = ucfirst($_resource[0]);
        $this->file =  CONTROLLERS . $this->object . '.php';
        if(file_exists($this->file))
        {
            require $this->file;

            return $this->object;
        }
        else
        {
            echo 'Nope';
        }
    }
}
namespace App\Controller;

class Home
{
    public function __construct()
    {
        echo '<br>I am at home';
    }
}
namespace-App\Controller;
班级之家
{
公共函数构造()
{
回声“我在家”;
}
}
我得到的错误是:

分析错误:语法错误,意外的“$class”(T_变量),需要标识符(T_字符串)

请帮帮我,让我疯狂地试图理解为什么我要使用新的App\Controller\Home;它可以工作,但是如果我使用$class,它就会崩溃。我甚至尝试了新的App\Controller{$class},但没有成功

无论如何,我希望得到一个明确的答案,因为可能很多人都会经历同样的问题


提前感谢大家

在使用变量之前,您需要先构造变量:

$controller = "App\\Controller\\{$class}";
new $controller();

另见@miken32,我已经浏览了那篇帖子,没有答案。也许我错过了,你能指出答案吗?
App\Controller\{$class}
?@Cid我得到了解析错误:语法错误,意外的“{”,期望标识符(T_字符串),顺便问一下,为什么不矫揉造作地使用
new…
?不走运,我得到了:致命错误:未捕获错误:class'App\Controller\{Home}'未找到抱歉,需要转义反斜杠,已更新您做到了,我是否应该使用类似目录分隔符的东西,如str\u replace('\\',目录分隔符,$class);?不,这是用于文件系统路径:)