现代PHP书籍 - 关于"使用"的澄清和"要求"使用命名空间时

时间:2015-11-03 14:36:35

标签: php namespaces

我目前正在阅读Modern PHP Book并且我很困惑,因为在第2章中,作者谈到了Namespace,当他提到"使用" 。事实上,他陈述了以下内容......

  

TIP
  您应该导入顶部带有use关键字的代码   每个PHP文件,在打开<?php标记后立即或......

我理解Namespace的方式是use关键字引用了类的命名空间,但它没有导入它,您仍然需要使用requireinclude来导入实际的类,对吗?

当我说在没有自动加载的情况下使用命名空间时,我需要使用requireinclude来导入您的类吗?

由于

4 个答案:

答案 0 :(得分:3)

如果您使用自动加载器,例如composer,则不需要importrequire个PHP文件(您只需加载自动加载器文件,它实际上可以为您完成所有这些操作)。如果您没有自动加载器,则必须使用importrequire加载文件。

然后,在加载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();

请注意,您仍然需要在脚本中包含类的代码,因此您可以使用includerequire手动包含/要求,或注册自动加载器(请参阅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 {
}