现代PHP书籍-关于“的澄清”;使用「;及;要求;使用命名空间时

现代PHP书籍-关于“的澄清”;使用「;及;要求;使用命名空间时,php,namespaces,Php,Namespaces,我目前正在阅读,我有点困惑,因为在第2章中,作者谈到了名称空间,当他提到“使用”时,他一直在说import。事实上,他声明如下 提示 您应该使用顶部的use关键字导入代码 在打开之后,如果您使用autoloader,例如composer,则不需要导入或需要PHP文件(您只加载autoloader文件,它实际上为您做了所有这些)。如果没有自动加载程序,则必须使用import或require加载文件 然后,在加载文件后,您可以使用use语句对名称间隔的项(例如类、接口或特征)执行实际操作。是的,您是

我目前正在阅读,我有点困惑,因为在第2章中,作者谈到了名称空间,当他提到“使用”时,他一直在说import。事实上,他声明如下

提示
您应该使用顶部的
use
关键字导入代码
在打开
之后,如果您使用autoloader,例如composer,则不需要导入
需要
PHP文件(您只加载autoloader文件,它实际上为您做了所有这些)。如果没有自动加载程序,则必须使用
import
require
加载文件


然后,在加载文件后,您可以使用
use
语句对名称间隔的项(例如类、接口或特征)执行实际操作。

是的,您是正确的。PHP中的
use
关键字只是一个名称空间的别名,因为它与符号链接(在*nix系统上)或快捷方式(在Windows系统上)一样

如果您阅读了关于名称空间的手册,您会发现名称空间可以类似于文件系统,在文件系统中,类/接口/常量/函数名称可以划分为文件夹,以防止名称冲突

如果您阅读了上的手册部分,您将看到,当我们在PHP中提到导入时,实际上意味着创建一个名称到另一个名称的快捷方式(事实上,上面的快捷方式类比取自手册)

这类似于基于unix的文件系统创建指向文件或目录的符号链接的能力

因此,PHP中的
use
关键字虽然令人困惑,但并不试图加载(或
include
)包含名称空间的实际文件,而只是为给定名称空间创建一个别名


在其他语言中,import这个词的用法可能与您在其他语言中的用法非常不同,在其他语言中,import可能意味着加载实际的文件或包,但在PHP中,重要的是要理解导入名称空间与自动加载或包含文件无关。它们在PHP中是两个独立的概念

导入命名空间是为了让您可以在命名空间内将
\fully\qualified\namespace\MyClass
简单地称为
MyClass
,而不必每次都使用FQN(这就是快捷方式类比)

自动加载,用于在代码中使用PHP中的实际类时将其包括在内

因此,这两个概念之间存在着明显的脱节。

既然您在一本书中提到了第2章,我假设您仍在学习PHP,是吗

use
的用途是将名称空间类缩短为其根,这样,如果您有一些长名称空间类,如

org\shared\axel\web\framework\connection\pipeline\impl\StopExecutionException
需要使用

new org\shared\axel\web\framework\connection\pipeline\impl\StopExecutionException();
您可以使用
use
仅引用根未命名类

use org\shared\axel\web\framework\connection\pipeline\impl\StopExecutionException;
...
throw new StopExecutionException();
请记住,您仍然需要在脚本中包含类的代码,因此您可以使用
include
require
手动包含/要求该类代码,或者注册自动加载器(请参见
spl\u autoload\u register
)。 这样做的目的是定义名称空间如何映射到源代码的目录结构


其他人在这里称为
composer
的是包含自动加载器的包管理器。在这个阶段,我个人认为最好推迟学习,直到你掌握了基本知识。

如果你有一个自动加载器,那么
使用
可以用来提取特征

特征文件 类文件 否则,
use
用于指示要加载给定类或将该类别名为另一个类

Class Foo {

}

use \Foo as Bar;
Class Something extends Bar {
}

如果没有自动加载,您仍然需要要求/包含代码。是的,你说得对。但imho自动加载是当前的方式。请看这里,谢谢大家。我不知道他为什么会这样说,因为他在声明之前只提到过一次
autoloading
,但没有正式的内容。是的,我对PHP相当陌生,但自从我使用Laravel框架以来,我已经接触过autoloading和composer。谢谢你说的对。PHP/Laravel世界中使用了许多新概念。感谢您提供的更多信息,这很有帮助。
Class Bar {
    use \Blah\Foo; // autoloaded
}
Class Foo {

}

use \Foo as Bar;
Class Something extends Bar {
}