关键字“use”在PHP中是如何工作的,我可以用它来导入类吗?

2022-08-30 06:39:13

我有一个带有类的文件。路径为:Resp

C:\xampp\htdocs\One\Classes\Resp.php

我在这个目录中有一个文件:index.php

C:\xampp\htdocs\Two\Http\index.php

在此文件中,我想实例化一个类。index.phpResp

$a = new Resp();

我知道我可以使用 或 关键字将文件包含在类中:requireinclude

require("One\Classes\Resp.php");       // I've set the include_path correctly already ";C:\xampp\htdocs". It works.
$a = new Resp();

但是我想在不使用 或 的情况下导入类。我试图了解关键字的工作原理。我尝试了这些步骤,但没有任何效果:requireincludeuse

use One\Classes\Resp;
use xampp\htdocs\One\Classes\Resp;
use htdocs\One\Classes\Resp;
use One\Classes;
use htdocs\One\Classes;    /* nothing works */

$a = new Resp();

它说:

Fatal error: Class 'One\Classes\Resp' not found in C:\xampp\htdocs\Two\Http\index.php

关键字如何工作?我可以使用它来导入类吗?use


答案 1

不可以,不能导入带有关键字的类。你必须使用/语句。即使您使用PHP自动加载程序,自动加载程序也必须使用其中之一或在内部使用。useincluderequireincluderequire

使用目的关键字:

考虑一个情况,你有两个同名的类;你会发现它很奇怪,但是当你使用一个大的MVC结构时,它发生了。因此,如果您有两个同名的类,请将它们放在不同的命名空间中。现在考虑一下,当您的自动加载器同时加载这两个类(由 )并且您将要使用类的对象时。在这种情况下,编译器会混淆在两个类对象中加载哪个类对象。为了帮助编译器做出决定,您可以使用该语句,以便它可以决定将用于哪个语句。requireuse

如今,主要框架确实使用或通过和includerequirecomposerpsr

1) 作曲家

2) PSR-4 自动装载机

通过它们可能会进一步帮助你。您还可以使用别名来寻址确切的类。假设您有两个同名的类,例如具有两个不同的命名空间:Mailer

namespace SMTP;
class Mailer{}

namespace Mailgun;
class Mailer{}

如果要同时使用两个 Mailer 类,则可以使用别名。

use SMTP\Mailer as SMTPMailer;
use Mailgun\Mailer as MailgunMailer;

稍后在代码中,如果要访问这些类对象,则可以执行以下操作:

$smtp_mailer = new SMTPMailer;
$mailgun_mailer = new MailgunMailer;

它将引用原始类。

有些人可能会感到困惑,然后没有类似的类名,然后没有使用关键字。好吧,您可以使用函数,当语句与要用作参数的类一起执行时,将自动调用该函数,这可以帮助您在需要时在运行时动态加载类。use__autoload($class)use

请参阅此答案以了解有关类自动加载器的更多信息。


答案 2

use不包括任何内容。它只将指定的命名空间(或类)导入到当前作用域

如果您希望自动加载类 - 请阅读有关自动加载的信息


推荐