如何在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();
我知道我可以使用require
或include
关键字来包含一个类的文件:
require("One\Classes\Resp.php"); // I've set the include_path correctly already ";C:\xampp\htdocs". It works. $a = new Resp();
但是我想导入类而不使用require
或include
。 我想了解如何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自动加载器,自动加载器也不得不使用include
或require
。
使用关键字的目的:
考虑一个你有两个同名的类的例子, 你会发现这很奇怪,但是当你使用一个大的MVC结构时,就会发生。 所以如果你有两个同名的类,把它们放在不同的名字空间中。 现在考虑什么时候你的自动加载器正在加载这两个类(按require
),你将要使用类的对象。 在这种情况下,编译器会混淆在两个类中加载哪个类对象。 为了帮助编译器做出决定,可以使用use
语句,以便决定使用哪一个。
现在主要的框架使用include
或require
通过composer
和psr
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'