我目前正在阅读Modern PHP Book并且我很困惑,因为在第2章中,作者谈到了Namespace,当他提到"使用" 。事实上,他陈述了以下内容......
TIP
您应该导入顶部带有use
关键字的代码 每个PHP文件,在打开<?php
标记后立即或......
我理解Namespace的方式是use
关键字引用了类的命名空间,但它没有导入它,您仍然需要使用require
或include
来导入实际的类,对吗?
当我说在没有自动加载的情况下使用命名空间时,我需要使用require
或include
来导入您的类吗?
由于
答案 0 :(得分:3)
如果您使用自动加载器,例如composer,则不需要import
或require
个PHP文件(您只需加载自动加载器文件,它实际上可以为您完成所有这些操作)。如果您没有自动加载器,则必须使用import
或require
加载文件。
然后,在加载FILE之后,您可以使用use
语句对名称间隔的项目(例如类,接口或特征)进行实际操作。
答案 1 :(得分:2)
是的,你是对的。 PHP中的use
关键字只是别名命名空间,因为它执行的是符号链接(在* nix系统上)或快捷方式(在Windows系统上)会。
如果您阅读有关PHP namespace basics的手册,您会发现命名空间可以类似于文件系统,其中类/接口/常量/函数名称可以分成文件夹以防止名称冲突
如果您阅读Namespace Importing上的手册部分,那么当我们在PHP中引用导入时,它实际上意味着创建一个名称与另一个名称的快捷方式(实际上,上面的快捷方式类似于手册)......
这类似于基于unix的文件系统创建指向文件或目录的符号链接的能力。
因此,虽然令人困惑,但PHP中的use
关键字不会尝试加载(或include
)包含命名空间的实际文件,而只是为给定的命名空间创建别名。
导入一词的使用方式可能与您在其他语言中使用的方式非常不同,其中 import 可能意味着加载实际的文件或包,但在PHP中,了解导入命名空间与自动加载或包括文件无关,这一点很重要。它们是PHP中的两个独立概念。
导入命名空间是为了让您可以在命名空间内简单地\fully\qualified\namespace\MyClass
引用MyClass
,而不是每次都必须使用FQN(因此快捷方式类比 )。
自动加载,用于在代码中使用PHP时包含实际的类。
因此,这两个概念之间存在明显的脱节。
答案 2 :(得分:1)
既然你在书中提到了第2章,我会假设你还在学习PHP,是吗?
使用use
是为了将命名空间类缩短到它们的根目录,这样如果你有一些很长的命名空间类,比如
org\shared\axel\web\framework\connection\pipeline\impl\StopExecutionException
需要使用
进行实例化new org\shared\axel\web\framework\connection\pipeline\impl\StopExecutionException();
您可以使用use
仅引用root unnamespaced类
use org\shared\axel\web\framework\connection\pipeline\impl\StopExecutionException;
...
throw new StopExecutionException();
请注意,您仍然需要在脚本中包含类的代码,因此您可以使用include
或require
手动包含/要求,或注册自动加载器(请参阅spl_autoload_register
)。
这样做是为了定义命名空间如何映射到源代码的目录结构。
其他人在此称为composer
的是包管理器,其中包含自动加载器。在这个阶段,我个人认为在你掌握基础知识之前推迟学习是最好的。
答案 3 :(得分:1)
如果您有自动加载器,则可以使用use
来拉出特征
namespace Blah;
Trait Foo {
protected $somevar;
}
Class Bar {
use \Blah\Foo; // autoloaded
}
否则,use
用于表示您要加载给定的类或将该类别别加载为另一个
Class Foo {
}
use \Foo as Bar;
Class Something extends Bar {
}