PHP 命名空间与需要

fre*_*dbe 5 php symfony

快速提问,我正在使用 HttpFoundation 组件(Symfony),但我不清楚一些事情。我正在查看的教程显示了此代码

// framework/index.php
require_once __DIR__.'/vendor/autoload.php';

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

$request = Request::createFromGlobals();

$input = $request->get('name', 'World');

$response = new Response(sprintf('Hello %s', htmlspecialchars($input, ENT_QUOTES, 'UTF-8')));

$response->send();
Run Code Online (Sandbox Code Playgroud)

现在,这有效,没问题,但我试图让它在没有“use”关键字的情况下工作,因此包括(php require)请求类本身,然后我找不到一个类,这对我来说太奇怪了,当我使用 use 关键字并使用命名空间时,找到了类,但是当我包含类文件本身时,我得到了一个未找到的类..

所以为了说明,这将返回一个'找不到类'..

// framework/index.php
require_once __DIR__.'/vendor/autoload.php';
require_once __DIR__.'/vendor/symfony/http-foundation/Request.php';

$request = new Request();
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决这个问题吗?提前致谢!

PS 我已经红色了 use 关键字不包含任何内容,只是声明名称空间或其他内容?所以这对我来说太奇怪了,它适用于用例,因为它甚至不包含文件,当我直接包含文件时,它返回一个“找不到类”......

Phi*_*ipp 5

如果使用use,则为完全限定名称 (fqn) 创建类似于基于文件的别名。因此,如果您使用Symfony\Component\HttpFoundation\Request,则可以编写Request而不是 fqn。如果你不想包含 use 语句,你必须每次都写完整的类名。

// framework/index.php
require_once __DIR__.'/vendor/autoload.php';

$request = \Symfony\Component\HttpFoundation\Request::createFromGlobals();

$input = $request->get('name', 'World');

$response = new \Symfony\Component\HttpFoundation\Response(sprintf('Hello %s', htmlspecialchars($input, ENT_QUOTES, 'UTF-8')));

$response->send();
Run Code Online (Sandbox Code Playgroud)

-use语句本身与类加载无关。类加载是由自动加载器完成的,它从类名中解析包含的 php 类的文件名。

要清除您的问题代码:

// framework/index.php
require_once __DIR__.'/vendor/autoload.php';
require_once __DIR__.'/vendor/symfony/http-foundation/Request.php';

$request = new Request();
Run Code Online (Sandbox Code Playgroud)

Class \Symfony\Component\HttpFoundation\Request 被包含在内,但是你想创建一个新的 \Request 类的对象,这是不同的东西。