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