我有一个类文件Resp
。 路径是:
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) 作曲家
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
语句获取与类执行作为一个参数,这可以帮助您加载在运行时的类上飞的,当需要。
请参考此答案更多地了解类自动加载。
不要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
你必须包括/反正需要的类,否则PHP不知道的命名空间。
你没必要必须这样做,在同一个文件,但。 您可以在例如引导文件,做到这一点。 (或使用自动加载磁带机,但实际上不是的话题)
问题是最有可能的,你需要使用自动加载程序,将采取类(在这种情况下,“\”符)的名称,并将其映射到一个目录结构。
你可以看看这篇文章的自动加载 PHP的功能。 有此类型的框架已经功能的许多实现。
其实我已经实施过一个。 这里有一个链接 。
我同意绿,Symfony的需要的命名空间,那么为什么不使用他们?
这是一个例子控制器类的启动方式:
命名空间的Acme \ DemoBundle \控制器;
使用的Symfony \捆绑\ FrameworkBundle \控制器\控制器;
类WelcomeController扩展控制器{...}
在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'
使用关键字“使用”是缩短命名空间的文字。 你既可以用混淆和不使用它。 如果没有走样,你必须使用完整的命名空间的最后一部分。
<?php
use foo\bar\lastPart;
$obj=new lastPart\AnyClass(); //If there's not the line above, a fatal error will be encountered.
?>
命名空间使用的路径限定于含有类例如一个特定的文件
namespace album/className;
class className{
//enter class properties and methods here
}
然后,您可以通过使用关键字“使用”这样的包含这个特定类到另一个PHP文件:
use album/className;
class album extends classname {
//enter class properties and methods
}
注意:不要使用路径包含类是实现了文件,扩展使用实例化一个对象,但只使用了命名空间。