如何关键字在PHP中“使用”的工作,我可以导入类呢?如何关键字在PHP中“使用”的工作,我可以导入类

2019-05-17 13:09发布

我有一个类文件Resp 。 路径是:

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

Answer 1:

use不包含任何东西。 它只是导入指定命名空间(或类),以当前范围

如果你想在类被自动加载-了解自动加载



Answer 2:

不,你不能导入类与use关键字。 你必须使用include / require声明。 即使你使用PHP自动加载器,自动加载磁带机依然会为使用includerequire内部。

使用关键字的目的:

考虑以下情况:你有两个类具有相同名称的情况下; 你会觉得奇怪,但是当你有一个大的MVC结构工作,它发生。 所以,如果你有两个类具有相同的名称,把它们放在不同的命名空间。 当你的自动加载器加载这两个类(用做现在考虑require ),而您将要使用类的对象。 在这种情况下,编译器会感到困惑哪一类物体的两个中加载。 为了帮助编译器做出决定,你可以使用use语句,以便它可以让哪一个是将要使用的决定。

目前主要框架都使用includerequire通过composerpsr

1) 作曲家

2) PSR-4自动加载机

通过他们去还可以帮助你。 您也可以使用别名来解决的确切类。 假设你有两个类具有相同的名称,说Mailer有两个不同的命名空间:

namespace SMTP;
class Mailer{}

namespace Mailgun;
class Mailer{}

如果你想在同一时间使用两种梅勒类,那么你可以使用别名。

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

后来在你的代码,如果你想访问这些类对象,那么你可以做到以下几点:

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

它会引用原始类。

有些人可能会感到困惑的是那么的有没有类似的类名则是没有用的use关键字。 那么,你可以使用__autoload($class)功能时,它会自动地称为use语句获取与类执行作为一个参数,这可以帮助您加载在运行时的类上飞的,当需要。

请参考此答案更多地了解类自动加载。



Answer 3:

不要overthink 命名空间是什么。

命名空间基本上是一个的前缀(如在操作系统目录),以确保路径的唯一性。

也只是为了把事情说清楚, 使用的语句没有做任何事情只有你的别名命名空间 ,所以你可以使用快捷键或包括具有相同的名称,但在同一个文件不同的命名空间 的类

例如:

// You can do this at the top of your Class
use Symfony\Component\Debug\Debug;

if ($_SERVER['APP_DEBUG']) {
    // So you can utilize the Debug class it in an elegant way
    Debug::enable();
    // Instead of this ugly one
    // \Symfony\Component\Debug\Debug::enable();
}

如果你想知道PHP命名空间和自动加载(旧的方式以及与作曲家的新方法)是如何工作的,你可以阅读博客文章我只是在这个题目中写道: https://enterprise-level-php.com/十二分之二千零十七/ 25 /的魔法隐藏,自动加载的PHP-文件-使用- composer.html



Answer 4:

你必须包括/反正需要的类,否则PHP不知道的命名空间。
你没必要必须这样做,在同一个文件,但。 您可以在例如引导文件,做到这一点。 (或使用自动加载磁带机,但实际上不是的话题)



Answer 5:

问题是最有可能的,你需要使用自动加载程序,将采取类(在这种情况下,“\”符)的名称,并将其映射到一个目录结构。

你可以看看这篇文章的自动加载 PHP的功能。 有此类型的框架已经功能的许多实现。

其实我已经实施过一个。 这里有一个链接 。



Answer 6:

我同意绿,Symfony的需要的命名空间,那么为什么不使用他们?

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

命名空间的Acme \ DemoBundle \控制器;

使用的Symfony \捆绑\ FrameworkBundle \控制器\控制器;

类WelcomeController扩展控制器{...}



Answer 7:

use关键字是在PHP混淆,并没有导入类。 这确实有助于
1)当你在不同的命名空间同名类
2)避免了一遍又一遍用很长的类名。



Answer 8:

我可以用它来导入类?

你不能那样做,除了上面的例子。 您也可以使用关键字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'


Answer 9:

使用关键字“使用”是缩短命名空间的文字。 你既可以用混淆和不使用它。 如果没有走样,你必须使用完整的命名空间的最后一部分。

<?php
    use foo\bar\lastPart;
    $obj=new lastPart\AnyClass(); //If there's not the line above, a fatal error will be encountered.
?>


Answer 10:

命名空间使用的路径限定于含有类例如一个特定的文件

namespace album/className; 

class className{
//enter class properties and methods here
}

然后,您可以通过使用关键字“使用”这样的包含这个特定类到另一个PHP文件:

use album/className;

class album extends classname {
//enter class properties and methods
}

注意:不要使用路径包含类是实现了文件,扩展使用实例化一个对象,但只使用了命名空间。



文章来源: How does the keyword “use” work in PHP and can I import classes with it?