如何在PHP中使用关键字“use”,并且可以使用它导入类?

我有一个类Resp的文件。 path是:

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

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

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

在这个index.php文件中,我想实例化一个类Resp

 $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(); 

但是我想导入类而不使用requireinclude 。 我想了解如何use关键字的作品。 我试过这些步骤,但没有任何工作:

 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如何工作? 我可以用它来导入类吗?

use不包括任何东西。 它只是将指定的名称空间(或类)导入当前作用域

如果你想要自动加载类 – 阅读有关自动加载

不,您不能use关键字导入类。 你必须使用include / require语句。 即使你使用PHP自动加载器,自动加载器也不得不使用includerequire

使用关键字的目的:

考虑一个你有两个同名的类的例子, 你会发现这很奇怪,但是当你使用一个大的MVC结构时,就会发生。 所以如果你有两个同名的类,把它们放在不同的名字空间中。 现在考虑什么时候你的自动加载器正在加载这两个类(按require ),你将要使用类的对象。 在这种情况下,编译器会混淆在两个类中加载哪个类对象。 为了帮助编译器做出决定,可以使用use语句,以便决定使用哪一个。

现在主要的框架使用includerequire通过composerpsr

1) composer php

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; 

它会引用原来的类。

无论如何,你将不得不包含/需要类,否则PHP将不知道名称空间。
尽pipe你不需要在同一个文件中执行它。 例如,您可以在引导文件中执行此操作。 (或使用自动加载器,但这不是实际的话题)

这个问题很可能是你需要使用一个自动加载器来取得这个类的名字(在这种情况下,用'\'来分隔)并将它映射到一个目录结构。

你可以看看这篇关于PHP的自动加载function的文章。 这种types的function在框架中已经有很多实现。

我以前实际上已经实现了一个。 这是一个链接 。

我同意格林,Symfony需要命名空间,所以为什么不使用它们?

这是一个示例控制器类的启动方式:

命名空间Acme \ DemoBundle \ Controller;

使用Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller;

class WelcomeController extends Controller {…}

use关键字用于PHP中的别名,并且不导入类。 这真的有帮助
1)在不同的名称空间中有相同名称的类时
2)避免一次又一次地使用真正的长名称。

我可以用它来导入类吗?

除了上面的例子,你不能这样做。 你也可以使用类内的关键字use来导入特征 ,如下所示:

 trait Stuff { private $baz = 'baz'; public function bar() { return $this->baz; } } class Cls { use Stuff; // import traits like this } $foo = new Cls; echo $foo->bar(); // spits out 'baz'